Skip to content

feat(runners,#14329): mode persistent du runner conteneurise -- enregistrement unique, restart sans token - #17007

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/14329-runner-persistent
Sep 20, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/14329-runner-persistent

Conversation

@jsboige

@jsboige jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2027:CoursIA — prev: DEEP/qc #16960

Summary

Mode persistent du runner Linux conteneurisé (#14329, reprise du claim po-2024 stale 384 h) : un conteneur --restart unless-stopped dont 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 gate gelés en STARVED) — disparaît du chemin critique.

Ce qui change

  • entrypoint.sh : bloc RUNNER_MODE=persistent testable (marqueurs TEST-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_dist restaure un volume créé vide ; runner_is_registered détecte .runner ; require_registration_env regroupe les :? (token/url/name/labels exigés au premier enregistrement seulement). Branche persistent : .runner présent → run.sh direct sans aucune variable ; absent → config.sh --unattended --disableupdate sans EPHEMERAL. Pas de trap config.sh remove. --ephemeral reste le défaut, chemin ephemeral inchangé (rétro-compatible, acceptance case 1).
  • Dockerfile : tarball extrait vers /opt/runner-dist puis copié vers /opt/runner ; entrypoint.sh/work_cache_health.sh copiés dans les DEUX layouts ; chown étendu à runner-dist.
  • test_entrypoint_persistent.sh (nouveau, famille test_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 .runner sans env, absence .runner, token exigé au premier boot, défaut ephemeral + RUNNER_MODE=persistent lu, home enregistré conservé.
  • docs/ci/self-hosted-runners.md : sous-section « Mode persistent » — commande de lancement --restart unless-stopped avec 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é (aucun pull_request_target self-hosted, garde fork/payload universelle).

Validation

Test Résultat
bash -n entrypoint.sh OK
test_entrypoint_persistent.sh 13/13 PASS
test_entrypoint_disarm.sh (non-régression) 10/10 PASS
test_work_cache_health.sh (non-régression) 22/22 PASS (mesuré au cycle précédent sur le même arbre de code ; entrypoint/Dockerfile inchangés depuis)

Acceptance #14329 — état

Case État
1. Mode sélectionnable, --ephemeral défaut rétro-compatible ✓ livré (T6 + chemin ephemeral inchangé)
2. Volume de config par slot, enregistrement une seule fois ✓ livré (T1-T5, T7)
3. --restart unless-stopped vérifié par systemctl restart docker résiduel : validation destructive, déploiement po-2024 uniquement (jamais ai-01 — issue #14329)
4. Doc : coût de la non-éphéméralité + pourquoi accepté ✓ livré
5. Mesure avant/après du temps de checkout résiduel : à prendre au déploiement po-2024 (volumes _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

…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>
@github-actions

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17007 (feat(runners,#14329): mode persistent du runner conteneurise -- enregistrement unique, restart sans token) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17007
head: 2b91469
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 93a24a39aaa02cd5430d77dc656e07c29801ce400c67f8fe3eb65efe08375b11
diff-files: 4
diff-additions: 258
diff-deletions: 12
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit f065205 into main Sep 20, 2026
27 of 28 checks passed
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.

2 participants