CI/CD — Options de déploiement automatique après git push¶
Résumé¶
GitHub Actions est en production sur PsychoEnLigne depuis le 20260513. Tout push sur main touchant BackEnd/ ou FrontEnd/ déclenche automatiquement le déploiement Docker, quelle que soit la source (PC local, VPS, Claude Code). La notification Telegram arrive en fin de déploiement.
Voir PsychoEnLigneV2/architecture/workflow-developpement-deploiement pour le contexte complet des deux workflows.
Principe¶
Un CI/CD réagit automatiquement à un événement git (push sur main) et exécute une suite d'actions définies dans un fichier de configuration — ici : se connecter au VPS et lancer deploy.sh.
Option 1 — GitHub Actions (recommandée)¶
Fichier .github/workflows/deploy.yml dans le repo :
"À chaque push sur
main, si des fichiersBackEnd/ouFrontEnd/ont changé → SSH sur le VPS →deploy.sh"
- GitHub héberge le runner (machine d'exécution)
- La clé SSH privée du VPS est stockée comme "secret" dans les paramètres du repo GitHub
- Condition sur les fichiers modifiés possible (même logique que SKILL.md step 3b)
Avantages : gratuit, logs visibles dans GitHub UI, aucun composant à installer sur le VPS.
Inconvénient : dépend de GitHub, délai ~30-60 secondes avant démarrage du job.
Option 2 — Webhook GitHub → VPS¶
GitHub envoie une requête HTTP (POST) vers le VPS à chaque push. Un listener léger (outil webhook en Go) reçoit la requête et lance deploy.sh.
Avantages : quasi-instantané (~2s), indépendant de l'infrastructure GitHub.
Inconvénient : faut exposer un port sur le VPS, gérer la sécurité du webhook (secret partagé).
Comparaison¶
| GitHub Actions | Webhook | Hermes /cc | |
|---|---|---|---|
| Déclenché par | push GitHub | push GitHub | commande Telegram |
| Délai | ~30-60s | ~2s | immédiat |
| Config | fichier dans le repo | listener sur VPS | SKILL.md |
| Logs | GitHub UI | fichier sur VPS | Telegram |
Recommandation¶
GitHub Actions est le choix le plus simple à mettre en place et à maintenir. Il résout exactement le problème : dès que Claude Code ou l'utilisateur fait un push, le déploiement part automatiquement sans passer par Telegram.
Le webhook est une bonne alternative si on veut éviter la dépendance GitHub ou gagner en réactivité.
Implémentation finale validée en production (20260513)¶
Workflow .github/workflows/deploy.yml¶
Points clés du fichier final :
- concurrency: cancel-in-progress: true — un seul déploiement à la fois, le plus récent annule l'ancien
- su - kanmaber -c "git pull" sur l'hôte VPS avant d'appeler deploy.sh — le container n'a pas de clé SSH GitHub
- appleboy/ssh-action@v1 pour le SSH depuis GitHub vers le VPS
Problèmes rencontrés et résolus¶
| Problème | Cause | Solution |
|---|---|---|
| SSH auth failed (handshake) | Mauvaise clé dans le secret GitHub (clé publique au lieu de privée) | Générer une clé dédiée ~/.ssh/github_actions, copier la privée dans le secret |
git pull échoue dans le container |
Pas de clé SSH GitHub dans Hermes | Pull sur l'hôte VPS via su - kanmaber dans le script GitHub Actions |
Permission denied on .git/ |
Root avait créé des fichiers dans .git/ |
chown -R kanmaber:kanmaber /home/kanmaber/projets/PsychoEnLigne/.git |
fatal: dubious ownership dans deploy.sh |
Git 2.35+ refuse les volumes avec owner différent du user courant | git config --global --add safe.directory "$PROJECT_DIR" au début de deploy.sh |
| Token Telegram invalide (404) | Token tronqué/obsolète dans .env projet |
Copier le token depuis /home/kanmaber/hermes/data/.env |
| Race condition double déploiement | Deux commits rapprochés → deux jobs simultanés | concurrency: cancel-in-progress: true dans deploy.yml |
Liens connexes¶
- PsychoEnLigneV2/architecture/workflow-developpement-deploiement — les deux contextes de travail : /cc vs session Claude Code
- PsychoEnLigneV2/architecture/deploiement-sync-psycho-hermes — deploy.sh, docker direct, scripts Hermes
- shared/references/point-mise-en-oeuvre-hermes-workflow-developpement — statut workflow Hermes