Aller au contenu

Pipeline CI/CD

Fonctionnement général

Le pipeline se déclenche automatiquement à chaque push sur la branche main. Il est identique pour tous les projets (Alert-Parent, Pedago Watch, etc.).

Push main → Build image → Push GHCR → Deploy VPS → Health check → Notify

Les 3 jobs

Job 1 : Build & Push

  1. Checkout du code source
  2. Configuration Docker Buildx avec cache GitHub Actions
  3. Login sur ghcr.io avec GITHUB_TOKEN
  4. Build de l'image Docker depuis le Dockerfile
  5. Push avec deux tags :
  6. sha-XXXXXXX (SHA du commit, pour traçabilité)
  7. latest (pour faciliter les pulls manuels)

Job 2 : Deploy

  1. Checkout du code (pour accéder au docker-compose.yml)
  2. SCP du fichier docker-compose.yml vers le VPS (évite le git pull sur le VPS)
  3. SSH vers le VPS, puis :
  4. Écriture du fichier .env depuis le secret DOTENV_FILE
  5. Login sur GHCR via GITHUB_TOKEN passé en variable d'environnement
  6. docker compose pull (télécharge la nouvelle image)
  7. docker compose up -d (redémarre le service)
  8. Boucle de health check : 12 tentatives x 5s = 60s max
  9. Nettoyage des images Docker > 7 jours

Job 3 : Notify

Envoie un webhook avec :

  • Statut : success ou failure
  • SHA du commit
  • Acteur (qui a poussé)
  • Lien vers le run GitHub Actions

Flux CI/CD

sequenceDiagram
    participant Dev as Développeur
    participant GH as GitHub Actions
    participant GHCR as GHCR Registry
    participant VPS as VPS Hostinger

    Dev->>GH: git push main
    GH->>GH: Build Docker image
    GH->>GHCR: Push image sha-XXXXXX + latest
    GH->>VPS: SCP docker-compose.yml
    GH->>VPS: SSH: write .env from DOTENV_FILE
    GH->>VPS: SSH: docker login GHCR
    GH->>VPS: SSH: docker compose pull && up -d
    VPS->>VPS: Health check loop (/health)
    GH->>GH: Notify success/failure (webhook)

Secrets GitHub Actions requis

Secret Description Obligatoire
SERVER_HOST IP ou hostname du VPS Oui
SERVER_USERNAME Utilisateur SSH (ex: root) Oui
SERVER_SSH_KEY Clé privée SSH complète (contenu de ~/.ssh/id_ed25519) Oui
DOTENV_FILE Contenu complet du fichier .env de production Oui
WEBHOOK_URL URL webhook pour notifications de déploiement Non

Configurer les secrets

gh secret set SERVER_HOST --repo EpitechAfrik/alert-parent-backend --body "IP_DU_VPS"
gh secret set SERVER_USERNAME --repo EpitechAfrik/alert-parent-backend --body "root"
gh secret set SERVER_SSH_KEY --repo EpitechAfrik/alert-parent-backend < ~/.ssh/id_ed25519
gh secret set DOTENV_FILE --repo EpitechAfrik/alert-parent-backend < .env.prod

Leçons apprises et corrections

Utiliser SCP au lieu de git pull

Problème : git pull sur le VPS nécessite une clé SSH GitHub configurée sur le VPS pour les repos privés. Cela ajoute de la complexité et des risques de sécurité.

Solution : Le pipeline copie uniquement le docker-compose.yml via SCP. Le code applicatif est dans l'image Docker, pas besoin du repo complet sur le VPS.

Pattern DOTENV_FILE

Problème : Gérer des dizaines de secrets individuels dans GitHub Actions est fastidieux et source d'erreurs.

Solution : Stocker l'intégralité du fichier .env comme un seul secret DOTENV_FILE. Le pipeline le réécrit à chaque déploiement sur le VPS.

# Dans le workflow
echo "${{ secrets.DOTENV_FILE }}" > /root/projects/alert-parent/alert-parent-backend/.env

Login GHCR sur le VPS

Problème : Le VPS doit s'authentifier auprès de GHCR pour tirer les images des repos privés.

Solution : Le GITHUB_TOKEN est passé en variable d'environnement lors de la session SSH, puis utilisé pour le login.

Chemins absolus

Problème : Utiliser ~ ou $HOME dans les scripts SSH peut résoudre vers le mauvais répertoire home (par exemple si l'utilisateur SSH n'est pas root).

Solution : Toujours utiliser des chemins absolus : /root/projects/alert-parent/alert-parent-backend, pas ~/projects/....

Permissions utilisateur

Problème : L'utilisateur de déploiement n'avait pas les droits Docker ou les permissions sur les répertoires.

Solutions :

  • usermod -aG docker UTILISATEUR : ajouter l'utilisateur au groupe Docker
  • chown UTILISATEUR:UTILISATEUR /root/projects/... : donner la propriété des fichiers
  • chmod 711 /root et chmod 711 /root/projects : permettre la traversée des répertoires

Déploiement manuel

Si le pipeline échoue, déployer manuellement :

ssh root@IP_DU_VPS

cd /root/projects/alert-parent/alert-parent-backend

# Mettre à jour le fichier .env si nécessaire
nano .env

# Tirer la dernière image
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
docker compose pull
docker compose up -d

# Vérifier
curl http://127.0.0.1:5011/health