Skip to content

Un tag poussé deux fois ne publie plus qu'une fois - #1

Merged
pasquelin merged 1 commit into
mainfrom
release-idempotente
Sep 2, 2026
Merged

pasquelin merged 1 commit into
mainfrom
release-idempotente

Conversation

@pasquelin

Copy link
Copy Markdown
Owner

Le symptôme

Le tag v0.3.3 a produit deux runs Release (même SHA, même seconde) : le premier a publié 0.3.3 à 08:37:01, le second a rejoué validate + build pour se heurter au registre à 08:37:58 :

npm error You cannot publish over the previously published versions: 0.3.3.

La publication était bonne ; seule la notification était rouge. cancel-in-progress: false ne protège de rien ici — il met le doublon en file d'attente au lieu de l'annuler, ce qui reste le bon arbitrage : tuer une publication à moitié écrite serait pire.

Le correctif

Un job guard en amont interroge npm et n'active publish que si la version manque. Job séparé plutôt que condition répétée sur quatre étapes : le doublon apparaît alors skipped, plus failed, et le mail rouge disparaît.

Le test porte sur la sortie de npm view, pas sur son code de retour — E404 couvre autant une version absente qu'un paquet pas encore publié.

Au passage : actions alignées sur ci.yml / pages.yml (v7, node-version-file: .nvmrc), et id-token: write descendu au seul job qui publie.

Vérifications

Le script du garde a été exécuté sur les quatre cas réels :

Cas Résultat
v0.3.3, déjà sur npm publish=false, exit 0
Tag v9.9.9 ≠ package.json 0.3.3 ::error::, exit 1
Version pas encore publiée publish=true, exit 0
Paquet inexistant (première publication) publish=true, exit 0

La claim OIDC (repo + nom du fichier workflow) est inchangée : le trusted publisher déclaré côté npm continue de correspondre.

https://claude.ai/code/session_01N9dogM3o4ejFdnYtDjPQkb

Le tag v0.3.3 est parti deux fois : deux runs, même SHA, même seconde. Le
premier a publié, le second a rejoué toute la chaîne pour se heurter au
registre — « cannot publish over the previously published versions » — et
signaler en rouge une release qui avait réussi.

Un job `guard` demande maintenant à npm si la version existe déjà, et le job
`publish` ne démarre que sinon. Un job séparé plutôt qu'une condition posée
sur chaque étape : le doublon se lit alors comme ignoré et non comme cassé,
et une notification d'échec qui ment finit par apprendre à ignorer la
prochaine qui dit vrai.

Le test porte sur la sortie de `npm view`, pas sur son code de retour : celui-ci
vaut E404 aussi bien pour une version absente que pour un paquet qui n'existe
pas encore, le jour de la première publication.

Au passage, les actions rejoignent celles de `ci.yml` et `pages.yml` — v7, et
la version de Node lue dans `.nvmrc` au lieu d'un 22 écrit en dur qui pouvait
diverger. `id-token: write` descend au job qui publie ; le garde ne lit que le
dépôt.

Claude-Session: https://claude.ai/code/session_01N9dogM3o4ejFdnYtDjPQkb
@pasquelin
pasquelin merged commit 0726dec into main Sep 2, 2026
1 check passed
@pasquelin
pasquelin deleted the release-idempotente branch September 2, 2026 11:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant