Repository navigation
Conversation
Le merge dev → main déployait :main en prod, puis le tag déployait :vX.Y.Z une minute plus tard : deux swaps pour une release, le premier avant les gates de release.yml, et deux builds du même commit dont les chunks diffèrent (12 sur la v2.1.0). Un push sur main qui change la version de package.json construit toujours :main, mais ne déploie plus : la prod appartient au tag. Les pushes sans bump gardent le filet, et dans le doute (before nul ou introuvable, version absente) on déploie comme avant. La règle vit dans scripts/resolve-main-push.sh pour être rejouable hors CI. refs #139
Dépôt git jetable : un bump laisse la prod au tag, un push sans bump ou un bump de dépendance seul garde le filet, et chaque cas douteux (before nul, vide, introuvable, version absente) déploie. Une erreur dans un sens rejoue le double déploiement, dans l'autre elle coupe le filet. Lancé dans les Script checks de ci.yml, à côté de resolve-release-tag. refs #139
RELEASE.md : vue d'ensemble (le filet saute les pushes qui bumpent), la phrase « les deux ne se réveillent jamais ensemble », déjà fausse, la concurrence qui sert encore à d'autres chevauchements, la prod qui reste sur l'ancienne version si le job du tag échoue, et le « ne prouve pas » de /api/health. Même chose dans l'en-tête de release.yml et dans CLAUDE.md, et une entrée Fixed sous [Unreleased]. closes #139
`FROM != TO` traitait le revert d'une release (2.1.0 → 2.0.0) comme un bump : le filet sautait alors qu'aucun tag ne suit, le sien est déjà publié, et la prod restait sur la release fautive. Seule une montée de version laisse désormais la prod au tag, comparée avec `sort -V` pour que 1.10.0 passe devant 1.9.0. Trouvé par la review (axe standards). Test : revert et 1.10.0 → 1.9.0 gardent le filet, 1.9.0 → 1.10.0 le laisse au tag. refs #139
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Une release déployait la prod deux fois : le merge
dev → mainréveillaitdeploy.yml(le filet) avec:main, puis le tag réveillaitrelease.ymlavec:vX.Y.Z. Sur la v2.1.0, ça a donné deux swaps nginx à une minute d'intervalle (22:23:36 puis 22:24:39 UTC). Le premier swap a eu lieu avant les gates derelease.yml. Les deux builds du même commit n'avaient pas les mêmes chunks (12 de différence).Désormais, un push sur
mainqui monte la version depackage.jsonconstruit toujours:main, mais ne déploie plus : la prod appartient au tag. Les pushes sans bump gardent le filet, comme #32. Une version qui redescend le garde aussi : le revert d'une release n'a aucun tag à venir. Dans le doute, on déploie comme avant (fail open).Related Issue
Closes #139
Type of Change
Scope
Which parts are affected?
Changes
scripts/resolve-main-push.sh <before> <after>émetdeploy=true|false,from,toau format de$GITHUB_OUTPUT. La décision se prend sur une montée stricte de.versiondepackage.json(sort -V), et non sur «package.jsona changé ». Un bump de dépendance ou un revert ne sautent donc pas le déploiement. Unbeforenul, vide ou introuvable, ou une version absente, donnedeploy=true.deploy.yml:resolvelance ce script uniquement surpushversrefs/heads/main. Le chemindev → preprod, lesworkflow_dispatchet le rollback ne changent pas ;deployexigedeploy != 'false';scripts/resolve-main-push.test.shconstruit un dépôt git jetable et couvre 12 cas. Il est lancé dans les Script checks deci.yml.docs/RELEASE.md: vue d'ensemble, concurrence, prod qui reste sur l'ancienne version si le job du tag échoue,/api/health;release.yml;CLAUDE.md;Fixedsous[Unreleased].Checklist
bash scripts/resolve-main-push.test.sh: 12/12 ; une mutation qui inverse la décision le fait échouer)actionlint: 8 findings surdev, 8 sur la branche, tous dans des steps non touchés ;shellcheckpropre sur les deux scripts)make typecheck) : pas lancé en local, aucun fichier TS ou Vue touché. La CI le fait.make lint) :bun run lintsousnix develop(Bun 1.4.4), exit 0, 2 warnings préexistants dans des.vuebun run fmt:check)Additional Notes
Rejeu sur le vrai historique de
main(before= premier parent du merge) :Un choix de design à valider. La règle pouvait aussi être « plus de prod depuis
deploy.ymldu tout ». Je l'ai écartée : #32 montre qu'un push surmainsans bump arrive, et il n'avait que le filet.Changement de comportement. Si le job
Deploy proddu tag échoue, la prod reste sur la version précédente. Avant, le filet y avait déjà mis le code de la release, comme sur la v1.0.1 où/api/healthdisait1.0.1alors queDeploy prodavait échoué. Rattrapage :gh run rerun <run> --failed, déjà documenté.Cas limite connu (P3 de la review, non corrigé). Réappliquer une release revertée fait remonter la version vers un tag qui existe déjà, ce qui donne
deploy=false. Aucun tag ne viendra, et la prod reste sur le code reverté. L'échec se fait du côté sûr : rien de non validé ne part. Rattrapage :gh workflow run release.yml -f tag=vX.Y.Z. Tester l'existence du tag dans le script rouvrirait la course de #139 : un tag poussé quelques secondes après le merge ferait repasserdeployàtrue.Non vérifiable avant le merge. Le chemin
push mainne tourne qu'au prochain merge de release. Ce sera le premier vrai test : le rundeploy.ymldoit montrerBuild & push imagevert,Deploy prod on VPSsauté et la ligne de résumé. Ce merge-ci, versdev, exercera le chemin preprod, qui ne doit pas bouger.Hors scope (détaillé dans #139) :
devpuis tag rc) ;@nuxtjs/mdc, l'ordre du CSS shiki suit l'ordre de fin des promesses, non corrigé en amont en 0.23.2 ;