Woodpecker — Pipelines CI/CD¶
Woodpecker CI est le moteur CI/CD auto-hébergé d'AKKO, remplaçant GitHub Actions pour les builds, tests et déploiements. Les pipelines s'exécutent en tant que pods Kubernetes sur le même cluster, éliminant les dépendances aux runners externes. Il s'intègre avec GitHub via OAuth et stocke l'état des pipelines dans PostgreSQL.
Architecture¶
GitHub (webhooks)
|
+--v-------------------+
| Woodpecker Server |
| (:80 web + API) |
| (:9000 gRPC) |
+--+-------+-----------+
| |
| +----v-----------+
| | PostgreSQL |
| | (DB pipelines) |
| +-----------------+
|
+--v-------------------+
| Woodpecker Agent(s) |
| (2 réplicas) |
| crée des pods k8s |
+----------------------+
- Le serveur gère les webhooks, l'interface web, l'API et l'ordonnancement des pipelines
- Les agents se connectent au serveur via gRPC et exécutent les pipelines en tant que pods Kubernetes
- PostgreSQL stocke l'état des pipelines, les logs de build et les secrets
- GitHub OAuth pour la connexion et l'accès aux dépôts
URLs¶
| Mode | URL |
|---|---|
| Kubernetes (k3d) | https://ci.<domaine> |
Configuration (valeurs Helm)¶
akko-woodpecker:
enabled: true
server:
image:
repository: woodpeckerci/woodpecker-server
tag: "v3.4.0"
replicas: 1
agent:
image:
repository: woodpeckerci/woodpecker-agent
tag: "v3.4.0"
replicas: 2 # 2 pipelines concurrents
secret: "" # Secret partagé 32+ chars (values-dev-secrets.yaml)
github:
enabled: true
client_id: "" # OAuth App GitHub (values-dev-secrets.yaml)
client_secret: ""
host: "ci.akko.local"
database:
driver: "postgres"
host: "akko-postgresql"
name: "woodpecker"
service:
webPort: 80
grpcPort: 9000
ingress:
enabled: true
host: "ci.akko.local"
resources:
server:
requests: { cpu: 50m, memory: 128Mi }
limits: { cpu: 500m, memory: 512Mi }
agent:
requests: { cpu: 100m, memory: 256Mi }
limits: { cpu: 1, memory: 1Gi }
workspace:
pvcSize: "10Gi"
Healthcheck¶
Le serveur Woodpecker expose un endpoint de santé sur le port web :
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 30
readinessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10
periodSeconds: 10
RBAC (qui peut accéder)¶
- GitHub OAuth — les utilisateurs se connectent avec leur compte GitHub
- Permissions de dépôt — Woodpecker respecte les droits d'accès GitHub (admin, write, read)
- Utilisateurs admin — configurés via les variables d'environnement Woodpecker (le premier login devient admin, ou défini explicitement)
Prérequis d'installation¶
Pour activer Woodpecker, vous devez :
- Créer une OAuth App GitHub sur
https://github.com/settings/developers - URL de la page d'accueil :
https://ci.<domaine> - URL de callback :
https://ci.<domaine>/authorize - Définir les identifiants dans
values-dev-secrets.yaml: - Créer la base de données — le job
akko-initcrée la basewoodpeckerdans PostgreSQL
Fonctionnalités principales¶
| Fonctionnalité | Description |
|---|---|
| Natif Kubernetes | Les pipelines s'exécutent en pods, pas en Docker-in-Docker |
| Intégration GitHub | Connexion OAuth + builds déclenchés par webhook |
| Multi-agent | 2+ agents pour l'exécution concurrente de pipelines |
| Backend PostgreSQL | État durable des pipelines et logs de build |
| Apache 2.0 | Entièrement open-source, aucune restriction de licence |
| Pipelines YAML | .woodpecker.yml à la racine du dépôt |
Ressources requises¶
| Composant | RAM minimum | Recommandé |
|---|---|---|
| Serveur | 128 Mi | 512 Mi |
| Agent (chacun) | 256 Mi | 1 Gi |
Dépannage¶
L'agent ne peut pas se connecter au serveur¶
Symptômes : Les logs de l'agent affichent connection refused ou failed to connect to server.
Cause : Le secret partagé ne correspond pas entre le serveur et l'agent, ou le port gRPC (9000) est bloqué.
Solution :
# Consulter les logs de l'agent
kubectl logs -n akko deploy/akko-woodpecker-agent --tail=50
# Vérifier que le secret partagé correspond
kubectl get secret -n akko akko-woodpecker -o yaml | grep agent-secret
# Tester la connectivité gRPC
kubectl exec -n akko deploy/akko-woodpecker-agent -- nc -zv akko-woodpecker-server 9000
Les webhooks GitHub ne déclenchent pas les builds¶
Symptômes : Pousser sur un dépôt ne déclenche pas de pipeline Woodpecker.
Cause : L'URL du webhook est incorrecte, l'OAuth App GitHub est mal configurée, ou Woodpecker ne peut pas accéder au dépôt.
Solution :
# Consulter les logs du serveur pour les erreurs webhook
kubectl logs -n akko deploy/akko-woodpecker-server --tail=100 | grep -i "webhook\|hook\|error"
# Vérifier que l'ingress est accessible
kubectl get ingress -n akko | grep woodpecker
# Vérifier la configuration OAuth GitHub
kubectl describe deploy -n akko akko-woodpecker-server | grep -i github
Échec de connexion à la base de données¶
Symptômes : Le pod serveur entre en CrashLoopBackOff. Les logs affichent could not connect to database.
Cause : PostgreSQL n'est pas prêt ou la base woodpecker n'existe pas.
Solution :
# Vérifier le statut de PostgreSQL
kubectl get pods -n akko -l app.kubernetes.io/name=akko-postgresql
# Vérifier que la base existe
kubectl exec -n akko deploy/akko-postgresql -- psql -U postgres -c "\l" | grep woodpecker
# Si manquante, la créer
kubectl exec -n akko deploy/akko-postgresql -- psql -U postgres -c "CREATE DATABASE woodpecker;"
# Redémarrer le serveur
kubectl rollout restart -n akko deploy/akko-woodpecker-server