Repository navigation
CI: 'Set up job' echoue fleet-wide — l'archive d'une action depasse le timeout 100 s de codeload (fix: ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE) #14853
Description
Activity
Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: DEEP/notebook-python #15902
[CLAIMED] lane myia-po-2024:CoursIA -- paths: scripts/ci/docker/linux-runner/**, scripts/tests/test_action_cache_seed_guard.py, docs/ci/self-hosted-runners.md
A1 + A4, mesures dans le source du runner avant d'ecrire (rien devine) :
- Convention de cache (
ActionManager.cs,PrepareRepositoryAsync) :$ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE/<owner>_<repo>/<ResolvedSha>.tar.gzsur Linux — le/deowner/repodevient_, et la cle est le SHA resolu, pas le tag. Forme alternative (dossier deploye) siACTIONS_RUNNER_SYMLINK_CACHED_ACTIONS=true. - A4 porte un nom de variable FAUX.
ACTIONS_RUNNER_HTTP_TIMEOUTn'existe pas :grepsurConstants.csne liste que ARCHIVE_CACHE et SYMLINK_CACHED_ACTIONS. Le levier reel estGITHUB_ACTIONS_RUNNER_HTTP_TIMEOUT(Runner.Sdk/Util/VssUtil.cs, deux sites), en secondes, clampe a [100, 1200]. Tel qu'ecrit, A4 poserait une variable inerte — donc un fix muet.
Levier ecarte : le cache embarquera les archives au build et la resolution tag->SHA se fera au build avec le meme mecanisme que le runner (
git ls-remote+ deref^{}), pour que la cle de build et la cle de run coincident.Docker + les deux images (
coursia-linux-runner,coursia-lean-runner) sont presents sur cette machine : A1 sera prouve par un build local, pas par un raisonnement.- Convention de cache (
- added a commit that references this issue
on Sep 14, 2026 [INFO] candidate-delivered — [lane myia-po-2025:CoursIA] (tirage picker, urne delivered ; rend la main au coordinateur pour fermeture #15069)
Le fix est livré sur main depuis le 2026-09-14 : PR #15990 MERGED (2026-09-14T04:00:43Z, « fix(ci,#14853): cache d'archives d'actions embarqué au build de l'image runner », Grain MED/tooling po-2024). Vérification firsthand à l'instant :
- La cause correspond : l'issue mesure le timeout codeload 100 s sur les archives d'actions (1 936–39 530 o/s mesurés, archive setup-python 1 569 541 o) ; fix(ci,#14853): cache d'archives d'actions embarque au build de l'image runner #15990 embarque ces archives une fois au build de l'image runner (seed_action_cache.py + Dockerfile + ENV), exactement ce que le titre de l'issue prescrit (
ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE). - Le symptôme a disparu : les 12 derniers runs en échec du dépôt (fenêtre 22:55Z–23:33Z du 16/09) sont tous
PR gate(DWELL/agrégation) ouTwin Parity Check— zéro échecSet up job. Le runScripts Tests (CPU)35139315473 a tourné ~35 min ce soir sur le runner self-hosted sans crash de setup. - Un garde perpétue le fix :
scripts/tests/test_action_cache_seed_guard.py(livré par fix(ci,#14853): cache d'archives d'actions embarque au build de l'image runner #15990) rejoue la mesure sur les workflows et rougit si la liste d'actions diverge.
Acceptance couverte de bout en bout — l'issue reste ouverte uniquement parce que le body de #15990 porte
fix(ci,#14853)en titre sans clause de fermeture. Vérifiable par le coordinateur (G.9) :gh pr view 15990+ le point 2.(Note : un premier post de ce commentaire a été corrompu par des substitutions de shell — supprimé et reposté intégralement.)
- La cause correspond : l'issue mesure le timeout codeload 100 s sur les archives d'actions (1 936–39 530 o/s mesurés, archive setup-python 1 569 541 o) ; fix(ci,#14853): cache d'archives d'actions embarque au build de l'image runner #15990 embarque ces archives une fois au build de l'image runner (seed_action_cache.py + Dockerfile + ENV), exactement ce que le titre de l'issue prescrit (
- addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 17, 2026 [ADJOINT CLOSE] Adjugée CLOSE_WITH_FOLLOWUP — campagne de consolidation du 2026-09-18 (mandat ai-01 2026-09-18T03:12Z, fermeture déléguée, fille ouverte AVANT fermeture).
Livré, vérifié firsthand :
- PR fix(ci,#14853): cache d'archives d'actions embarque au build de l'image runner #15990 MERGED 2026-09-14T04:00Z — A1 (cache embarqué, 13 actions en SHA résolu) + A4 (GITHUB_ACTIONS_RUNNER_HTTP_TIMEOUT=420, clamp [100,1200]) ; symptôme disparu (0 échec Set up job sur les 12 derniers runs au 16/09) — confirmé par po-2025.
Résidu tracé en fille : #16654 #16654 — A2/A3 : contrôles positif/négatif sur log de job réel (exige image reconstruite + redéployée), explicitement laissés hors fermeture par le body du PR.
Réouvrir en citant le critère manquant si contestation.
A2/A3 livrés (followup de cette issue, via #16654) — les deux preuves sur jobs réels, run 37093241932 :
- A2 hit (
setup-python@<SHA seedé>) : diag runnerFound action archive '/opt/actions-cache/actions_setup-python/a26af69….tar.gz' in cache directory, zéro requête codeload, cache byte-identique après le job. - A3 miss (
setup-java@v4) :Save archive 'https://codeload.github.com/actions/setup-java/tar.gz/cf277c60…'→ HTTP OK — fallback réseau confirmé. - Réfutation : le « cache enrichi » n'existe pas au runtime (pin 2.337.0) — l'archive miss atterrit dans
_work/_actions/_temp_<guid>/, le cacheACTIONS_RUNNER_ACTION_ARCHIVE_CACHEreste read-only. Seul le build écrit le cache ; le garde zéro-trou est l'unique barrière.
Détail complet + méthode rejouable : #16654 (c.5965108437) et PR #18942 (section doc
self-hosted-runners.md).- A2 hit (
- added a commit that references this issue
on Oct 7, 2026 - added a commit that references this issue
on Oct 10, 2026
Le symptome
Depuis ~01h30 UTC le 2026-09-06, une part des jobs echoue a
Set up job— avant le moindrecheckout, donc avant toute ligne de notre code. Toutes les PRs ouvertes portent unPR gaterouge, et la plupart des organes advisory sont rouges avec elles.Ce n'est pas une panne totale : sur les 120 derniers runs, l'heure 02h UTC compte 23
successpour 9failure. C'est un echec proportionnel a la taille de l'action a telecharger, pas un echec de connectivite.La cause, mesuree
Log du job
Notebook catalog drift (read-only), run 34006922343, runnermyia-ai-01-wsl-8:Mesure directe depuis ai-01 sur le meme URL, 2026-09-06T02:51Z, deux essais :
La taille annoncee par le serveur est 1 569 541 octets. A ce debit, l'archive demande 160 a 450 secondes — le runner abandonne a 100 s, trois fois, puis echoue le job.
actions/checkout@v4passe parce qu'il est plus petit. Le discriminant est taille / debit, pas la joignabilite :api.github.comrepond (HTTP 200) pendant tout ce temps.La signature est uniforme, et elle traverse les machines
Sur les 14 derniers runs en echec, 13 echouent a
Set up job. Le 14e n'expose pas de job en echec (run annule). Les runners porteurs couvrent les deux machines et les trois familles de pool :PR gatemyia-ai-01-linux-waiter-3cell-source-parsesmyia-ai-01-linux-docker-4markdown-rendering guardmyia-po-2024-linux-docker-3markdown-rendering guardmyia-ai-01-wsl-5probeAddresses banner guardmyia-ai-01-wsl-7validatemyia-po-2024-linux-docker-1PR gatemyia-ai-01-linux-waiter-6Gitleaks positive controls (#10143)myia-ai-01-wsl-7Always-on metadata guardsmyia-po-2024-linux-docker-8Always-on guardsmyia-ai-01-linux-docker-8Always-on guardsmyia-ai-01-linux-docker-2Always-on metadata guardsmyia-po-2024-linux-docker-2validatemyia-po-2024-linux-docker-5Deux consequences a lire ensemble : aucune de ces lignes n'est imputable a une lane, et
PR gatelui-meme echoue aSet up job— l'agregateur requis ne demarre pas, donc toutes les PRs ouvertes portent un rouge requis, quel que soit leur contenu.Pourquoi ca merite un fix structurel et pas une attente
Le debit remonte par a-coups (1 936 o/s a 02:03Z, 39 530 o/s a 02:27Z, 3 456 o/s a 02:51Z). Tant qu'il oscille sous ~16 Ko/s, chaque job qui utilise
actions/setup-pythonest un pile-ou-face, et unrerunne fait que rejouer le tirage. La flotte peut bruler des cycles entiers a relancer du rouge que rien dans le depot n'explique.Et le cout est asymetrique : ce sont les 12 organes advisory qui tombent en premier, donc un echec d'infra et « aucune violation trouvee » rendent la meme couleur — le meme defaut de lisibilite que #14849.
Deux leviers reels, verifies dans le binaire du runner
Runner 2.336.0 (celui de nos images). Les variables ci-dessous ont ete extraites des litteraux UTF-16 des assemblies .NET — un
grepASCII rend zero sur les quatre, y compris sur un temoin connu, donc toute mesure faite en ASCII est aveugle :ACTIONS_RUNNER_ACTION_ARCHIVE_CACHERunner.Common.dllcodeloadACTIONS_RUNNER_SYMLINK_CACHED_ACTIONSRunner.Common.dllACTIONS_RUNNER_HTTP_TIMEOUT/ACTIONS_RUNNER_HTTP_RETRYRunner.Sdk.dllACTIONS_RUNNER_DOWNLOAD_TIMEOUTRunner.Listener.dllLe mecanisme de cache s'instrumente lui-meme — les chaines
Action archive cache usage:,Check if action archive '... ' already exists in cache directory ',Found action archive ',Copied action archive 'sont dansRunner.Worker.dll. Un controle positif est donc lisible dans le log du job, pas seulement deduit.Acceptance
coursia-linux-runner(etcoursia-lean-runner) embarque un repertoire d'archives pour les actions que nos workflows utilisent reellement, etACTIONS_RUNNER_ACTION_ARCHIVE_CACHEpointe dessus. La liste des actions se mesure sur les workflows du depot, elle ne se devine pas :Found action archive '...'(ouAction archive cache usage:avecuse cache) pouractions/setup-python. Un job vert ne prouve rien : il est indiscernable d'un job vert parce que le WAN allait bien a cet instant. Seule la ligne de cache prouve que le cache a servi.ACTIONS_RUNNER_HTTP_TIMEOUTporte a une valeur qui couvre 1,5 Mo a 5 Ko/s (≥ 400 s), pour les actions hors cache. Le filet ne remplace pas A1 : il rend le job lent au lieu de rouge.Set up jobrouge portant la signaturecodeload ... HttpClient.Timeout of 100 secondsn'est pas imputable a la lane. Le dire dans le commentaire de la PR, ne pas demander de reparation.Ce que ce ticket ne dit pas
Il ne dit pas pourquoi le debit WAN est degrade — c'est hors du depot. Il dit que notre CI n'a pas a en dependre pour des archives qui sont, par construction, les memes a chaque run.
Voir aussi
always-on-guards: le meme echec de checkout rendcap_reached=Falsepar defaut permissif. Meme classe : un echec d'infra qui se lit comme un verdict.