Skip to content

feat(dev): une seule commande pour demarrer, et la porte d'entree enfin trouvable - #56

Merged
lostmind84 merged 5 commits into
mainfrom
feat/une-seule-commande-pour-demarrer
Aug 11, 2026
Merged

feat(dev): une seule commande pour demarrer, et la porte d'entree enfin trouvable#56
lostmind84 merged 5 commits into
mainfrom
feat/une-seule-commande-pour-demarrer

Conversation

@lostmind84

Copy link
Copy Markdown
Owner

Le devcontainer livré en #55 marchait, mais sa porte d'entrée était introuvable : un contributeur qui suivait handbook/getting-started.md dans l'ordre ne pouvait pas aboutir. Trois trous mesurés dans la page :

  • aucune étape git clone dans le chemin conteneur — son bloc commençait par npm i -g puis devcontainer up --workspace-folder ., dont le . présume un dépôt qu'on n'a jamais dit de cloner ;
  • aucune ligne d'installation de Docker, alors que la page en donnait pour deux outils facultatifs — PowerShell 7 et gcc, chacun avec son winget install. Le seul outil obligatoire était le seul sans mode d'emploi ;
  • rien sur la panne n°1 du premier lancement sous Linux : permission denied … /var/run/docker.sock tant que l'utilisateur n'est pas dans le groupe docker, et le changement exige une déconnexion/reconnexion.

dev.sh et dev.ps1 — constater et guider, jamais installer

Trois contrôles, dans l'ordre, arrêt au premier échec :

  1. Docker répond — testé par docker info, pas par présence : installé mais arrêté est le cas ordinaire, et seule l'exécution distingue les deux.
  2. La CLI devcontainer fonctionne — testée par devcontainer --version, et cette forme-là n'est pas un détail : sous WSL, le PATH de Windows s'invite, et un devcontainer posé par nvm-windows est visible sans être exécutable. Un contrôle de présence franchissait l'étape à tort, puis plantait plus loin sur exec: node: not found. Trouvé en lançant le script pour de vrai, pas en le relisant.
  3. Tout est làdevcontainer up, puis les commandes utiles.

À chaque échec, le remède pour la plateforme détectée — Debian/Ubuntu, Arch, Fedora, macOS, Windows — groupe docker compris, avec sa reconnexion obligatoire et la raison.

Ils n'installent rien, et c'est écrit dans les deux fichiers. Root requis, installeur graphique sous Windows, reconnexion sous Linux : un script du dépôt qui s'y risquerait sur la machine d'autrui échouerait en silence — exactement ce que cette fonctionnalité existe pour supprimer.

Option-free, délibérément : ça garde la surface de parité minuscule.

Ce que la revue a trouvé, et qui n'aurait pas survécu à la relecture seule

  • La recette Fedora ne marchait sur aucune Fedora supportée. dnf config-manager --add-repo est du DNF4, refusé depuis Fedora 41. L'utilisateur tapait la ligne qu'on lui donnait et n'obtenait rien — le cas même que le script devait supprimer.
  • Sous Windows PowerShell 5.1, un avertissement faisait déclarer en panne ce qui marchait. $ErrorActionPreference = 'Stop' plus la redirection du flux d'une commande native : une commande qui réussit en écrivant un octet sur stderr devient une erreur terminante — sous 5.1, pas sous pwsh 7. docker info sur un moteur WSL2 émet des WARNING:. Le script annonçait « Docker ne répond pas, lancez Docker Desktop » sur une machine où Docker tourne. Reproduit sous un vrai 5.1, corrigé, revérifié sur trois cas, et dev.ps1 relancé de bout en bout sous 5.1 réel.
  • docker-buildx manquait à la recette Arch. pacman -S docker ne l'apporte pas : le contrôle 1 passait et devcontainer up tombait sur « BuildKit is enabled but the buildx component is missing ».

