infra : la configuration de l'exécuteur entre au dépôt (#141) #145
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!145
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/141-runner-reproductible"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ce que ça change
La configuration de l'exécuteur Forgejo entre au dépôt. Elle n'existait qu'en un seul exemplaire, sur le serveur, sous un chemin exclu par
.gitignore— c'est pourtant elle qui force le réseau hôte des conteneurs de tâche, sans quoi rien ne démarre sur ce LXC. Un clone sur une machine neuve donnait un exécuteur actif qui ne lançait jamais rien, et rien ne le disait.Un rôle Ansible
ci_runner, calqué surproxy, la dépose et la maintient alignée. Le fichier versionné est sémantiquement identique à celui en service : appliquer ce rôle sur le serveur actuel ne change rien.Closes #141
Preuve
Le fichier en service a été récupéré et comparé clé à clé au fichier versionné :
Le banc d'essai échoue bien quand il doit — éprouvé sur cinq régressions volontaires, une à la fois :
ansible-lintpasse au profilproduction, alors quemoderatesuffisait :Relecture
Ce qui suit le code
docs/runbooks/mis à jour, un geste d'exploitation a changé —ci.mdgagne « Reconstruire la chaîne sur une machine vierge »,forge.md§6 renvoie vers le rôle au lieu d'un geste manuelvault.yml.example—vault_forgejo_runner_token, nécessaire uniquement sur une cible neuveOù regarder en priorité
Trois précautions, chacune pour une panne qu'on préfère ne pas vivre. C'est là que j'ai hésité.
ciest hors de--tags app,proxy. Le déploiement continu s'exécute sur cet exécuteur : lui donner le droit de le redémarrer, c'est le faire se couper au milieu de son propre job, à chaque fusion surmain. Le banc refuse cette régression.FORGEJO-ACTIONS-TASK-*tourne. L'exécuteur ne relit sa configuration qu'au démarrage ; le redémarrer tue les tâches en vol, donc une demande de fusion rouge pour quelqu'un qui n'a rien demandé.-e ci_runner_forcer=truepasse outre.capacityreste à 2, et le ticket ne la monte plus. Je proposais 3 au départ. Le relevé serveur montre qu'elle valait déjà 2, et surtout que la monter ne retirerait aucune vague : depuis la #133,pythondomine seule le chemin critique. On achèterait de la contention sur 4 cœurs pour zéro seconde.Ce qui ne peut pas être versionné.
.runnerporte le jeton d'enregistrement : il reste hors dépôt (ENF-12). Les libellés y vivent aussi, ils sont donc déclarés dansci_runner_labelset posés à l'enregistrement. Les changer exige un réenregistrement, pas un redémarrage — c'est dit dans le manuel.Effet de bord. Ces libellés répondent à une question restée ouverte dans l'en-tête de
ci.yml: le labeldockervautnode:22-bookworm. Cette image a node et npm, et n'a paspip— l'explication des exécutions #14 et #15, en échec silencieux. Le commentaire est corrigé, ce n'est plus une supposition.Documentation périmée réparée au passage.
docs/runbooks/ci.mdannonçait encore six tâches et une absence de cache, deux affirmations que la #133 avait périmées. Les tableaux sont refaits sur les quatre tâches actuelles.Conflits. Aucun fichier commun avec
lenaic/136-planifier-silver,git merge-treene signale rien. Ordre de fusion indifférent.ed1d33c93a5cd6403e67Relecture. Le fond est bon : vrai problème, bien diagnostiqué, garde-fous sérieux (capacité figée à 2 avec justification mesurée, étiquette
cihors du déploiement continu, refus de déposer pendant une tâche en vol, banc de non-régression). Quatre points à traiter ou à assumer explicitement avant fusion, puis quelques mineurs.À challenger
1. Périmètre. 745 lignes / 13 fichiers, dont ~180 de
ci.mdet l'en-tête deci.ymlqui sont du rattrapage documentaire de la #133, sans lien avec le runner. La PR le reconnaît (« réparée au passage »), mais ça alourdit la relecture et rend unrevertimpossible sans perdre la mise à jour doc. Deux commits séparés auraient suffi — à défaut, tant pis, mais autant en avoir conscience.2.
docker restarten dur dansinfra/ansible/roles/ci_runner/handlers/main.ymlau lieu dedocker compose restart. Sur une cible neuve où la pile forge est clonée mais pas encoreup, le handler échoue. Le reste du projet passe pardocker compose(voirproxy, les runbooks). Cohérence + robustesse.3.
assertfragile danstasks/main.yml:config.container.force_pull is false(idemconfig.cache.enabled is true,config.container.network == "host") plante sur une erreur « undefined » si la clé est absente derunner-config.yml, au lieu de rendre lefail_msgprévu. Ajouteris defined anddevant chaque test.4. Le chemin Ansible de l'assert n'a probablement jamais tourné pour de vrai. Les « cinq régressions volontaires » du corps de PR reprennent mot pour mot les messages de
tests/ci/test-runner-reproductible.sh(le banc shell), pas lesfail_msgdu cheminslurp → from_yaml → assertdu rôle. Unansible-playbook site.yml --tags ci --checkréel sur le serveur, joint en preuve, lèverait le doute.Mineurs
test-runner-reproductible.sh: le checkgrep -qE -- '--tags[[:space:]]+[a-z,]*\bci\b'surdeploy.ymlne couvre que la forme longue--tags; un futur passage à-tpasserait à travers sans que le banc ne bronche.test-runner-reproductible.shsupposegitprésent surnode:22-bookworm(ok sur l'image full, pas slim) — c'est implicite, un mot dans l'en-tête du script ne coûterait rien.tasks/main.ymllit le fichier deux fois (slurp pour le contenu, stat pour le checksum) : cosmétique.meta/main.yml:min_ansible_version: "2.17"— vérifier que ça colle avec les autres rôles.Rien de bloquant côté CI (verte). Les points 2 et 3 méritent une correction ; les points 1 et 4 peuvent être assumés par une réponse.
Les quatre points sont traités, et deux d'entre eux se répondaient.
Points 2 et 3 : de vrais défauts
docker restartéchoue sur une cible neuve où la pile forge est clonée mais pasencore démarrée, le conteneur n'existant pas encore alors que la situation est
normale. Passé par Compose, qui part de la déclaration et non de l'existant.
Les assertions lisaient des clés sans
is defined: une clé absente levait unetrace Jinja au lieu du
fail_msgqui dit quoi faire, au moment où on en a leplus besoin.
Corrigés, et surtout le banc les surveille maintenant, alors que rien ne les
surveillait. Éprouvés dans les deux sens : rouge sur
docker restartremis,rouge sur un
is definedretiré, vert sur le rôle corrigé.Ton contrôle a d'ailleurs trouvé un cas que j'avais laissé en corrigeant :
config.runner.capacity | int >= 2sur sa propre ligne, sans garde.Point 1 : périmètre resserré
docs/runbooks/ci.mdpasse de 150 lignes à 85 et ne garde que la section« Reconstruire la chaîne sur une machine vierge ». Le reste était le rattrapage
documentaire de la #133 que tu as identifié, et il est traité par la #149.
Effet de bord utile : ça supprime le conflit entre les deux demandes, qu'Olivier
avait relevé de son côté. Vérifié par fusion à blanc, les deux passent
maintenant dans n'importe quel ordre.
L'en-tête de
ci.ymlreste, en revanche : il dit que le libellédockervautnode:22-bookworm, ce qui n'est plus une supposition parce que les libellésde l'exécuteur sont désormais lisibles dans le dépôt. C'est cette demande qui le
rend vrai.
Point 4 : tu avais raison, et je ne peux pas le satisfaire
Ce chemin n'avait jamais tourné, et il portait le défaut. Ton doute était fondé.
J'ai écrit le banc que tu demandais, qui lit les conditions dans le rôle et les
fait évaluer par Ansible plutôt que de les recopier. Il se heurte au modèle de
confiance d'ansible-core depuis 2.19 : une chaîne lue dans un fichier est
marquée non fiable et n'est pas évaluée comme gabarit. Le filtre prévu pour lever
ce marquage n'est pas exposé en 2.21.3, la version qu'on épingle. Et je n'ai pas
le mot de passe du coffre pour jouer
site.yml --tags cisur la cible.La garde est donc statique : chaque condition qui lit une clé doit porter
is defined. Le banc écrit cette limite noir sur blanc plutôt que de laissercroire qu'il éprouve un comportement.
Si tu peux jouer
--tags ci --checksur le serveur avec le coffre, la sortiejointe ici lèverait le dernier doute.
Mineurs
La forme courte
-test couverte. La dépendance àgit, absent de l'image nodeslim, est dite dans l'en-tête du banc.
min_ansible_versionest bien à"2.17"sur les huit rôles, vérifié.La double lecture slurp plus stat, je l'ai laissée : elle est cosmétique et la
toucher demanderait de repasser sur la logique d'idempotence, ce qui n'est pas le
bon rapport dans cette demande.
Relecture des corrections. Les quatre points sont traités, et chaque correctif est désormais gardé par le banc — c'est le bon réflexe.
Point 2 —
docker restart: le handler passe pardocker compose -f {{ ci_runner_forge_dir }}/docker-compose.yml restart runner, même convention de chemin que le rôleproxy. Le banc rougit si on revient àdocker restart.Point 3 —
assertfragile : chaque condition lisant une clé porteis defined and, gardes sur les clés parentes comprises, et le cascapacity | int >= 2que j'avais laissé passer est inclus. Le banc compteconfig.contreis defined.Point 1 — périmètre :
ci.mdresserré à une seule section sur le sujet, le rattrapage doc de la #133 renvoyé à la #149 — ce qui supprime au passage le conflit aveclenaic/136. L'en-tête deci.ymlreste, et la justification causale tient : c'est cette demande qui rend l'affirmation vraie.Point 4 — chemin Ansible des assertions : la limite est assumée et écrite noir sur blanc dans le banc, plutôt que maquillée. La garde statique est un compromis correct. Si je peux jouer
site.yml --tags ci --checkavec le coffre je joindrai la sortie, mais ça ne bloque pas.Mineurs tous traités : forme courte
-t, dépendance àgithors image slim,min_ansible_versionvérifié identique sur les huit rôles.CI verte sur la tête, banc rejoué localement (14/14). Bon pour fusion.