fix(deploy): ne ramène jamais un environnement sur un commit plus ancien

Les CI de deux push rapprochés peuvent finir dans le désordre. deploy.yml faisait alors
reset --hard sur un GITHUB_SHA plus ancien que celui déjà déployé, et le groupe concurrency
deploy-<branche> ne garde qu'un job en attente : un troisième arrivé annulait le précédent, qui
n'était jamais déployé.

- un commit qui précède celui déjà déployé est ignoré, avec une annotation dans le run ;
- le groupe concurrency cède la place à un flock posé dans le clone de la VM, tenu du fetch
  jusqu'à la sonde de santé : les déploiements passent un par un, aucun n'est annulé ;
- les trois étapes n'en font plus qu'une, le verrou tombant avec le shell qui l'a posé ; les
  journaux restent découpés par ::group::.

ADR 0014 et 50-cicd.md décrivent les deux gardes.
This commit is contained in:
Johan LEROY
2026-09-23 10:44:51 +02:00
parent 0284cc0cd8
commit 3ca4839a02
3 changed files with 33 additions and 13 deletions
+9 -2
View File
@@ -111,8 +111,15 @@ et non sur la pointe de branche du moment, qui a pu avancer pendant la CI. Il la
migrations Alembic dans le conteneur backend, et attend jusqu'à trois minutes que
`/api/v1/health/ready` réponde derrière le proxy. Cette sonde ne vérifie que la connexion à la
base et la présence de TimescaleDB : sans la migration, le déploiement serait vert sur une base
sans schéma, et c'est pourquoi `make stack-up` la porte. Un groupe de concurrence par branche,
sans annulation, empêche deux déploiements simultanés du même environnement.
sans schéma, et c'est pourquoi `make stack-up` la porte.
Les CI de deux push rapprochés peuvent finir dans le désordre. Deux gardes empêchent un
environnement de reculer ou de sauter un commit :
- un commit qui **précède** celui déjà déployé est ignoré, avec une annotation dans le run ;
- les déploiements d'un même environnement passent un par un sous un verrou `flock` posé dans le
clone de la VM. Un groupe `concurrency` ne convenait pas : GitHub n'y garde qu'un job en
attente, et un troisième arrivé l'annule sans erreur.
Le job ne fait pas de `actions/checkout` dans son espace de travail, et c'est voulu : le dossier
de l'environnement est stable, hors du runner, parce que `.env`, certificats et volumes doivent