outillage : un banc pouvait rendre un rouge sur du code sain #174
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!174
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/bancs-faux-negatif"
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?
La #173 est sortie rouge sur du code sain. Ce n'est pas le fichier, c'est le banc.
Ce qui s'est passé
Les deux lignes sont dans
infra/compose/supervision/docker-compose.yml, aux lignes 70 et 180. Même boucle, même fichier, même forme.La cause
Reproduit en trois lignes :
Seules les correspondances précoces sont touchées, celles où le producteur écrit encore quand grep s'arrête. Le 9100 est ligne 70, le 9090 ligne 180. D'où un banc intermittent, qui dépend de la taille du fichier et de l'ordre des motifs.
C'est le pire défaut possible pour une chaîne : un rouge cesse d'être une information. Personne ne peut plus distinguer un vrai refus d'un faux, et la réaction naturelle est de relancer jusqu'à ce que ça passe.
Ce que ça change
Six pipelines remplacés par une chaîne ici,
grep -q motif <<<"$variable", qui n'a pas de tuyau donc pas de SIGPIPE : danstest-supervision.sh,test-deploiement-continu.shettest-chaine-tableau-de-bord.sh.Un banc de plus,
tests/ci/test-hygiene-bancs.sh, qui reproduit d'abord le défaut puis interdit la forme dans tout script souspipefail. Il s'exclut lui-même, à dessein : il porte la démonstration, et c'est écrit dedans plutôt que caché dans un motif.Il est branché dans
ci.yml, sans quoitest-hygiene-workflows.shle refuse, ce qu'il a d'ailleurs fait pendant que j'écrivais.Un second piège, rencontré en réécrivant
<<<""envoie une ligne vide, pas zéro octet.grep -vla fait correspondre, puisqu'elle ne contient pas le motif exclu. Le contrôle du jeton de forge en clair s'est mis à rougir sur zéro occurrence. La garde de vacuité est posée, avec la raison au-dessus.Preuve
Ce que ça débloque
La #173 peut repasser. Rien dans la pile de supervision n'a jamais été en défaut.
Relu en appliquant la branche et en jouant le banc : il passe, et le diagnostic est juste.
producteur | grep -qsouspipefailrend bien 141 quand grep sort avant la fin de l'écriture — j'ai reproduit le faux négatif. Les cinq réécritures en<<<"$variable"sont bonnes, et le correctif du test de vacuité surFORGE_ALERTE_TOKEN(<<<""envoie une ligne vide, pas zéro octet) est un vrai second défaut trouvé en chemin.Trois points, dont deux qui me semblent à traiter avant fusion.
1. Le garde-fou ne couvre qu'une orthographe d'un seul consommateur
Le motif est
\|[[:space:]]*grep[[:space:]]+-[a-zA-Z]*q. Passé au banc :Or la classe du défaut n'est pas « grep -q », c'est « un consommateur qui sort avant la fin du producteur » :
head,grep -m1,grep -l,sed q,awk '{exit}'ont exactement le même effet, etgrep -F -qest la même commande écrite autrement. Un banc qui interdit une forme et laisse passer ses synonymes donne une garantie plus large que ce qu'il tient — ce qui est le reproche que la demande fait aux bancs actuels.2. Le balayage s'arrête aux bancs, et le premier script au-delà porte le défaut
La boucle ne lit que
tests/ci/*.shet.forgejo/scripts/*.sh. En étendant àgit ls-files '*.sh':Deux
ifdont le verdict dépend du statut du tuyau, dans un script d'exploitation Azure — pas un banc. Le message y est court, donc le faux négatif est peu probable en pratique, mais c'est très exactement la forme que la demande déclare dangereuse, et c'est un script où un « la politique n'a pas refusé » erroné envoie chercher au mauvais endroit. Une glob de plus ferme les deux.3. Le premier cas d'essai ne peut pas échouer
Les deux branches appellent
ok. C'est assumé et expliqué, et je comprends l'intention de garder la preuve à côté de la règle — mais il est ensuite compté dans « tous les cas d'essai passent ». Le nommer pour ce qu'il est (une démonstration, pas un contrôle) éviterait qu'on lise deux verts là où il y en a un.Le reste tient : l'exclusion de ce fichier du balayage est nécessaire et écrite au bon endroit, le filtre
grep -q pipefailavant d'inspecter est le bon garde, et l'étape de chaîne est câblée comme ses voisines.