Le changement cassé du vendredi
Quelqu’un modifie un fichier à seize heures, le pousse et rentre chez lui. Personne n’a lancé les vérifications, et l’apply suivant échoue à mi-chemin.
Un pipeline lance les mêmes vérifications, dans le même ordre, pour chaque changement. Il s’arrête à la première qui échoue : un mauvais changement n’atteint jamais l’apply.
À la fin de cette leçon
Remarque
Je peux écrire un pipeline en étapes qui s’arrête au premier échec.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Pipeline | des étapes qui s’exécutent dans un ordre fixe | |
| Étape | un pas du pipeline | |
| Code de sortie | le nombre qu’une commande renvoie, où 0 veut dire réussi | echo $? |
| Barrière | une étape qui arrête le pipeline quand une vérification échoue | |
| Fichier de plan | un plan enregistré que l’apply suit à la lettre | plan.bin |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Toute commande finit par un code de sortie
Quand une commande se termine, elle renvoie un nombre, son code de sortie. Zéro veut dire que tout s’est bien passé. Tout autre nombre veut dire que non.
Le shell garde le dernier dans $?. Un pipeline ne lit que les codes de sortie : une vérification qui renvoie un nombre non nul est une vérification qui arrête l’exécution.
Créer un dossier pour le pipeline
mkdir -p ~/atelier-iac/pipeline && cd ~/atelier-iac/pipelineAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire un projet avec une ressource
printf '%s\n' 'variable "boutique" {' ' type = string' ' default = "Boutique du coin"' '}' '' 'resource "terraform_data" "porte" {' ' input = format("%s : ouvert", var.boutique)' '}' > main.tfAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Préparer le dossier
tofu init -no-color | grep successfullyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire un second fichier mal espacé
printf '%s\n' 'resource "terraform_data" "enseigne" {' ' input = "Ouvert"' '}' > enseigne.tfAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Vérifier la mise en forme
tofu fmt -check; echo "code de sortie $?"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un pipeline s’arrête au premier échec
Un script peut lancer chaque étape et s’arrêter quand l’une échoue. Ici une petite fonction, etape, lance une commande et quitte si elle renvoie autre chose que zéro.
Les étapes suivent l’ordre où vous les lanceriez à la main : format, validate, plan, barrière, apply. Une étape en échec empêche les suivantes de démarrer.
Écrire la barrière
printf '%s\n' '[.resource_changes[].change.actions[]] | index("delete") | not' > barriere.jqAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du pipeline
printf '%s\n' '#!/bin/bash' 'etape() { echo "== etape : $1"; nom=$1; shift; "$@" > /dev/null || { echo "etape $nom en echec, arret"; exit 1; }; }' 'barriere() { tofu show -json plan.bin | jq -e -f barriere.jq; }' 'etape format tofu fmt -check -no-color' 'etape validate tofu validate -no-color' 'etape plan tofu plan -no-color -out=plan.bin' 'etape barriere barriere' 'etape apply tofu apply -no-color plan.bin' 'echo "pipeline reussi"' > ci.shAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le lancer, enseigne.tf mal espacé
bash ci.sh; echo "sortie du pipeline $?"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Corriger la mise en forme et relancer
tofu fmt -no-color; bash ci.sh; echo "sortie du pipeline $?"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup pensent qu’un pipeline vert prouve que le changement est sans danger. Il prouve seulement que chaque vérification écrite a réussi. Un changement peut être valide, planifié, appliqué, et rester le mauvais changement. La barrière et une personne qui lit le plan sont la vraie sécurité.
Une barrière lit le plan avant l’apply
L’étape plan a enregistré le plan dans plan.bin, et l’étape apply exécute ce fichier et rien d’autre. Ce que la barrière a approuvé est donc ce qui s’exécute.
tofu show -json transforme le plan en données. Le filtre de la barrière dit non dès qu’une ressource va être supprimée.
Supprimer une ressource et relancer
rm enseigne.tf; bash ci.sh; echo "sortie du pipeline $?"; tofu state listAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un pipeline hébergé est un fichier
Sur un service qui héberge des pipelines, les étapes sont écrites dans un fichier du dépôt, et le service les lance sur sa propre machine. Un job peut dire needs pour en attendre un autre.
Vous ne pouvez pas en lancer un ici, faute de runner hébergé. Vous pouvez en écrire un et le lire.
Écrire un fichier de workflow
mkdir -p .github/workflows && printf '%s\n' 'name: infra' 'on:' ' pull_request:' ' push:' ' branches: [main]' 'jobs:' ' verification:' ' runs-on: ubuntu-latest' ' steps:' ' - uses: actions/checkout@v4' ' - run: tofu fmt -check' ' - run: tofu validate' ' - run: tofu plan -out=plan.bin' ' application:' ' needs: verification' " if: github.ref == 'refs/heads/main'" ' runs-on: ubuntu-latest' ' steps:' ' - run: tofu apply plan.bin' > .github/workflows/infra.ymlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Y retrouver l’ordre et les commandes
grep -nE "^ (verification|application):|needs:|run:" .github/workflows/infra.ymlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une exécution calculée en Python
# Lancer un pipeline dont chaque étape dépend d'étapes précédentes.
taches = {"verifier": [], "plan": ["verifier"], "appliquer": ["plan"]}
en_echec = {"plan"}
etat = {}
for nom in ["verifier", "plan", "appliquer"]:
bloquee = False
for besoin in taches[nom]:
if etat[besoin] != "reussie":
bloquee = True
if bloquee:
etat[nom] = "ignoree"
elif nom in en_echec:
etat[nom] = "echouee"
else:
etat[nom] = "reussie"
print(nom, etat[nom])
# Videz l'ensemble en_echec et regardez de nouveau.