Aller au contenu

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 :

  1. Créer une OAuth App GitHub sur https://github.com/settings/developers
  2. URL de la page d'accueil : https://ci.<domaine>
  3. URL de callback : https://ci.<domaine>/authorize
  4. Définir les identifiants dans values-dev-secrets.yaml :
    akko-woodpecker:
      github:
        client_id: "votre-github-oauth-client-id"
        client_secret: "votre-github-oauth-client-secret"
      agent:
        secret: "un-secret-partagé-aléatoire-de-32-caractères"
    
  5. Créer la base de données — le job akko-init crée la base woodpecker dans 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