Repository navigation
feat(runners,#14329): mode persistent du runner conteneurise -- enregistrement unique, restart sans token - #17007
Conversation
…istrement unique, restart sans token RUNNER_MODE=persistent dans l'entrypoint : le conteneur --restart unless-stopped fait son propre polling, le superviseur hote (mort au logoff, reboot 2026-09-02 : flotte retombee a 1 runner) devient inutile. - volume de config PAR SLOT sur /opt/runner (.runner/.credentials/ binaires) ; l'image extrait aussi vers /opt/runner-dist et l'entrypoint restaure un volume cree vide depuis cette source vierge - token requis au PREMIER enregistrement seulement : aux restarts, .runner present => run.sh direct, aucune variable requise - pas de trap config.sh remove (desenregistrer au EXIT tuerait la propriete meme du mode) ; --replace a l'enregistrement couvre la recreation du volume - --ephemeral reste le defaut : chemin ephemeral inchange, retro-compatible Tests : test_entrypoint_persistent.sh 13/13 PASS (extraction du bloc reel + fixtures de repertoires, methode test_entrypoint_disarm.sh) ; non-regression disarm 10/10, work_cache_health 22/22. Doc : docs/ci/self-hosted-runners.md -- cout de la non-ephemeralite ecrit (etat persistant entre jobs, hooks _work au boot du conteneur et non par job, slot offline consomme son inscription) et pourquoi accepte (aucun pull_request_target self-hosted, garde fork/payload). Validation systemctl restart docker et mesure checkout avant/apres : au deploiement po-2024, jamais ai-01. See #14329 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
Path-collision (organ #13359/#13615)Cette PR #17007 (
|
|
[ADJOINT PREFLIGHT] |
Grain: MED/tooling — lane myia-po-2027:CoursIA — prev: DEEP/qc #16960
Summary
Mode
persistentdu runner Linux conteneurisé (#14329, reprise du claim po-2024 stale 384 h) : un conteneur--restart unless-stoppeddont le runner non-éphémère fait son propre polling. Le maillon qui mourait au logoff — le superviseur hôte qui remintait un token à chaque job (reboot 2026-09-02 : flotte retombée à 1 runner,PR gategelés en STARVED) — disparaît du chemin critique.Ce qui change
entrypoint.sh: blocRUNNER_MODE=persistenttestable (marqueursTEST-ENTRYPOINT-PERSISTENT-*).RUNNER_HOME(/opt/runner) = point de montage du volume de config par slot ;RUNNER_DIST(/opt/runner-dist) = source vierge de l'image ;runner_restore_distrestaure un volume créé vide ;runner_is_registereddétecte.runner;require_registration_envregroupe les:?(token/url/name/labels exigés au premier enregistrement seulement). Branche persistent :.runnerprésent →run.shdirect sans aucune variable ; absent →config.sh --unattended --disableupdatesansEPHEMERAL. Pas de trapconfig.sh remove.--ephemeralreste le défaut, chemin ephemeral inchangé (rétro-compatible, acceptance case 1).Dockerfile: tarball extrait vers/opt/runner-distpuis copié vers/opt/runner;entrypoint.sh/work_cache_health.shcopiés dans les DEUX layouts ; chown étendu à runner-dist.test_entrypoint_persistent.sh(nouveau, familletest_entrypoint_disarm.sh: extraction du bloc réel par marqueurs sed + fixtures de répertoires, décision sur l'état du filesystem) : restauration volume vide, idempotence silencieuse, détection.runnersans env, absence.runner, token exigé au premier boot, défaut ephemeral +RUNNER_MODE=persistentlu, home enregistré conservé.docs/ci/self-hosted-runners.md: sous-section « Mode persistent » — commande de lancement--restart unless-stoppedavec volumes config +_work, coût de la non-éphéméralité écrit (état persistant entre jobs ; hooks _work sparse/dangling/wch au boot du conteneur au lieu de chaque job — couverture moins fréquente, assumée ; slot offline consomme son inscription) et pourquoi c'est accepté (aucunpull_request_targetself-hosted, garde fork/payload universelle).Validation
bash -n entrypoint.shtest_entrypoint_persistent.shtest_entrypoint_disarm.sh(non-régression)test_work_cache_health.sh(non-régression)Acceptance #14329 — état
--ephemeraldéfaut rétro-compatible--restart unless-stoppedvérifié parsystemctl restart docker_work#14288 + config combinés)See #14329— la PR livre le mode dans l'image + entrypoint + tests + doc ; les cases 3/5 sont les gestes de déploiement sur la machine dédiée aux validations destructives.Grain REPAIR — note de reprise
Claim po-2024 stale 384 h repris par cette lane (issuecomment du claim posé avant édition,
paths:sur les 4 fichiers). Le prérequis #15105 (work_cache_health) et les hooks _work existants sont conservés et étendus, pas remplacés — leur sémantique en mode persistent change (boot vs job-started) et ce changement est documenté, pas masqué.🤖 Generated with Claude Code