Wann läuft was? Jobs und ganze Pipelines gezielt steuern.
main, manche Jobs nur
im Merge Request. rules ist das Steuerpult dafür – und der Punkt, an dem aus „läuft halt alles"
eine durchdachte Pipeline wird.
Wohin gehören geheime Tokens?
Im YAML wären sie Klartext in der Historie. Projekt-Variablen, masked + protected.
Früher steuerte man Jobs mit only/except. Heute ist rules der
Standard – mächtiger und besser lesbar. Mische die beiden nie im selben Job.
Eine rules-Liste wird von oben nach unten ausgewertet. Die erste
zutreffende Regel gewinnt und bestimmt, ob (und wie) der Job läuft. Trifft keine zu, läuft der Job nicht.
rules: ifdeploy:
stage: deploy
script:
- ./deploy.sh
rules:
# nur auf dem Default-Branch (main) automatisch deployen
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
# sonst: gar nicht
- when: never
Die wichtigsten vordefinierten Variablen für Regeln:
CI_PIPELINE_SOURCE | push, merge_request_event, schedule, web … |
CI_COMMIT_BRANCH | Name des Branches (bei Branch-Pipelines) |
CI_DEFAULT_BRANCH | Der Default-Branch des Projekts (meist main) |
CI_COMMIT_TAG | gesetzt, wenn die Pipeline für einen Tag läuft |
rules:
# nur wenn sich App-Code geändert hat
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
- app/**/*
# nur wenn eine Datei existiert
- exists:
- Dockerfile
rules: changes – läuft nur bei Änderung bestimmter Pfade.rules: exists – läuft nur, wenn eine Datei im Repo vorhanden ist.when: und allow_failure: in einer Regel lässt sich zusätzlich steuern,
wie der Job läuft (z. B. when: manual).workflow
rules entscheidet pro Job. workflow: rules entscheidet, ob die Pipeline
überhaupt entsteht – ideal gegen doppelte Pipelines:
workflow:
rules:
# keine Pipeline für Commits mit „-draft" im Titel
- if: $CI_COMMIT_TITLE =~ /-draft$/
when: never
# Pipeline für Merge Requests …
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# … und für den Default-Branch
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
workflow bekommst du leicht zwei Pipelines pro Push in einem MR: eine
Branch-Pipeline und eine Merge-Request-Pipeline. Das ist der Klassiker im Workshop – mit
workflow: rules entscheidest du dich für eine.
rules und only/except nicht mischen
In einem Job ist nur eines erlaubt. Neue Pipelines konsequent mit rules bauen.
$CI_DEFAULT_BRANCH statt fest "main". Heisst der Branch mal anders,
funktioniert die Regel trotzdem.
Aufgabe: Ein Job publish soll nur laufen, wenn die Pipeline für einen
Tag startet (Release).
publish:
stage: deploy
script: [./publish.sh]
rules:
- if: $CI_COMMIT_TAG
$CI_COMMIT_TAG ist nur bei Tag-Pipelines gesetzt – die Bedingung ist dann „wahr".
Frage: Regel 1 = if: $CI_COMMIT_BRANCH (also jeder Branch),
Regel 2 = if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH, when: manual. Wird der Job auf
main manuell?
Nein. Regel 1 trifft auf jeden Branch zu – auch main – und gewinnt, weil
sie zuerst steht. Der Job läuft automatisch. Reihenfolge umdrehen, damit die spezielle Regel greift.
Szenario: Bei jedem Push in einen MR-Branch laufen zwei identische Pipelines. Was hilft?
Ein workflow: rules-Block, der entweder MR- oder Branch-Pipelines zulässt –
nicht beide. Das verhindert die Doppelung.
Welche Regel einer rules-Liste zählt?
Auswertung von oben; die erste passende Regel gewinnt. Darum spezielle zuerst.
Was steuert workflow: rules?
workflow entscheidet auf Pipeline-Ebene; rules auf Job-Ebene.