Les gardes

  • dev.sh rejoint les deux gardes shell, pas une — sh -n, et celle qui refuse un exit sur un test toujours faux, dont dev.sh relève puisqu'il pose set -e.
  • Le banc du parseur PowerShell marche désormais tout le dépôt au lieu de deploy/windows/*.ps1. Son voisin le faisait déjà, en disant pourquoi : « make.ps1 vit à la racine et porte les mêmes pièges ». Conséquence : make.ps1 — le script que lance tout contributeur Windows — n'était analysé par aucun interpréteur. dev.ps1 aurait hérité du même trou.
  • Une garde de parité exige que les deux scripts fassent les mêmes contrôles dans le même ordre, et que la seule asymétrie — le groupe docker, qui n'existe pas sous Windows — porte sa raison écrite dans les deux fichiers, jamais dans le banc seul. Sa première version était aveugle : "devcontainer" étant un sous-mot de "devcontainer up", elle n'assertait que deux contrôles sur trois, et le contrôle 2 pouvait disparaître en la laissant verte.

Chaque garde a été vue rouge avant d'être commitée.

La documentation

Le chemin conteneur devient git clone, cd, puis une commande. Les lignes d'installation ne sont pas recopiées dans la page : les scripts les portent, par plateforme, et une seconde copie serait une seconde vérité à maintenir. Les commandes détaillées restent juste en dessous, pour qui préfère savoir plutôt que croire.

sh dev.sh, jamais ./dev.sh : le fichier est commité en mode 100644, et la page dit pourquoi plutôt que de laisser le lecteur buter dessus.

Le tableau des prérequis est conservé intact — il reste la référence du chemin local.

Vérifié

make test vert dans le conteneur (70 paquets, passe -race comprise), dev.ps1 lancé de bout en bout sous Windows PowerShell 5.1 réel avec code de sortie 0, dev.sh lancé sous WSL, mkdocs build --strict vert, go vet et gofmt silencieux.

dev.sh et dev.ps1 amenent un contributeur n'ayant que Docker jusqu'au conteneur
de developpement en un seul appel, plutot que quatre commandes documentees dont
les pannes de premier lancement ne se racontent pas d'elles-memes : Docker
installe mais pas demarre, ou un devcontainer trouvable dans le PATH sans etre
executable (mesure sous WSL, ou le PATH de Windows s'invite dans celui de la
distribution). Les deux scripts font trois contrôles dans le même ordre — Docker
répond, la CLI devcontainer répond, puis « devcontainer up » — testés par
exécution réelle et non par simple présence, et n'installent jamais rien
eux-mêmes : ils contrôlent, ils nomment, ils lancent. Aucune option, pour garder
la surface de parité entre les deux réduite à ces trois contrôles.
…este

Trois ajouts à deploy/, chacun comblant un trou que le nouveau couple de
scripts aurait sinon hérité en silence :

- TestTheShellScriptsAreValidAccordingToTheShell (shell_test.go) analyse
  désormais dev.sh par « sh -n », à côté de .devcontainer/post-create.sh.

- TestEveryPowerShellScriptParses (powershell_test.go) s'appuie sur
  powerShellScripts(t), qui parcourt tout le dépôt, au lieu de son propre
  glob limité à deploy/windows/*.ps1. Ça fait entrer make.ps1 ET dev.ps1
  dans le seul banc qui invoque réellement le parseur PowerShell — make.ps1
  n'était vérifié par aucun interprète jusqu'ici, et dev.ps1 aurait hérité
  du même trou.

- TestDevScriptsCheckTheSameThings (parity_test.go) tient la parité entre
  les deux scripts : les trois mêmes contrôles (Docker, la CLI devcontainer,
  le lancement) doivent apparaître dans les deux fichiers. L'unique écart
  légitime — le contrôle du groupe docker, qui n'existe pas sous Windows —
  est vérifié par la même mécanique que les exceptions de parité des
  installeurs : la raison doit être écrite, et retrouvée dans le fichier qui
  n'a pas le contrôle, pas seulement affirmée dans le banc.

Les trois ont été vus rougir sur une casse volontaire (syntaxe cassée sur
chaque script, contrôle retiré d'un des deux) avant d'être restaurés.
Trois corrections mesurées sur dev.sh et dev.ps1, après relecture :

- La recette Fedora de dev.sh employait la syntaxe DNF4 (« --add-repo »).
  Fedora est passée à DNF5 en version 41, et toutes les versions encore
  maintenues répondent « argument inconnu » à cette syntaxe — l'utilisateur
  tape la ligne qu'on lui donne et n'obtient rien. Remplacée par la syntaxe
  DNF5 (« addrepo --from-repofile »), telle que documentée aujourd'hui.

- docker-buildx (Arch) et docker-buildx-plugin (Fedora, déjà corrigé) ajoutés
  aux deux recettes : sans eux, le contrôle 1 (« docker info ») passe et le
  contrôle 3 (« devcontainer up », qui construit l'image) tombe sur
  « BuildKit is enabled but the buildx component is missing or broken ».

- Sous Windows PowerShell 5.1 — pas sous pwsh 7, vérifié sous les deux —
  $ErrorActionPreference = 'Stop' rend TERMINANTE toute écriture sur le flux
  d'erreur d'une commande native dont la sortie est redirigée, même quand
  cette commande réussit et n'écrit qu'un avertissement. Reproduit pour de
  vrai : un « cmd /c "echo err 1>&2 && exit 0" » réussi devient une exception
  attrapée par le catch sous 5.1. « docker info » sur un moteur WSL2 émet un
  avertissement sur stderr, et « devcontainer --version » hérite de ceux de
  Node — les deux auraient été déclarés en panne sous 5.1 alors qu'ils
  répondent. Une fonction Test-CommandRuns desserre la préférence le temps de
  l'appel seulement, et la restaure aussitôt ; les deux sondes s'appuient
  désormais dessus plutôt que sur deux blocs try/catch dupliqués.

Deux corrections mineures à côté : les en-têtes des deux scripts recopiaient
des nombres (« quatre commandes », « six des sept contrôles ») que rien ne
tenait à jour et que le handbook contredisait déjà ; ils disent maintenant le
critère et renvoient au handbook. « Deux causes possibles » devient « Causes
possibles », le message n'en imprimant qu'une sur macOS.
TestDevScriptsCheckTheSameThings cherchait « devcontainer » pour juger le
contrôle 2, et ce mot est un sous-mot de « devcontainer up », le marqueur du
contrôle 3 : il était donc vrai par construction dès que le troisième
l'était, et ne pouvait pas voir le contrôle 2 disparaître — précisément celui
que la CLI --version vient de réparer. Remplacé par « devcontainer --version »,
le texte que les deux scripts exécutent réellement pour ce contrôle. Une
deuxième boucle vérifie maintenant l'ordre des trois marqueurs dans chaque
script, ce que le commentaire de la fonction affirmait sans le vérifier. Le
message d'échec de la boucle de présence ne suppose plus que l'autre script
porte le marqueur : il le constate, avec un message distinct selon qu'un seul
côté a perdu le contrôle ou que les deux l'ont perdu ensemble.

TestNoShellScriptExitsOnATestThatIsSimplyFalse (shell_test.go) n'analysait que
linux/*.sh, alors que dev.sh pose le même set -e et est exactement le genre de
script dont une panne de premier lancement doit parler plutôt que sortir en
silence sur un test simplement faux. Il rejoint la liste, comme son voisin
sh -n l'a fait pour dev.sh dans un lot précédent.
Le chemin conteneur du guide de demarrage manquait le git clone, ne disait
rien de l'installation de Docker et laissait le contributeur Linux decouvrir
seul le blocage du groupe docker au premier lancement. Les scripts dev.sh
et dev.ps1 verifient et guident deja pour ca, plateforme par plateforme : la
page renvoie desormais vers ces deux commandes plutot que de dupliquer leurs
instructions, et garde le detail des commandes devcontainer pour qui prefere
le savoir plutot que le croire.

Adoucit aussi la revendication non verifiee sur les IDE JetBrains : seuls
VS Code et ses forks implementent la specification devcontainer avec
certitude.
@lostmind84
lostmind84 merged commit 1bcbe0d into main Aug 11, 2026
8 checks passed
@lostmind84
lostmind84 deleted the feat/une-seule-commande-pour-demarrer branch August 11, 2026 15:30
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