3 — Lint, formatage & chaîne qualité automatisée
Note : 3,5 / 5
État factuel (exécuté le 2026-05-29) :
prettier --check✅,shellcheck(18 scripts) ✅ 0 warning,yamllint .✅ (exit 0, quelques warnings cosmétiques),ansible-lint(profilproduction) ✅ 0 failure,jscpd✅ 0 %,gitleaks✅ 0 secret sur 119 commits. La chaîne fonctionne. L’audit porte donc sur la couverture et la parité, pas sur « faut-il linter ».
Chaîne mature et cohérente : prettier, yamllint, shellcheck, kubeconform, ansible-lint, jscpd, commitlint sont câblés en CI et, pour la plupart, en hooks lefthook. Les exclusions sont largement justifiées (manifests Rook vendored, lockfiles, inventaires machine-spécifiques). Les écarts sont des imperfections de parité et des angles morts (scanners de sécurité IaC, markdownlint, link-checker).
Points forts
Section intitulée « Points forts »- Couverture multi-outils redondante CI + hooks.
- Exclusions kubeconform pertinentes : seuls les 6 manifests Rook vendored +
values.yamlHelm +inventory.yamlsont exclus ; tous les manifests maison sont validés. - Garde-fou pre-push « pas de push direct sur main » + commit-msg rejetant les e-mails et validant Conventional Commits.
commitlint.config.jsgère l’historique pré-Conventional-Commits par regex.jscpdseuil 5 %, exclusions alignées → 0 % de duplication.ansible-linten profilproduction(le plus strict).
Constats
Section intitulée « Constats »Majeur (→ vérifié suggestion) — Aucun scanner de posture sécurité IaC
Section intitulée « Majeur (→ vérifié suggestion) — Aucun scanner de posture sécurité IaC »- Fichier :
.github/workflows/ci.yml - Constat :
kubeconformne valide que la conformité schématique, pas la posture de sécurité. Aucun trivy/checkov/kube-score/kube-linter/polaris. Les compromis sécurité (ADR 0010/0011/0012) ne sont jamais matérialisés comme des findings « explicitement supprimés ». Gravité ramenée à suggestion : surface maison réduite (~2 deployments + 1 cronjob), compromis déjà documentés en ADR. - Recommandation : ajouter un job
trivy config .(oukube-score) avec une allowlist documentée des compromis actés. Voir aussi 11 pour le scan de CVE (distinct, et lui en majeur).
Mineur — jscpd en CI mais absent des hooks
Section intitulée « Mineur — jscpd en CI mais absent des hooks »- Fichier :
lefthook.yml - Constat :
lint:dupexiste et tourne en CI mais n’est dans aucun hook ; une duplication n’est détectée qu’au passage en CI. - Recommandation : ajouter
pnpm lint:dupau blocpre-push.
Mineur — pnpm lint n’inclut ni lint:k8s ni lint:ansible
Section intitulée « Mineur — pnpm lint n’inclut ni lint:k8s ni lint:ansible »- Fichier :
package.json - Constat : la cible agrégée omet la validation des manifests k8s et Ansible
;
pnpm lintn’est pas le miroir de la CI. - Recommandation : chaîner
lint:k8setlint:ansibledanslint.
Mineur — Exclusions kubeconform divergentes (3 copies)
Section intitulée « Mineur — Exclusions kubeconform divergentes (3 copies) »- Fichier :
package.json:17,lefthook.yml:65-66,ci.yml:61-62 - Constat : la liste
-not -pathest dupliquée à 3 endroits et a déjà divergé (values.yaml/inventory.yamlexclus en CI/hooks mais pas danspackage.json) →pnpm lint:k8séchouerait là où la CI passe. - Recommandation : factoriser dans un unique
scripts/kubeconform.shappelé par les trois.
Mineur — Templates .sh.j2 échappent au lint
Section intitulée « Mineur — Templates .sh.j2 échappent au lint »- Fichier :
bootstrap/roles/etcd-backup/templates/etcd-snapshot.sh.j2 - Constat :
lint:shellne cible que*.sh; un bug shell dans le template du job de backup etcd ne serait détecté par aucun linter. - Recommandation : shellcheck sur le rendu du template (via la validation Ansible).
Résolu (ADR 0049) : le script
bootstrap/security/blur-env.pl(Perl, hors lint) a été porté enbootstrap/security/blur_env.py— couvert parruff(lint:python) etunittest(tests/test_blur_env.py).
Mineur — .yamllint.yaml incompatible avec ansible-lint (fix-mode désactivé)
Section intitulée « Mineur — .yamllint.yaml incompatible avec ansible-lint (fix-mode désactivé) »- Fichier :
.yamllint.yaml - Constat : ansible-lint signale une incompatibilité (
octal-values,braces,comments-indentation) qui désactive son fix-mode, privant les contributeurs de l’autocorrection. - Recommandation : fournir à ansible-lint une config yamllint alignée (ou
ajouter ces règles de façon compatible) pour restaurer
ansible-lint --fix.
Suggestion — Warnings yamllint cosmétiques non corrigés
Section intitulée « Suggestion — Warnings yamllint cosmétiques non corrigés »- Fichier :
storage/ceph/storageClass/*.yaml(le second fichier cité à l’origine,roles/network/tasks/sshd.yml, a depuis été supprimé — durcissement sshd unifié dansfirst-access.sh). - Constat : 9 « missing starting space in comment » + 1 ligne de 269
caractères ; verts car
level: warning, mais polluent la sortie. - Recommandation : corriger (
#x→# x) ; permet de passercommentsenerrorsur les fichiers maison.
Suggestion — Pas de markdownlint ni de vérificateur de liens
Section intitulée « Suggestion — Pas de markdownlint ni de vérificateur de liens »- Constat : doc riche (37+
.md, 12 ADR) publiée en VitePress ; prettier formate mais ne valide ni structure ni liens. - Recommandation :
markdownlint-cli2+lychee(ou markdown-link-check) en CI léger, horsCHANGELOG.mdetdocs/.vitepress/dist. Voir aussi le findingignoreDeadLinksen 04.
Suggestion — shellcheck CI en severity: warning vs hooks par défaut
Section intitulée « Suggestion — shellcheck CI en severity: warning vs hooks par défaut »- Constat : léger écart de parité (info/style ignorés en CI, inclus en local).
- Recommandation : aligner explicitement la sévérité partout.