Die kaputte Änderung am Freitag
Jemand ändert um vier Uhr eine Datei, schiebt sie hoch und geht nach Hause. Niemand hat die Prüfungen laufen lassen, und das nächste Apply scheitert auf halbem Weg.
Eine Pipeline führt für jede Änderung dieselben Prüfungen in derselben Reihenfolge aus. Sie hält bei der ersten an, die scheitert, sodass eine schlechte Änderung nie das Apply erreicht.
Am Ende dieser Lektion
Notiz
Ich kann eine Pipeline als Stufen schreiben, die beim ersten Fehler anhalten.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Pipeline | Schritte, die in fester Reihenfolge laufen | |
| Stufe | ein Schritt einer Pipeline | |
| Exitcode | die Zahl, die ein Befehl zurückgibt, wobei 0 Erfolg heißt | echo $? |
| Schranke | eine Stufe, die die Pipeline stoppt, wenn eine Prüfung scheitert | |
| Plan-Datei | ein gespeicherter Plan, den apply genau so ausführt | plan.bin |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jeder Befehl endet mit einem Exitcode
Wenn ein Befehl endet, gibt er eine Zahl zurück, seinen Exitcode. Null heißt, es hat geklappt. Jede andere Zahl heißt, es hat nicht geklappt.
Die Shell behält den letzten in $?. Eine Pipeline liest nur Exitcodes: Eine Prüfung, die eine Zahl ungleich null zurückgibt, ist eine Prüfung, die den Lauf stoppt.
Einen Ordner für die Pipeline anlegen
mkdir -p ~/iac-demo/pipeline && cd ~/iac-demo/pipelineHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Projekt mit einer Ressource schreiben
printf '%s\n' 'variable "laden" {' ' type = string' ' default = "Eckladen"' '}' '' 'resource "terraform_data" "tuer" {' ' input = format("%s: offen", var.laden)' '}' > main.tfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Ordner vorbereiten
tofu init -no-color | grep successfullyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine zweite Datei mit unordentlichen Abständen schreiben
printf '%s\n' 'resource "terraform_data" "schild" {' ' input = "Offen"' '}' > schild.tfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Layout prüfen und den Exitcode lesen
tofu fmt -check; echo "Exitcode $?"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Pipeline hält beim ersten Fehler an
Ein Skript kann jede Stufe ausführen und anhalten, wenn eine scheitert. Hier führt eine kleine Funktion, stufe, einen Befehl aus und beendet sich, wenn er etwas anderes als null zurückgibt.
Die Stufen folgen der Reihenfolge, in der Sie sie von Hand ausführen würden: format, validate, plan, Schranke, apply. Eine gescheiterte Stufe verhindert, dass die späteren starten.
Die Schranke schreiben
printf '%s\n' '[.resource_changes[].change.actions[]] | index("delete") | not' > schranke.jqHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Pipeline-Skript schreiben
printf '%s\n' '#!/bin/bash' 'stufe() { echo "== Stufe: $1"; name=$1; shift; "$@" > /dev/null || { echo "Stufe $name gescheitert, Abbruch"; exit 1; }; }' 'schranke() { tofu show -json plan.bin | jq -e -f schranke.jq; }' 'stufe format tofu fmt -check -no-color' 'stufe validate tofu validate -no-color' 'stufe plan tofu plan -no-color -out=plan.bin' 'stufe schranke schranke' 'stufe apply tofu apply -no-color plan.bin' 'echo "Pipeline bestanden"' > ci.shHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Es laufen lassen, schild.tf unordentlich
bash ci.sh; echo "Pipeline-Exitcode $?"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Layout korrigieren und erneut starten
tofu fmt -no-color; bash ci.sh; echo "Pipeline-Exitcode $?"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, eine grüne Pipeline beweise, dass die Änderung sicher ist. Sie beweist nur, dass jede geschriebene Prüfung bestanden hat. Eine Änderung kann gültig, geplant und angewendet sein und trotzdem die falsche Änderung bleiben. Die Schranke und ein Mensch, der den Plan liest, sind die Sicherheit.
Eine Schranke liest den Plan vor dem Apply
Die Stufe plan hat den Plan in plan.bin gespeichert, und die Stufe apply führt genau diese Datei aus und nichts sonst. Was die Schranke gebilligt hat, ist also das, was läuft.
tofu show -json macht aus dem Plan Daten. Der Filter der Schranke sagt nein, sobald eine Ressource gelöscht werden soll.
Eine Ressource löschen und starten
rm schild.tf; bash ci.sh; echo "Pipeline-Exitcode $?"; tofu state listHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine gehostete Pipeline ist eine Datei
Bei einem Dienst, der Pipelines hostet, stehen die Stufen in einer Datei im Repository, und der Dienst führt sie auf seiner eigenen Maschine aus. Ein Job kann mit needs auf einen anderen warten.
Hier können Sie keine ausführen, weil es keinen gehosteten Runner gibt. Sie können eine schreiben und lesen.
Eine Workflow-Datei schreiben
mkdir -p .github/workflows && printf '%s\n' 'name: infra' 'on:' ' pull_request:' ' push:' ' branches: [main]' 'jobs:' ' pruefen:' ' runs-on: ubuntu-latest' ' steps:' ' - uses: actions/checkout@v4' ' - run: tofu fmt -check' ' - run: tofu validate' ' - run: tofu plan -out=plan.bin' ' anwenden:' ' needs: pruefen' " if: github.ref == 'refs/heads/main'" ' runs-on: ubuntu-latest' ' steps:' ' - run: tofu apply plan.bin' > .github/workflows/infra.ymlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Reihenfolge und Befehle darin finden
grep -nE "^ (pruefen|anwenden):|needs:|run:" .github/workflows/infra.ymlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Lauf in Python berechnet
# Eine Pipeline ausführen, deren Stufen von früheren abhängen.
stufen = {"pruefen": [], "plan": ["pruefen"], "anwenden": ["plan"]}
fehlgeschlagen = {"plan"}
stand = {}
for name in ["pruefen", "plan", "anwenden"]:
blockiert = False
for noetig in stufen[name]:
if stand[noetig] != "bestanden":
blockiert = True
if blockiert:
stand[name] = "uebersprungen"
elif name in fehlgeschlagen:
stand[name] = "fehlgeschlagen"
else:
stand[name] = "bestanden"
print(name, stand[name])
# Leeren Sie die Menge fehlgeschlagen und schauen Sie noch einmal.