[infra] Chaîne d'intégration : le job du tableau de bord échoue un tiers du temps sur un délai réseau non borné #148
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#148
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-11 — chaîne d'approvisionnement
Épreuve servie : EC03 · CI/CD et qualité
Ce qu'on veut obtenir
Suite du #133, qui a réuni les jobs et posé les caches. Le job Python en a
profité : 124–129 s, stable, aucun échec. Le job « Tableau de bord » non.
Mesuré sur les treize dernières exécutions de
ci.yml(APIactions/tasks) :ci.ymldevelopest actuellement rouge sur ce job (exécution #240, échec à 433 s).Chronométré en local sur
services/dashboard(244 paquets, 120 Mo) :Le coût n'est donc pas dans
npm ci, contrairement à ce que le journal laissecroire. Quatre causes, distinctes :
npm auditn'est pas borné.fetch-timeoutvaut 300 000 ms par défaut,fetch-retries2, et aucun.npmrcn'est versionné. Les échecs se massent à433–435 s : la signature d'un délai avec réessais, pas d'un travail à durée
variable. Un ralentissement du réseau de la salle bloque la fusion de tout le
monde pendant sept minutes, et le message ne parle pas de réseau.
ci.yml:275, « Audit et inventaire dutableau de bord », enchaîne
npm ci,npm auditetnpm sbom. Le journaln'impute rien : personne ne peut dire qui coûte quoi. C'est ce qui a fait
attribuer le problème à
npm i.tombe juste — ce sont les passages à 26 s. Il rate sur les demandes qui
touchent
package-lock.json, c'est-à-dire celles du tableau de bord : #139 à256 s puis 65 s au passage suivant, #140 en échec à 435 s puis 89 s.
ci.yml:263) pour unopenssl x509 -checkendque le job Python de la même exécution fait déjà. Iln'a besoin que du fichier PEM pour
NODE_EXTRA_CA_CERTS, pas du binaire.Hors périmètre, à traiter avec le #141 : les quatre jobs se sérialisent
(exéc. #255, node démarre à 08:38:12, soit à la fin de Python), ce qui relève de
la
capacityde l'exécuteur.Critères d'acceptation
package-lock.jsonn'a pas bougé, l'installation est sautée et le journal le dit.apt-getne subsiste dans le job « Tableau de bord ».npm auditreste bloquant sur une CVE de gravité haute : une dépendance vulnérable introduite fait toujours échouer la chaîne (ENF-11).develop, et sa durée médiane sur dix exécutions consécutives est sous 90 s.Comment on le vérifie
tests/ci/test-chaine-tableau-de-bord.sh, sur le modèle des quatre contrôlesstatiques existants, joué par le job « Contrôles statiques du dépôt » :
Il vérifie statiquement les bornes npm, l'absence d'
apt-getdans le job, uneclé de cache exacte sur
package-lock.jsonsansrestore-keys, et quenpm audit --audit-level=highfigure toujours.La durée se relève sur la forge, par nom de job, sur
run_started_atetupdated_at:Joindre au ticket le tableau avant/après. Preuve du garde-fou :
npm audit --audit-level=highsur unpackage.jsonportant une dépendancevulnérable connue doit sortir non nul.
Manuel d'exploitation à mettre à jour
docs/runbooks/ci.md. Son tableau décrit encore les six tâches d'avant le#133 (
qualite,tests-unitaires,dependances-python,dependances-dashboard,images,secrets) alors que le workflow n'en a plusque quatre. À réaligner, et à compléter par la conduite à tenir quand l'audit
npm échoue pour cause de réseau et non de CVE.
Risque et retour arrière
fetch-timeouttrop court déplacerait la panne au lieu de la supprimer :l'audit rougirait sur un simple ralentissement. 60 s avec deux réessais laisse
trois minutes de marge, à ajuster si la chaîne rougit pour cette raison.
node_modulesest le point sensible : un arbre partiellementrestauré est pire que pas de cache. D'où la clé exacte sans repli, et
npm cirejoué dès qu'elle ne tombe pas juste.
ci.yml, un.npmrcet un script de test.Un
git revertremet la chaîne dans son état actuel — lente et instable, maisconnue.
.forgejo/ettests/ci/sont à @lenaic dans CODEOWNERS, et sa demande#145 touche la configuration de l'exécuteur. À séquencer après elle pour
éviter un conflit sur le même périmètre.
Demande de fusion : #151.
Les quatre premiers critères sont couverts et vérifiés en local. Deux points restent ouverts :
develop, durée médiane sous 90 s sur dix exécutions consécutives ») ne peut se mesurer qu'après passage surdevelop. À relever avec l'APIactions/tasksune fois fusionné.--strictde pip-audit et avec ENF-11. Conséquence assumée : un point d'accès npm en panne bloque encore les fusions, mais en 2 min au lieu de 7 et avec un message qui nomme la cause. Le détail est dans la demande.Mon commentaire ci-dessus est caduc : la #151 est fermée, c'est la #149 de @lenaic qui traite ce ticket. Deux éléments repris en commentaire de la #151, dont une mesure qui concerne la #149 — les bornes ramènent le job de 435 s à 133 s, mais il échoue toujours quand le point d'accès npm est injoignable.
Fusionné par la #149. Les six critères sont prouvés, y compris les deux qui
ne se mesuraient qu'après fusion.
Le relevé avant et après, promis en demande de fusion
Dix exécutions du job, relevées dans les journaux de tâches :
Médiane à 20 s, pour un palier fixé à 90 s. Contre 433 à 435 s sur les cinq
échecs d'avant, et une médiane de la chaîne entière à six minutes.
La tâche 1318 a démarré à 11 h 53, six minutes avant la fusion : elle ne porte pas
le correctif, et elle en montre exactement la signature.
Critère 3, l'installation sautée
Prouvé par le journal, tâche 1370 :
L'audit prend une seconde. C'est la même commande qui immobilisait
l'exécuteur sept minutes ce matin.
Critères 1, 2 et 4, vérifiés sur
developservices/dashboard/.npmrcportefetch-timeout=60000etfetch-retries=2.Le job expose trois étapes séparées, installation, inventaire, audit. Et zéro
apt-gety subsiste.Critère 5, le garde-fou
Le verdict vit dans
.forgejo/scripts/verdict-audit-npm.jsettests/ci/test-verdict-audit-npm.shl'exécute contre sept rapports figés : uneCVE haute et une critique bloquent, une moderée seule ne bloque pas, un registre
injoignable avertit, un rapport tronqué échoue plutôt que de passer pour une
panne.
Sortir cette logique du YAML était nécessaire : tant qu'elle y vivait, un banc ne
pouvait que chercher des sous-chaînes, et Olivier a démontré qu'un
process.exit(0)gardantv.highen affichage laissait le banc vert pendant queles CVE cessaient de bloquer.
Le changement de politique
Une panne du registre npm avertit désormais au lieu de bloquer, une CVE bloquant
toujours. Tranché le 4 septembre, écrit dans
docs/runbooks/ci.mdavec ce que çacoûte : une dépendance vulnérable introduite pendant une panne passe, et n'est
rattrapée qu'au passage suivant.
Reste ouvert, hors périmètre : la sérialisation des jobs faute d'un second
exécuteur, qui relève du #141.