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.).
Les 3 jobs¶
Job 1 : Build & Push¶
- Checkout du code source
- Configuration Docker Buildx avec cache GitHub Actions
- Login sur
ghcr.ioavecGITHUB_TOKEN - Build de l'image Docker depuis le
Dockerfile - Push avec deux tags :
sha-XXXXXXX(SHA du commit, pour traçabilité)latest(pour faciliter les pulls manuels)
Job 2 : Deploy¶
- Checkout du code (pour accéder au
docker-compose.yml) - SCP du fichier
docker-compose.ymlvers le VPS (évite legit pullsur le VPS) - SSH vers le VPS, puis :
- Écriture du fichier
.envdepuis le secretDOTENV_FILE - Login sur GHCR via
GITHUB_TOKENpassé en variable d'environnement docker compose pull(télécharge la nouvelle image)docker compose up -d(redémarre le service)- Boucle de health check : 12 tentatives x 5s = 60s max
- 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 Dockerchown UTILISATEUR:UTILISATEUR /root/projects/...: donner la propriété des fichierschmod 711 /rootetchmod 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