Repository navigation
ci(ict,#14598): add uncensored tests profile probe - #15712
Conversation
… tests/ (55) Sous-grain #14598 (acceptance reprise 1 : "une mesure non censuree"). Le plafond production timeout-minutes: 30 d'ict-tests.yml censure a droite les runs coupes (6/11 des 30 derniers, "cancelled" a 30.4-30.5 min) : leur duree reelle est inconnue, et l'unique succes (28.6 min) est par construction le plus rapide des runs ayant termine. Aucun recalibrage de plafond n'est defendable sans un point non censure. Nouveau workflow diagnostique .github/workflows/ict-tests-profile.yml -- ict-tests.yml n'est PAS modifie, le plafond de production 30 min reste inchange : - declencheurs : pull_request self-cover (son propre fichier uniquement, convention #8822) + workflow_dispatch (runs de mesure sur main). - runner statique [self-hosted, coursia-ephemeral, coursia-linux], garde anti-fork identique a ict-tests.yml (forme universelle #13874). - concurrency FIXE (groupe constant, sans cle github.ref) + cancel-in-progress: false : une mesure en cours ne doit jamais etre annulee -- une mesure interrompue est censee, exactement le defaut que la sonde existe pour eviter. - timeout-minutes: 90 : la borne de mesure, distincte de la borne de production (30). Plafond releve, pas retire (#15698). - Python 3.9 + venv per-job sous runner.temp (fix #14571 : toolcache partage du pool ephemeral) + garde pip-show + export GITHUB_PATH. - commande exacte : pytest tests --tb=short -v --durations=25 --durations-min=0 ; exit code pytest preserve a travers tee via PIPESTATUS[0] puis re-exporte (verifie sous bash -eo pipefail). - GITHUB_STEP_SUMMARY : elapsed, runner, exit code pytest. - log complet en artifact actions/upload-artifact@v4, if: always(). Entree correspondante dans SELF_HOSTED_WORKFLOW_ALLOWLIST (scripts/ci/check_self_hosted_runner_policy.py) : le garde fast-lane bloquant self-hosted-runner-policy et le test repo-courant test_current_repository_self_hosted_jobs_satisfy_isolation_policy refusent tout workflow self-hosted hors allowlist -- sans cette entree, la PR serait rouge a la creation. Retrait prevu avec le workflow dans la PR qui re-calibrera le plafond d'apres la mesure. Validations : YAML parse (PyYAML, workaround on:) ; bash -n sur les deux blocs run: ; preuve PIPESTATUS rc=3/0 sous bash -eo pipefail ; check_self_hosted_runner_policy --check OK (158 workflows, 131 jobs self-hosted, 0 violation) ; check_concurrency_conj --check OK (0 offender) ; check_unique_check_run_names --check OK (81 jobs PR, 0 doublon) ; check_workflow_label_paths PASS ; check_testpaths_coverage --verbose OK ; pytest test_check_self_hosted_runner_policy (54) + test_check_concurrency_conj (24) + test_audit_workflow_path_filters (18) + test_audit_workflow_paths_filters (9) + test_fast_lane (99) : 204 passed, 0 failed. See #14598 Co-Authored-By: Claude Code <noreply@anthropic.com>
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
Path-collision (organ #13359/#13615)Cette PR #15712 (
Le verdict terminal (#15578) signifie que la substance est deja sur |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié: YAML parsé + check_self_hosted_runner_policy.py --check rc=0 sur le workflow extrait au head 00ea6ca, avec la nouvelle entrée allowlist)
[Hermes] Sonde CI #14598 — revue avec exécution réelle :
- workflow extrait du head :
yaml.safe_loadOK ; policy checker du dépôt :[self-hosted-policy] workflows=1 jobs=1 self_hosted=1 → OK— la garde same-repo, le runs-on statique et l'entréeSELF_HOSTED_WORKFLOW_ALLOWLISTsont cohérents ; - scan secrets : rien (aucun token, aucune donnée — pytest pur + artifact log) ;
- honnêteté de la mesure :
PIPESTATUS[0]capture le code pytest réel soustee,if: always()livre le log même en échec, plafond 90 min documenté comme borne de sécurité et non comme mesure, plafond production 30 min inchangé ; - conception : concurrency à groupe FIXE sans
cancel-in-progressest le bon choix pour une mesure non censurée (une mesure interrompue est censurée — c'est le défaut que la sonde existe pour éviter) ; self-cover en seul déclencheur PR limite le coût ; - le retrait est spécifié (workflow + entrée allowlist dans la même PR de re-calibrage, acceptance 3 de #14598).
Note de coût, non bloquante : le self-cover fait tourner la sonde (job self-hosted jusqu'à 90 min) sur CETTE PR-même, puisque c'est elle qui crée le fichier — c'est cohérent (le premier point non censuré de la distribution arrive avec la PR) mais ça met un job de ~90 min sur coursia-linux dès le merge de la sonde ; le groupe de concurrency fixe protège le pool.
|
Mergée. Et la sonde a déjà rendu sa mesure, sur cette PR même — elle est trop importante pour rester dans un log de job. Le point non censuré :
|
Grain: MED/research-code — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #15708
See #14598
Résumé
tests/ (55);.github/workflows/ict-tests.ymlet son plafond de production de 30 minutes ;Cette PR installe l’instrument de mesure et son run CI a maintenant produit la première observation non censurée demandée par #14598 : run
34676978324, job103508457858, runnermyia-po-2024-linux-docker-2, 1076 passed, 3 skipped, 7 warnings en 890.36 s. Le commentaire #14598 (comment) publie le top 25 complet et l’analyse : 792.56 s = 89.02 % du runtime dans le top 25, 0/25 entrée PyPhi, et les trois famillesbasin_*représentent 588.59 s = 66.11 % de la suite.Les acceptances révisées 1 et 2 sont satisfaites par cette mesure. Les acceptances 3 à 6 restent ouvertes : choix et marge du plafond durable, deux contrôles positifs sur deux runners distincts, contrôle négatif d’un job enlisé, et coût en slots d’un éventuel découpage. Cette PR ne relève donc pas le plafond de production et ne ferme pas #14598.
Pourquoi un workflow séparé
Le workflow de production
.github/workflows/ict-tests.ymlest actuellement touché par plusieurs PRs ouvertes. Le modifier ici créerait une collision et confondrait deux décisions : mesurer la distribution réelle et recalibrer le gate de production.La sonde porte donc son propre déclencheur, une concurrence fixe avec
cancel-in-progress: false, et aucun triggerpush. Une mesure en cours n’est pas superseded par une autre ; un second déclenchement attend derrière le premier. Le timeout de 90 minutes reste une borne de sécurité, pas une suppression du garde-fou.Exécution
Commande mesurée :
Le code retour pytest est préservé à travers
teeviaPIPESTATUS[0]. Le résumé de job écrit la durée écoulée, le runner et le code retour. Le log est uploadé avec une rétention de 14 jours lorsque le job atteint l’étape d’upload.Portée
Deux fichiers :
.github/workflows/ict-tests-profile.yml— nouvelle sonde temporaire ;scripts/ci/check_self_hosted_runner_policy.py— une entrée additive dansSELF_HOSTED_WORKFLOW_ALLOWLIST, requise par le garde bloquant pour tout workflow self-hosted.L’amendement de claim avec ces deux chemins a été publié avant intégration. Le workflow et son entrée d’allowlist devront être retirés ensemble après collecte de la mesure et décision durable.
Validation locale
yaml.BaseLoader: 1 job, 2 blocsrun:;bash -nsur les deux blocs shell : vert ;check_self_hosted_runner_policy.py --check: 158 workflows, 200 jobs, 131 self-hosted, 0 violation ;check_concurrency_conj.py --check: 0 offender ;check_unique_check_run_names.py --check: 81 jobs PR, 0 doublon ;check_workflow_label_paths.py: PASS ;check_testpaths_coverage.py --verbose: tous les testpaths couverts ou exclus ;git diff --check origin/main...HEAD: vert ;origin/main, diff limité aux deux fichiers annoncés.La suite ICT lourde n’a pas été lancée localement : sa mesure sur le runner contrôlé est précisément le résultat attendu de cette sonde, et une exécution locale improvisée reproduirait le risque de saturation que le travail cherche à éviter.
🤖 Generated with Claude Code