Valider hors infra (avant de pusher)
Ce guide liste, par type d'artefact, ce qu'on valide en local avant de pusher, sans monter l'infra AWS. But : ne jamais merger juste pour tester, et reproduire la CI à l'identique (mêmes outils, mêmes versions).
Complémentaire du Runbook de validation, qui couvre lui la validation LIVE (post
aws-start: ESO/IRSA, GitOps, observabilité, alerting).
Pourquoi « hors infra »
L'infra du projet est éphémère (montée/détruite à chaque session) et certaines briques ne se valident vraiment qu'en live (CNI, addons, charts Helm, CRD). On sépare donc :
- Validation statique (ce guide) : syntaxe, format, rendu, règles de sécurité. Rapide, gratuite, reproductible, faite sur chaque branche avant de pusher.
- Validation live : comportement réel au prochain
aws-start. Tracée « à valider live » dans l'ADR/le sprint, puis cochée une fois prouvée.
Règle d'or : reproduire la CI à l'identique (même image, même version). Un outil local
d'une autre version introduit des règles différentes et fait diverger develop sans
changement de code (vécu #83, INC-057).
Par type d'artefact
Terraform
# Format
terraform -chdir=terraform fmt -check -recursive -diff
# Sécurité (HIGH) via l'image CI exacte
docker run --rm -v "$PWD/terraform":/src aquasec/tfsec-alpine /src --minimum-severity HIGH
terraform validaten'est pas un check hors infra : le provider AWS valide les credentials au démarrage (erreur STS sans creds). Il tourne en CI / à l'aws-start.- Piège INC-049 : des
.terraform/ou*.tfvarslaissés par un run infra faussent tfsec (faux CRITICAL). En CI,GIT_CLEAN_FLAGS: -ffdxnettoie ; en local, partir d'un checkout propre ou d'ungit archive.
Ansible
ansible-playbook --syntax-check ansible/bootstrap.yml
# (optionnel) règles de style :
ansible-lint ansible/bootstrap.yml
--syntax-check valide la structure du playbook sans rien exécuter. Les warnings
« No inventory / implicit localhost » sont normaux (play sur localhost).
Helm (charts posés par Ansible / ArgoCD)
Les charts ne passent pas par la CI applicative : on vérifie que les values sont acceptées par le schéma du chart en rendant le template.
docker run --rm --entrypoint /bin/sh -v "$PWD":/w alpine/helm:3.16.2 -c \
"helm repo add cilium https://helm.cilium.io/ >/dev/null && helm repo update >/dev/null && \
helm template rel cilium/cilium --version 1.19.5 -f /w/values.yaml" | grep -c '^kind:'
Un rendu non vide (N manifests) = values valides. Limite (INC-055) : helm template
valide le rendu, pas le runtime (un emptyDir manquant + readOnlyRootFilesystem
passe le template mais plante au démarrage). Le live reste obligatoire.
Kustomize (bases / overlays)
kustomize build k8s/base > /dev/null && echo OK
Version alignée sur la CI (kustomize v5.4.3). Comme Helm, valide le rendu, pas le runtime.
Workloads Kubernetes (kube-linter)
kube-linter lint k8s/base
- Version pinnée
v0.8.3(celle de la CI). Une autre version introduirait des règles différentes. - Périmètre =
k8s/baseuniquement : c'est le seul workload écrit/déployé en prod.k8s/platform/(CRD,ApplicationArgoCD, values Helm) n'est pas lintable, et les workloads de plateforme viennent des charts Helm upstream (hors du Git). Angle mort assumé. - Trou de process : une MR qui touche
k8s/mergée sousci_config_pathinfra n'exécute paskube-linter(défini côté app). Valider en local dans ce cas (vécu #82 → #83).
CI GitLab
glab ci lint .gitlab-ci.yml # app
glab ci lint .gitlab-ci-infra.yml # infra
Valide le YAML côté serveur (inclusions, ancres, règles résolues).
Image Docker, requirements, doc MkDocs, tests Python
Couverts à part : build + scan Trivy, recompilation des requirements, tests via
docker-compose et mkdocs build se font via l'image CI exacte
(aquasec/trivy, squidfunk/mkdocs-material:9). Voir le pipeline (.gitlab-ci.yml) pour
les versions de référence.
Récapitulatif
| On modifie... | On valide avec... |
|---|---|
terraform/** |
terraform fmt + tfsec --minimum-severity HIGH |
ansible/*.yml |
ansible-playbook --syntax-check (+ ansible-lint) |
| values Helm / charts | helm template ... -f values |
k8s/base, overlays |
kustomize build + kube-linter lint k8s/base |
.gitlab-ci*.yml |
glab ci lint |
| image / deps / doc / tests | Trivy, pip-compile, pytest, mkdocs build (images CI) |
Pièges transverses (à toujours avoir en tête)
- Reproduire la version CI : tfsec-alpine, kube-linter
v0.8.3, kustomizev5.4.3, mkdocs-material9. Pas de:latest, pas de binaire local d'une autre version. curlqui alimente untar/install :-f+--retry(INC-057), sinon le corps HTML d'une erreur HTTP transitoire est sauvé ettarplante (gzip: invalid magic).- Statique ≠ live : ces checks prouvent la syntaxe et le rendu, jamais le comportement réel. Les MR infra/CNI/charts restent « à valider live ».