Skip to content

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

@jsboige

Le symptome

Depuis ~01h30 UTC le 2026-09-06, une part des jobs echoue a Set up job — avant le moindre checkout, donc avant toute ligne de notre code. Toutes les PRs ouvertes portent un PR gate rouge, 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 success pour 9 failure. 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, runner myia-ai-01-wsl-8 :

02:39:48  Download action repository 'actions/checkout@v4'      <- passe (33 s)
02:40:21  Download action repository 'actions/setup-python@v5'
02:42:02  ##[warning] Failed to download action '.../setup-python/tar.gz/a26af69b...'.
          Error: The request was canceled due to the configured HttpClient.Timeout of 100 seconds elapsing.
02:43:58  ##[warning] (2e tentative, meme erreur)
02:46:04  ##[error]   Failed to download archive '...' after 3 attempts.

Mesure directe depuis ai-01 sur le meme URL, 2026-09-06T02:51Z, deux essais :

Essai Recu Duree Debit
1 155 567 o 45,0 s 3 456 o/s
2 435 342 o 45,0 s 9 671 o/s

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@v4 passe parce qu'il est plus petit. Le discriminant est taille / debit, pas la joignabilite : api.github.com repond (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 :

Run Job Runner
34006922355 PR gate myia-ai-01-linux-waiter-3
34006922347 cell-source-parses myia-ai-01-linux-docker-4
34006922285 markdown-rendering guard myia-po-2024-linux-docker-3
34005835653 markdown-rendering guard myia-ai-01-wsl-5
34005835628 probeAddresses banner guard myia-ai-01-wsl-7
34005835618 validate myia-po-2024-linux-docker-1
34005829785 PR gate myia-ai-01-linux-waiter-6
34005829698 Gitleaks positive controls (#10143) myia-ai-01-wsl-7
34005829691 Always-on metadata guards myia-po-2024-linux-docker-8
34005829675 Always-on guards myia-ai-01-linux-docker-8
34005484627 Always-on guards myia-ai-01-linux-docker-2
34005484616 Always-on metadata guards myia-po-2024-linux-docker-2
34005225785 validate myia-po-2024-linux-docker-5

Deux consequences a lire ensemble : aucune de ces lignes n'est imputable a une lane, et PR gate lui-meme echoue a Set 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-python est un pile-ou-face, et un rerun ne 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 grep ASCII rend zero sur les quatre, y compris sur un temoin connu, donc toute mesure faite en ASCII est aveugle :

Variable Assembly Ce qu'elle offre
ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE Runner.Common.dll repertoire d'archives d'actions pre-semees : le runner sert l'action depuis le disque au lieu de codeload
ACTIONS_RUNNER_SYMLINK_CACHED_ACTIONS Runner.Common.dll lie l'action depuis le cache plutot que de la recopier
ACTIONS_RUNNER_HTTP_TIMEOUT / ACTIONS_RUNNER_HTTP_RETRY Runner.Sdk.dll releve le plafond de 100 s / le nombre de tentatives
ACTIONS_RUNNER_DOWNLOAD_TIMEOUT Runner.Listener.dll idem cote listener

Le 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 dans Runner.Worker.dll. Un controle positif est donc lisible dans le log du job, pas seulement deduit.

Acceptance

  1. A1 — Semer le cache. L'image coursia-linux-runner (et coursia-lean-runner) embarque un repertoire d'archives pour les actions que nos workflows utilisent reellement, et ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE pointe dessus. La liste des actions se mesure sur les workflows du depot, elle ne se devine pas :
    grep -rhoE '^\s*uses:\s*[^ ]+' .github/workflows/*.yml | sed 's/.*uses:\s*//' | sort | uniq -c | sort -rn
  2. A2 — Controle positif exige. Le job de validation montre dans son log Found action archive '...' (ou Action archive cache usage: avec use cache) pour actions/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.
  3. A3 — Controle negatif. Retirer une action du cache et verifier que le log retombe sur le telechargement : sinon on ne sait pas si la variable est lue.
  4. A4 — Relever le plafond en filet. ACTIONS_RUNNER_HTTP_TIMEOUT porte 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.
  5. A5 — Ne pas confondre avec un defaut de contenu. Tant que ce ticket est ouvert, un Set up job rouge portant la signature codeload ... HttpClient.Timeout of 100 seconds n'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

Activity

  1. jsboige commented on Sep 13, 2026

    @jsboige
    OwnerAuthor

    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.gz sur Linux — le / de owner/repo devient _, et la cle est le SHA resolu, pas le tag. Forme alternative (dossier deploye) si ACTIONS_RUNNER_SYMLINK_CACHED_ACTIONS=true.
    • A4 porte un nom de variable FAUX. ACTIONS_RUNNER_HTTP_TIMEOUT n'existe pas : grep sur Constants.cs ne liste que ARCHIVE_CACHE et SYMLINK_CACHED_ACTIONS. Le levier reel est GITHUB_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.

  2. added a commit that references this issue on Sep 14, 2026
  3. jsboige commented on Sep 16, 2026

    @jsboige
    OwnerAuthor

    [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 :

    1. 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).
    2. 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) ou Twin Parity Check — zéro échec Set up job. Le run Scripts Tests (CPU) 35139315473 a tourné ~35 min ce soir sur le runner self-hosted sans crash de setup.
    3. 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.)

  4. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 17, 2026
  5. jsboige commented on Sep 18, 2026

    @jsboige
    OwnerAuthor

    [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 :

    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.

  6. jsboige commented on Oct 3, 2026

    @jsboige
    OwnerAuthor

    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 runner Found 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 cache ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE reste 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).

  7. added a commit that references this issue on Oct 7, 2026
  8. added a commit that references this issue on Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions