Skip to content

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 validate n'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 *.tfvars laissés par un run infra faussent tfsec (faux CRITICAL). En CI, GIT_CLEAN_FLAGS: -ffdx nettoie ; en local, partir d'un checkout propre ou d'un git 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/base uniquement : c'est le seul workload écrit/déployé en prod. k8s/platform/ (CRD, Application ArgoCD, 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 sous ci_config_path infra n'exécute pas kube-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, kustomize v5.4.3, mkdocs-material 9. Pas de :latest, pas de binaire local d'une autre version.
  • curl qui alimente un tar/install : -f + --retry (INC-057), sinon le corps HTML d'une erreur HTTP transitoire est sauvé et tar plante (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 ».