Initial Woodpecker CI setup
This commit is contained in:
@@ -0,0 +1,24 @@
|
|||||||
|
# ============================================================
|
||||||
|
# Woodpecker CI — environment variables
|
||||||
|
# Copy to .env and fill in all values before starting
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# --- Gitea OAuth2 app ---
|
||||||
|
# Create at: https://<your-gitea>/user/settings/applications
|
||||||
|
# Redirect URI: https://pecker.smulders.online/authorize
|
||||||
|
WOODPECKER_GITEA_CLIENT=
|
||||||
|
WOODPECKER_GITEA_SECRET=
|
||||||
|
|
||||||
|
# URL of your Gitea instance (no trailing slash)
|
||||||
|
WOODPECKER_GITEA_URL=https://git.smulders.online
|
||||||
|
|
||||||
|
# Shared secret between server and agent — generate with:
|
||||||
|
# openssl rand -hex 32
|
||||||
|
WOODPECKER_AGENT_SECRET=
|
||||||
|
|
||||||
|
# Public URL of this Woodpecker instance
|
||||||
|
WOODPECKER_HOST=https://pecker.smulders.online
|
||||||
|
|
||||||
|
# Gitea usernames allowed to use Woodpecker (comma-separated)
|
||||||
|
# Leave empty to allow all users on the Gitea instance
|
||||||
|
WOODPECKER_ADMIN=stefan
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.env
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# Woodpecker CI
|
||||||
|
|
||||||
|
Woodpecker CI met Gitea OAuth2, Traefik reverse proxy, en een lokale Docker-agent.
|
||||||
|
|
||||||
|
## Eerste keer opstarten
|
||||||
|
|
||||||
|
### 1. Gitea OAuth2 applicatie aanmaken
|
||||||
|
|
||||||
|
Ga naar `https://<jouw-gitea>/user/settings/applications` en maak een nieuwe OAuth2 App:
|
||||||
|
|
||||||
|
- **Application name:** Woodpecker CI
|
||||||
|
- **Redirect URI:** `https://pecker.smulders.online/authorize`
|
||||||
|
|
||||||
|
Noteer de **Client ID** en **Client Secret**.
|
||||||
|
|
||||||
|
### 2. .env aanmaken
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Vul in:
|
||||||
|
|
||||||
|
| Variabele | Waarde |
|
||||||
|
|---|---|
|
||||||
|
| `WOODPECKER_GITEA_CLIENT` | Client ID uit stap 1 |
|
||||||
|
| `WOODPECKER_GITEA_SECRET` | Client Secret uit stap 1 |
|
||||||
|
| `WOODPECKER_GITEA_URL` | URL van je Gitea instance |
|
||||||
|
| `WOODPECKER_AGENT_SECRET` | `openssl rand -hex 32` |
|
||||||
|
| `WOODPECKER_HOST` | `https://pecker.smulders.online` |
|
||||||
|
| `WOODPECKER_ADMIN` | Je Gitea gebruikersnaam |
|
||||||
|
|
||||||
|
### 3. Starten
|
||||||
|
|
||||||
|
Via Portainer: importeer de stack en wijs de `.env` toe.
|
||||||
|
|
||||||
|
Of via CLI:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verificatie
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose logs -f woodpecker-server
|
||||||
|
```
|
||||||
|
|
||||||
|
Woodpecker is bereikbaar op `https://pecker.smulders.online`.
|
||||||
|
|
||||||
|
## Architectuur
|
||||||
|
|
||||||
|
```
|
||||||
|
Internet
|
||||||
|
└── Traefik (traefik-proxy network)
|
||||||
|
└── woodpecker-server :8000 (UI + API)
|
||||||
|
└── woodpecker-agent (woodpecker-internal network)
|
||||||
|
└── Docker socket (pipeline containers)
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Server** zit op twee netwerken: `traefik-proxy` (extern) en `woodpecker-internal` (intern naar agent)
|
||||||
|
- **Agent** zit alleen op `woodpecker-internal` — niet direct bereikbaar van buiten
|
||||||
|
- Agent communiceert met server via gRPC op poort `9000`
|
||||||
|
|
||||||
|
## Authentik toevoegen (later)
|
||||||
|
|
||||||
|
Voeg aan de server-labels toe:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- "traefik.http.routers.woodpecker.middlewares=authentik@docker"
|
||||||
|
```
|
||||||
|
|
||||||
|
En zorg dat de Authentik forward-auth middleware beschikbaar is in Traefik.
|
||||||
|
|
||||||
|
## Pipeline voorbeeld
|
||||||
|
|
||||||
|
Maak `.woodpecker.yml` in een Gitea-repo:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: python:3.12-slim
|
||||||
|
commands:
|
||||||
|
- pip install -r requirements.txt
|
||||||
|
- python -m pytest
|
||||||
|
```
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
services:
|
||||||
|
|
||||||
|
woodpecker-server:
|
||||||
|
image: woodpeckerci/woodpecker-server:latest
|
||||||
|
container_name: woodpecker-server
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- traefik-proxy
|
||||||
|
- woodpecker-internal
|
||||||
|
volumes:
|
||||||
|
- woodpecker-server-data:/var/lib/woodpecker
|
||||||
|
environment:
|
||||||
|
WOODPECKER_OPEN: "false"
|
||||||
|
WOODPECKER_GITEA: "true"
|
||||||
|
WOODPECKER_GITEA_URL: ${WOODPECKER_GITEA_URL}
|
||||||
|
WOODPECKER_GITEA_CLIENT: ${WOODPECKER_GITEA_CLIENT}
|
||||||
|
WOODPECKER_GITEA_SECRET: ${WOODPECKER_GITEA_SECRET}
|
||||||
|
WOODPECKER_HOST: ${WOODPECKER_HOST}
|
||||||
|
WOODPECKER_AGENT_SECRET: ${WOODPECKER_AGENT_SECRET}
|
||||||
|
WOODPECKER_ADMIN: ${WOODPECKER_ADMIN}
|
||||||
|
WOODPECKER_LOG_LEVEL: info
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.docker.network=traefik-proxy"
|
||||||
|
|
||||||
|
# Router
|
||||||
|
- "traefik.http.routers.woodpecker.rule=Host(`pecker.smulders.online`)"
|
||||||
|
- "traefik.http.routers.woodpecker.entrypoints=websecure"
|
||||||
|
- "traefik.http.routers.woodpecker.tls=true"
|
||||||
|
- "traefik.http.routers.woodpecker.tls.certresolver=letsencrypt"
|
||||||
|
|
||||||
|
# Service
|
||||||
|
- "traefik.http.services.woodpecker.loadbalancer.server.port=8000"
|
||||||
|
|
||||||
|
woodpecker-agent:
|
||||||
|
image: woodpeckerci/woodpecker-agent:latest
|
||||||
|
container_name: woodpecker-agent
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- woodpecker-server
|
||||||
|
networks:
|
||||||
|
- woodpecker-internal
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
environment:
|
||||||
|
WOODPECKER_SERVER: woodpecker-server:9000
|
||||||
|
WOODPECKER_AGENT_SECRET: ${WOODPECKER_AGENT_SECRET}
|
||||||
|
WOODPECKER_MAX_WORKFLOWS: 4
|
||||||
|
WOODPECKER_LOG_LEVEL: info
|
||||||
|
WOODPECKER_BACKEND: docker
|
||||||
|
|
||||||
|
networks:
|
||||||
|
traefik-proxy:
|
||||||
|
external: true
|
||||||
|
woodpecker-internal:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
woodpecker-server-data:
|
||||||
Reference in New Issue
Block a user