Skip to content

fix(dev): un premier lancement qui echoue le dit, et se rattrape - #57

Merged
lostmind84 merged 1 commit into
mainfrom
fix/premier-lancement-du-conteneur
Aug 11, 2026
Merged

fix(dev): un premier lancement qui echoue le dit, et se rattrape#57
lostmind84 merged 1 commit into
mainfrom
fix/premier-lancement-du-conteneur

Conversation

@lostmind84

Copy link
Copy Markdown
Owner

La panne

dev.sh meurt pendant postCreateCommand, sur npm ci. Le message n'est ni dans la sortie du script ni dans celle de la CLI, mais dans ~/.npm/_logs/…-debug-0.log du conteneur :

Error: spawnSync .../web/node_modules/esbuild/bin/esbuild ETXTBSY
    at validateBinaryVersion (.../esbuild/install.js:103:28)

Le postinstall d'esbuild pose un lien dur vers le binaire de plateforme que npm vient d'extraire, puis l'exécute — pendant que la phase reify de npm peut encore tenir cet inode ouvert en écriture, et Linux refuse d'exécuter un fichier ouvert en écriture. Course entre deux morceaux de npm : elle ne dit rien du package-lock.json, et elle frappe un volume web/node_modules neuf, c'est-à-dire le premier lancement d'un contributeur.

Le second défaut, plus grave, qui survit à la panne

La CLI n'exécute postCreateCommand qu'à la CRÉATION du conteneur. Le conteneur à moitié préparé reste en place, le devcontainer up suivant répond {"outcome":"success"} sans rien préparer, et dev.sh annonce « Poste prêt » sur un web/node_modules vide. Mesuré, pas déduit.

Ce que fait cette branche

  • post-create.sh retente npm ci une seule fois, et seulement si la sortie nomme ETXTBSY. Tout autre échec — un lock désynchronisé au premier chef — sort à la première tentative : ci reste déterministe (§14.1).
  • dev.sh et dev.ps1 nomment la sortie de secours au moment où ils échouent (--remove-existing-container), portée des deux côtés selon la règle de report du 10/08/2026.
  • handbook/getting-started.md la porte aussi, pour qui lit avant de se cogner.
  • Deux bancs, rouges avant le correctif : TestThePostCreateScriptRetriesNpmCiOnTheETXTBSYRace et TestBothDevScriptsSayHowToRedoAFailedPreparation.

Vérification

  • Faux npm, branche ETXTBSY : sortie 0, 2 appels, message de reprise imprimé.
  • Faux npm, lock désynchronisé : sortie 1, 1 appel, aucune reprise.
  • Conteneur et volume openscale-node-modules-… détruits, sh dev.sh rejoué de zéro : sortie 0.
  • make test dans le conteneur neuf, deux passes, boundary et deps compris : 3 135 verts, 10 écartés, 0 échec.
  • make front-check : 80 585 o gzip, 71,5 % du budget. mkdocs build --strict vert.

Ce qui n'est PAS fait

  • La course n'a pas été reproduite à la demande — trois npm ci sur volume vide et cache npm froid, tous verts. Le correctif s'appuie sur le journal de la panne réelle et sur un npm bouchonné.
  • dev.ps1 n'a pas été exécuté, faute de Windows : il n'est qu'analysé par deploy/powershell_test.go.
  • Rien ne garde que --remove-existing-container existe encore dans une version future de la CLI : l'option est lue dans l'aide de la 0.88.0.

Le premier lancement de dev.sh est mort pendant postCreateCommand, sur
npm ci. Le message n'etait ni dans la sortie du script ni dans celle de la
CLI, mais dans ~/.npm/_logs du conteneur : spawnSync .../esbuild/bin/esbuild
ETXTBSY. Le postinstall d'esbuild pose un lien dur vers le binaire de
plateforme que npm vient d'extraire puis l'execute, pendant que la phase
reify de npm peut encore tenir cet inode ouvert en ecriture -- et Linux
refuse d'executer un fichier ouvert en ecriture. C'est une course entre deux
morceaux de npm, elle ne dit rien du package-lock.json, et elle frappe un
volume web/node_modules NEUF : le premier lancement d'un contributeur.

post-create.sh retente donc npm ci une seule fois, et seulement si la sortie
nomme ETXTBSY. Tout autre echec -- un lock desynchronise au premier chef --
sort a la premiere tentative, ce qui garde a `ci` le caractere deterministe
que 14.1 lui demande.

Le second defaut est le plus grave, et il survit a la panne : la CLI
n'execute postCreateCommand qu'a la CREATION du conteneur. Le conteneur a
moitie prepare reste en place, le devcontainer up suivant repond
{"outcome":"success"} sans rien preparer, et dev.sh annonce alors
« Poste pret » sur un web/node_modules vide. dev.sh et dev.ps1 nomment
desormais la sortie de secours au moment ou ils echouent
(--remove-existing-container), portee des deux cotes selon la regle de
report du 10/08/2026, et handbook/getting-started.md la porte aussi.

Deux bancs tiennent les deux moities, rouges avant le correctif. Les deux
branches du rattrapage sont exercees avec un faux npm : echec ETXTBSY, deux
appels et sortie 0 ; echec de lock desynchronise, un appel, aucune reprise,
sortie 1. Conteneur et volume node_modules detruits, sh dev.sh rejoue de
zero : sortie 0. make test vert dans le conteneur neuf -- 3 135 tests verts,
10 ecartes, 0 echec -- et make front-check a 80 585 o gzip.
@lostmind84
lostmind84 merged commit ad013e8 into main Aug 11, 2026
8 checks passed
@lostmind84
lostmind84 deleted the fix/premier-lancement-du-conteneur branch August 11, 2026 19:40
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