[infra] La chaîne n'est pas reconstructible : la configuration de l'exécuteur n'existe que sur le serveur #141
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision#141
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Exigence couverte
ENF-09 — Reproductibilité : « l'hôte est décrit par un playbook Ansible rejouable sur une machine vierge. Aucun geste manuel non documenté. »
Épreuve servie
EC03 · CI/CD et qualité
Ce qu'on veut obtenir
La configuration de l'exécuteur Forgejo n'existe qu'en un seul exemplaire, sur le serveur, sous
/opt/g2-forge/data/runner/config.yml.infra/compose/forge/docker-compose.ymlle monte depuis./data/runner/;data/est exclu par.gitignore(section « données et modèles, hors dépôt ») ;git ls-tree -r --name-only develop | grep runnerne renvoie rien.C'est pourtant ce fichier qui force le réseau hôte des conteneurs de tâche. Sans lui, aucun job ne démarre sur notre LXC, où runc ne peut écrire aucun sysctl réseau. L'en-tête de
.forgejo/workflows/ci.ymlle dit explicitement : « les conteneurs de tâches sont forcés en réseau hôte dans la configuration du runner, il n'y a rien à déclarer ici ».Conséquence : un clone du dépôt sur une machine vierge ne rejoue pas la chaîne. C'est une contradiction directe avec ENF-09, et le seul geste manuel non documenté qui reste sur le socle.
Voir le relevé serveur en commentaire :
capacityvaut déjà 2 et n'est pas montée, la mesure ne gagnerait rien.Hors périmètre, volontairement : l'image de chaîne pré-cuite. La #134 (mutualisation des préambules, cache pip et npm) lui a retiré l'essentiel de sa valeur ; elle part au backlog en
Priority/Low.Critères d'acceptation
config.ymlde l'exécuteur est versionné dans un rôle Ansibleci_runner, à l'identique de ce qui tourne : réseau hôte forcé,force_pull: false, serveur de cache activé,capacitylaissée à 2 et justifiée en commentaire.ansible-playbook site.yml --tags cisuffit à obtenir un exécuteur opérationnel. Aucun geste manuel.tests/ci/test-runner-reproductible.shvérifie statiquement que leconfig.ymlversionné porte le forçage réseau hôte et unecapacityd'au moins 2, et que les libellés de l'exécuteur sont déclarés.docs/runbooks/ci.mdgagne une section « Reconstruire la chaîne sur une machine vierge » ;docs/runbooks/forge.md§6 renvoie vers le rôle plutôt que vers un geste manuel.tests/ci/passent sans modification.Comment on le vérifie
Preuve à joindre : le
diffentre leconfig.ymldu serveur et le fichier versionné, et une exécution complète de la chaîne sur la demande de fusion.Manuel d'exploitation à mettre à jour
docs/runbooks/ci.md— nouvelle section « Reconstruire la chaîne sur une machine vierge ».docs/runbooks/forge.md— §6, réenregistrement de l'exécuteur.infra/ansible/README.md— le nouveau rôle et son étiquette.Risque et retour arrière
Risque élevé : une erreur dans
config.ymlarrête l'exécuteur, donc toute la chaîne, donc l'équipe entière.Geste zéro, avant toute autre chose : récupérer
/opt/g2-forge/data/runner/config.ymldepuis le serveur et le mettre de côté. C'est aujourd'hui le seul exemplaire existant.Piège connu : l'exécuteur tire l'image de tâche par défaut. Toute évolution ultérieure vers une image construite localement exigera
force_pull: false— à prévoir dans la structure du fichier, pas à découvrir plus tard.Retour arrière : restaurer le
config.ymlmis de côté,docker compose up -d g2-forge-runner, révoquer le commit.Recouvrement connu
La branche
lenaic/136-planifier-silvertoucheinfra/ansible/group_vars/all/vars.ymletdocs/runbooks/README.md, que ce ticket modifie aussi. Les deux changements sont additifs : conflit textuel trivial, rien de sémantique. Fusionner #136 en premier.Relevé sur le serveur avant d'écrire le rôle
Le
config.ymlen service a été récupéré (/opt/g2-forge/data/runner/config.yml, exécuteurv6.4.0). Il corrige trois hypothèses de la rédaction initiale :capacity: 1, quatre tâches à la queue leu leucapacity: 2force_pullà prévoirforce_pull: falsedéjà posécache.enabled: true), c'est lui qui fait marcher lesactions/cache@v4de la #134capacityreste donc à 2, et le ticket ne la monte plus. Le serveur a 4 cœurs, 8 Gio, 13 conteneurs déjà en service et une charge moyenne de 1,88. Surtout : depuis la #134 la chaîne compte quatre tâches dont une,python, domine largement le chemin critique (outillage, Ruff, mypy, pytest, audits, deux inventaires). Monter la capacité à 3 ne retire aucune vague — on passerait de « python ‖ node, puis images ‖ secrets » à « python ‖ node ‖ images, puis secrets », la durée totale restant celle depython. On achèterait de la contention sur la forge de toute l'équipe sans gagner une seconde.Effet de bord utile
Le fichier
.runnerporte les libellés de l'exécuteur, et ils répondent à une question restée ouverte dans l'en-tête de.forgejo/workflows/ci.yml(« on ne sait pas non plus si cette image a npm — jamais exercé ») :L'image par défaut du libellé
dockerestnode:22-bookworm. Elle a donc node et npm, et n'a paspip— ce qui explique enfin les exécutions #14 et #15 en échec silencieux. Le commentaire d'en-tête sera corrigé dans la même demande de fusion : ce n'est plus une inconnue.Ces libellés vivent dans
.runner, aux côtés du jeton d'enregistrement. Ce fichier ne peut donc pas être versionné : le rôle les déclare à l'enregistrement, et le jeton passe par le coffre (vault_forgejo_runner_token).Ticket fermé sans qu'aucun critère soit coché. J'ai vérifié les six plutôt que
de tous les cocher : trois sont atteints, trois ne le sont pas encore.
Atteints
Le banc
tests/ci/test-runner-reproductible.shest surdevelopet joué par lachaîne, qui en câble neuf au total.
docs/runbooks/ci.mdporte bien la section« Reconstruire la chaîne sur une machine vierge », et
forge.mdrenvoie vers lerôle. Les bancs existants passent,
developest vert sur ses cinq contrôles.Ce qui n'est pas atteint, et pourquoi
Le rôle n'a jamais été appliqué. Comparaison entre la configuration qui
tourne dans
g2-forge-runneret celle du dépôt :Trois clés sur quatre coïncident. La quatrième diverge, et c'est délibéré : le
dépôt fixe
capacity: 2avec sa justification mesurée, le serveur tourne encoresur la configuration posée à la main, à 3.
C'est cohérent avec la conception du ticket, qui exclut volontairement
l'étiquette
cidu déploiement continu pour qu'une fusion ne redémarre pasl'exécuteur qui l'exécute. Le rôle doit donc être joué à la main, et il ne l'a
pas été.
Conséquence à connaître avant de le jouer : l'appliquer fera passer la
capacité de 3 à 2. Les tâches se sérialiseront davantage. La justification est
dans
runner-config.yml, mais autant le savoir avant plutôt que de le constatersur une file d'attente.
Donc :
un choix et non un oubli
--tags cisuffit » : jamais éprouvé, etil faudrait une machine vierge pour le faire
Rien de tout ça ne remet en cause le travail : la configuration est versionnée,
le banc la surveille, et c'était l'objet. Il reste à la poser, et à décider si
la capacité passe vraiment à 2.