Repository navigation
feat(ci,#13378): superviseur N-slots — le plafond de 1 job du runner ephemere est ce qui empechait tout debrayage - #14126
Conversation
…ises Le volet Linux du chantier runners etait reste en pleine conception : Dockerfile et entrypoint ecrits et corrects, image jamais construite, et surtout AUCUNE reponse a la question que le census #13378 avait pourtant nommee comme LE facteur limitant -- le cycle mono-job du runner --ephemeral. Un `docker run` isole plafonne la concurrence a 1. A 1 job, rien n'est debraye : les 121 definitions ubuntu-latest continuent de se disputer le plafond de concurrence partage du compte, qui est ce qui affame roo-extensions. supervise.sh leve ce plafond. Un slot = une boucle qui relance un conteneur des que le precedent meurt ; N slots = N jobs concurrents. C'est toute la difference d'avec le service Windows, ou chaque re-enregistrement est une tache planifiee a orchestrer : ici c'est un `docker run` de plus, gratuit et parallelisable. Trois points de conception : - La boucle vit sur l'HOTE. Le registration token vaut 1 h et est jetable, il en faut un neuf par demarrage de conteneur ; le fetch exige gh admin, et ces credentials ne descendent jamais dans le conteneur -- qui ne recoit que le token par -e, comme l'exige deja entrypoint.sh. - Arret gracieux par sentinel : plus aucun conteneur lance, le job en cours va a son terme. Tuer un job en vol rendrait un rouge qui ne veut rien dire. - N par defaut = 2, volontairement bas, et appartient a po-2024. La clause de souverainete de l'hote prime sur tout elargissement. Corrige aussi ce que la doc affirmait. Elle decrivait la conception comme un etat deploye ; l'inventaire GitHub du 2026-09-01 montre un seul runner enregistre sur le depot, `myia-po-2024-fast-guards`, qui est Windows. Aucun runner ne porte `coursia-linux`. Le pilote cible donc un label ORPHELIN : un dispatch mettrait le job en file indefiniment -- pas d'echec, pas de rouge, une attente muette qu'aucun timeout ne coupe (timeout-minutes ne court qu'a partir du demarrage). Le piege est dormant aujourd'hui (0 run en file, verifie), plus des qu'on dispatche. L'entete du workflow porte desormais la precondition et la commande qui la teste. Le gestionnaire n'est pas un blocage : manage_self_hosted_runner.py est Windows-only par validation, mais supervise.sh fonctionne sans lui et sans PR prealable. L'etendre aux profils Linux est un suivi. See #13378
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — APPROVE (opener myia-ai-01, review formelle).
Checklist complète exécutée sur le diff intégral (+185/−11, 3 fichiers : header workflow, doc runners, supervise.sh 129 lignes nouvelles).
- Security scan : 0 match réel (
HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=) — les deux matchestoken=sont le flux du registration token jetable : fetchgh apicôté hôte, transmission au conteneur exclusivement par-e ACTIONS_RUNNER_INPUT_TOKEN, jamais en argv. Les credentialsghadmin ne descendent pas dans le conteneur — conforme au patternentrypoint.sh. - Script lu intégralement : caps conservateurs (cpus=3/memory=4g/pids=384),
--security-opt=no-new-privileges, anti-emballement correct (rc≠0 → sleep 15, token vide → retry 60s), arrêt gracieux par sentinel sans tuer les jobs en vol.local rc=$?capture correctement le code dudocker run. - Doc vs réalité : la correction de
self-hosted-runners.md(labelcoursia-linuxorphelin, inventaire firsthand daté 2026-09-01, tableau par mesure) est la partie la plus valuable de la PR — le header du workflow porte désormais la précondition ET sa commande de vérification one-liner. L'honnêteté sur ce qui n'est pas prouvé (preuve d'identitéRUNNER_OS=Linuxattendue avant tout vert) est exactement la bonne posture. - Merge commit
a2f4232: mergeorigin/main(pasorigin/pr/NNN), diff net = exactement les 3 fichiers annoncés au body — pas d'accumulateur.
2 observations non bloquantes (suivi éventuel, pas des gates) :
cmd_startse termine parwaiten foreground : fermer le shell/SSH qui a lancésupervise.sh startinterrompt la supervision (les boucles background meurent avec lui). Unnohup/setsid— ou une note « lancer dans une session persistante » — éviterait la surprise.- Pas de garde anti-double-start : relancer
startpendant qu'une instance tourne double les slots et empile les PID dans$STATE_DIR/pids(jamais purgé).
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
Grain: MED/tooling — lane myia-ai-01:CoursIA — prev: MED/tooling #14086
Déclaration franche sur les gates : deux
MED/toolingconsécutifs. G-VAR-3 l'autorise pour une substance genuinement distincte — #14086 corrigeait un repli aveugle du stale-sweep, celle-ci écrit un superviseur de conteneurs runner : rien de commun, et aucune des deux n'est générable en scannant l'instance d'à-côté. Maistoolingest un genre META : cette PR ne tient pas mon plancher G-VAR-1, et je ne prétends pas le contraire.Ce que cette PR ferme
Le volet Linux du chantier runners (#13378) était resté en pleine conception. Le
Dockerfileet l'entrypoint.shétaient écrits, corrects, relus — et l'image n'avait jamais été construite. Surtout, la question que le census #13378 avait lui-même nommée comme « LE facteur limitant du §1, pas la compatibilité des workflows » n'avait aucune réponse : le cycle mono-job du runner--ephemeral.Un
docker runisolé plafonne la concurrence à 1 job. À 1 job, rien n'est débrayé — les 121 définitionsubuntu-latestcontinuent de se disputer le plafond de concurrence partagé au niveau du compte, qui est précisément ce qui affame roo-extensions.supervise.shlève ce plafond : un slot = une boucle qui relance un conteneur dès que le précédent meurt, N slots = N jobs concurrents. C'est toute la différence d'avec le service Windows — là-bas chaque ré-enregistrement est une tâche planifiée à orchestrer ; ici c'est undocker runde plus, gratuit et parallélisable.Trois points de conception
registration tokenvaut 1 h et est jetable : il en faut un neuf à chaque démarrage. Le fetch exigeghadmin, et ces credentials ne descendent jamais dans le conteneur — qui ne reçoit que le token par-e, comme l'exige déjàentrypoint.sh(token jamais en argv).Ce que la doc affirmait, et qui était faux
docs/ci/self-hosted-runners.mddécrivait la conception comme un état déployé. L'inventaire GitHub firsthand du 2026-09-01 (mesuré par po-2024) dit autre chose :myia-po-2024-fast-guards, qui est Windowscoursia-linuxportécoursia-linux-runner:2.336.0Conséquence :
linux-self-hosted-tests.ymlcible un label orphelin. Un dispatch mettrait le job en file indéfiniment — pas d'échec, pas de rouge, une attente muette qu'aucuntimeout-minutesne coupe (il ne court qu'à partir du démarrage du job). Le piège est dormant aujourd'hui — 0 run en file, vérifié — et cesse de l'être au premier dispatch. L'en-tête du workflow porte désormais la précondition et la commande d'une ligne qui la teste (sortie vide = ne pas dispatcher).C'est ma propre erreur en amont : j'avais tranché le design-gate #13378 en m'appuyant sur cette page, donc sur une conception que je lisais comme un déploiement.
Ce qui n'est pas un blocage
manage_self_hosted_runner.pyest Windows-only par validation (« must pin an official Windows x64 archive ») : il ne peut pas porter un profil Linux. Ce n'est pas la condition du débrayage —supervise.shfonctionne sans lui et sans PR préalable. L'étendre aux profils Linux est un suivi.Ce que cette PR ne prouve pas
Aucun job n'a encore tourné sur un conteneur Linux. Tant que la preuve d'identité (
RUNNER_OS = Linuxdans les logs) n'est pas rendue, aucun vert de cette chaîne ne prouve le routage — leçon po-2024 du run 33178577527, où l'échec s'était produit pour la mauvaise raison (ACE manquante surC:\CoursIA-Runners) et aurait pu passer pour un succès. La bascule des jobsubuntu-latestreste gelée jusqu'à cette preuve et à la mesure d'empreinte par po-2024.Aucun job déclenché par
pull_requestne passe en self-hosted tant que #13897 ou #13947 (garde fork, #13874) n'est pas vert — le dépôt est public et ~95 forks étudiants existent.See #13378