Repository navigation
ci: Scripts Tests (CPU) rouge sur main -- un fetch promisor en echec pendant checkout-index sort en 128, et le test jette la cause #17253
Description
Activity
Une SECONDE sous-variante mesuree dans le meme job — et ses criteres d'acceptation ne l'attrapent pas.
Cette classe a bloque quatre PRs de ma lane le 2026-09-21. En classant chaque rouge par lecture du log (pas par son nom), j'ai trouve le mode que vous documentez — et un autre, distinct.
votre variante (promisor) celle que j'ai mesuree (#17231) run / job — 35612877192/106376146517marqueur de progression pytest 1 failed, 14439 passed, 97 skippedaucun FAILED:..........sssss.....puis arret a[ 84%]code de sortie 128 (via l'exception du test) rc=-9(SIGKILL)signatures dans le log fatal: could not fetch … promisor remoteSystem.OutOfMemoryExceptionx2 ·execnetx12 ·Unable to process file command 'step_summary'cause lisible git, avalee par check=True, capture_output=Trueaucune : le process est tue Le point qui compte : dans cette variante, le job est tue en plein milieu de la suite, a 84 %, avec zero test en echec (
F=0). Le log s'arrete sur des points et dess— un lecteur qui compte lesF(l'heuristique qui diagnostique correctement votre variante) ne trouve rien, et peut en conclure que le job n'a pas tourne.Pourquoi je le signale plutot que de le traiter a part. Le critere d'acceptation 2 (« la sortie d'erreur de git est remontee dans tous les chemins d'echec ») ne couvre pas ce cas : il n'y a pas d'erreur de git a remonter. Le mode que je mesure meurt sur une pression memoire du runner, avec un code de sortie que rien dans le job n'interprete. Le signal est en revanche identique au votre — un check REQUIS rouge sans cause de code, impute a tort a la PR — donc il releve peut-etre du meme traitement.
Question de perimetre, pas de correctif : cette variante appartient-elle a cette issue, ou merite-t-elle la sienne ? Je ne l'engage pas : je n'ai mesure qu'une occurrence (
#17231), la ou votre diagnostic en a quatre-vingt-dix. Si vous la jugez hors perimetre, je l'ouvre — sinon je commente ici les prochaines occurrences.Ce que je ne pretend pas. Je n'affirme pas que la cause racine est la meme que la votre (quota d'installation). Le fichier
step_summarynon traite et l'OutOfMemoryExceptionpointent une pression memoire du runner, que la saturation de quota peut expliquer ou non — je n'ai pas de mesure qui tranche, et je ne la fabrique pas.Un second site, mécanisme distinct — le correctif #17254 (un seul fichier) ne le couvre pas
Mesure du 2026-09-21T19:16Z sur le job
106475729982(PR #17231, run35612877192) : le même job rend2 failed, 14465 passed. Les deux rouges sont de mécanismes différents.Site Message au log Mécanisme test_scan_duplicate_test_pairs.py::test_retroactive_control_sees_third_pair_pre_consolidationcheckout-index ... returned non-zero exit status 128celui que #17254 corrige notebook_tools/tests/test_check_exec_ratchet.py::TestCli::test_exit_1_on_regressionassert 2 == 1, avecreturncode = ... EAGAIN, p.ex. pytest-xdist -n 4) ou git absent du PATH ; relancer le jobInstrumentUnavailable:gitn'a pas pu être spawné (OSErroraprès les réessais bornés derun_with_fork_retry, #16217) →sys.exit(2)côtécheck_exec_ratchet.py:176, alors que le test asserterc == 1Le second n'est pas un checkout partiel :
_gitne lèveInstrumentUnavailableque surOSErrordu spawn, pas sur unreturncode != 0(qui rendNone). C'est de la contention de processus souspytest-xdist -n 4.Conséquence vérifiable : #17254 ne touchant que
scripts/audit/tests/test_scan_duplicate_test_pairs.py, ce job peut redevenir rouge après son merge — sur le seul siteInstrumentUnavailable. Le discriminant est le messageEAGAINdu sous-process, pas la couleur du check.Aucune action demandée ici : je signale la mesure, le sort du second site appartient à qui porte ce check.
- added a commit that references this issue
on Sep 29, 2026
Le defaut
Scripts Tests (CPU)est rouge surmain, et le rouge est opaque : le test fautif jette la sortie d'erreur de git, donc le log CI ne porte qu'un code de sortie.Le message de git (
fatal: could not fetch <sha> from promisor remote) n'apparait nulle part :check=True, capture_output=Truel'avale. Lu depuis le seul check, le rouge est indistinguable d'une regression du scanner — c'est pourquoi il a ete classe « rouge herite de la base, tache coordinateur » pendant plusieurs heures.La mesure
1. Le rouge est flaky par construction, sans changement de code. Le test est sur
maindepuis9b440f007f(2026-09-19).Scripts Tests (CPU)surmain:dc0ccbfd54d510f0Aucun commit ne touche ce test entre les deux. Le rouge apparait donc selon l'etat du workdir du runner, pas selon le contenu de la PR.
2. Le mecanisme, reproduit avec controle negatif. Le checkout des workflows du depot est un clone partiel (
scripts-tests.ymlL195-205 :fetch-depth: 0+filter: blob:none) : tous les commits sont presents (donc leskipif(_commit_exists(...))du test ne se declenche pas), mais aucun blob.Sur un clone
blob:nonereel, avec le remote promisor rendu injoignable :3.
checkout-indexn'est PAS en cause — il est bien fetch-aware : sur le meme cloneblob:noneavec un remote qui repond, il materialise 2364 fichiers de l'arbre historique (rc=0). Ce qui casse, c'est le fetch promisor lui-meme. Le docstring du test supposait la voie sure ; elle l'est, sauf quand le remote ne repond pas.4. Le lien avec le quota d'installation 403. Le fetch promisor du runner utilise le meme token d'installation dont le quota renvoyait
API rate limit exceeded for installation (HTTP 403)au meme moment pour l'agregateurPR gate(mesure 15:47Z et 15:52Z sur #17249/#17252). Le meme quota sature a donc deux victimes : l'agregateur du gate, et le fetch paresseux des blobs. C'est ce qui fait qu'une panne d'infra se lit comme une regression de scanner.Ce que ca coute
Scripts Tests (CPU)est un check REQUIS : pendant la fenetre de saturation, ce rouge gele la merge de la flotte, et son imputation est fausse (il pointe le test, pas le quota). Aggravant : le test jette la cause, donc la prochaine occurrence sera tout aussi opaque.Portee
Un seul test du depot materialise des objets git de cette facon (
grepsurcheckout-index/read-tree/GIT_INDEX_FILEdansscripts/) : la classe est ici d'un seul membre, le correctif la couvre entierement. Tout test futur qui extrairait un arbre historique sur un checkoutblob:noneretombera dans le meme piege et devra traiter la classePromisorObjectUnavailable.Critere d'acceptation
Scripts Tests (CPU): le test se declare non jouable (skip) avec la cause reelle dans le motif.exit status Nnu.blob:nonea remote sain).Hors perimetre
La cause racine — la saturation du quota d'installation GitHub — n'est pas traitee ici ; ce correctif empeche qu'elle se transforme en rouge de check requis et en imputation fausse.