Skip to content

fix(ci): myia-ai-01 (write) recoit 403 sur registration-token -- la boucle retente a l'infini une cause structurelle #15154

Description

@myia-ai-01

Le defaut

Le superviseur de runners tourne sur ai-01 sous le compte myia-ai-01. Ce compte ne peut pas obtenir de registration token : sans COURSIA_RUNNER_GH_ACCOUNT=jsboige, la boucle de slot tourne indefiniment sur un refus de 60 s en 60 s. La CI ne demarre jamais, et rien ne l'indique ailleurs que sur stderr du superviseur.

Mesure firsthand (2026-09-08, depuis ai-01)

POST repos/jsboige/CoursIA/actions/runners/registration-token
  sous myia-ai-01 -> HTTP 403
  sous jsboige    -> token OK (longueur 29)

GET repos/jsboige/CoursIA/actions/runners
  sous myia-ai-01 -> HTTP 403

Ce qui rend le diagnostic trompeur

ce que GitHub repond ce qui est vrai
« You must have repository read permissions or have the repository runners fine-grained permission » myia-ai-01 a permission: write, role_name: write sur le depot
(implicite : il manque un scope) le token porte repo, workflow, read:org, gist

Le compte a plus que ce que le message reclame, et echoue quand meme. La cause reelle est que les endpoints de runners self-hosted exigent l'admin du depot, pas le write -- le message d'erreur nomme la mauvaise exigence. Un operateur qui le lit litteralement va verifier des droits qui sont deja la, et conclure a un probleme de scope qui n'existe pas.

C'est aussi pourquoi la prescription qui circulait dans nos notes -- « faire de jsboige le defaut avec une erreur claire plutot qu'un blocage silencieux » -- etait a moitie fausse : le blocage n'est pas silencieux. #14259 a deja retire le 2>/dev/null de fetch_token, et la boucle affiche [slot N] token indisponible (droit admin gh ?) -- nouvelle tentative dans 60 s. Elle nomme meme la bonne hypothese. Ce qui manque n'est pas le message, c'est qu'il n'aboutit jamais.

Deux voies, a arbitrer -- elles ne s'equivalent pas

A. Donner l'admin a myia-ai-01. Supprime la dependance a un compte partage. Mais l'admin porte aussi la protection de branche et les reglages du depot : c'est une elevation reelle, pas un ajustement. Decision user.

B. Rendre l'epinglage obligatoire et le refus terminal. Garder jsboige comme compte de registration, mais : si aucun COURSIA_RUNNER_GH_ACCOUNT n'est defini et que le compte ambiant echoue au premier fetch, refuser de demarrer avec le diagnostic complet, au lieu de boucler. Une boucle infinie sur une cause structurelle est un faux « en cours » -- elle a la meme signature qu'une panne reseau transitoire, qui elle merite le retry.

Ma recommandation est B, avec un plafond de tentatives : la cause « le compte n'a pas le droit » ne se resout jamais toute seule, alors que « l'API est momentanement indisponible » se resout. Les distinguer par le code HTTP (403 -> terminal, 5xx/reseau -> retry) est le bon discriminant, et il est disponible.

Critere d'acceptance

  • Un demarrage sous un compte sans droit runners echoue vite, en nommant le compte utilise, le code HTTP, et les deux voies ci-dessus.
  • Un 5xx ou une coupure reseau continue de retenter (controle positif : ne pas transformer un garde en fragilite).
  • Test couvrant les deux branches -- 403 terminal vs 503 retente. La suite actuelle teste l'epinglage (Test 7) mais aucune des deux issues de l'echec.
  • Si voie A retenue : verifier apres coup que myia-ai-01 obtient bien un token, et retirer l'epinglage devenu inutile.

Trouve en remettant la CI en service pour #15091.

Activity

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions