variables, before_script, default, extends – Wiederholung vermeiden.
pip install …. Sobald eine Pipeline wächst, wird das
unwartbar. Variablen und Vererbung machen die .gitlab-ci.yml kurz, lesbar und änderbar an
einer Stelle – die Grundlage jeder professionellen Pipeline.
Welches Keyword gibt ein Ergebnis an spätere Jobs weiter?
Artifacts geben verlässlich weiter; Cache ist nur ein Beschleuniger.
variables – Werte benennenvariables: # global: gilt für alle Jobs
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.pip-cache"
APP_DIR: "app"
ruff:
stage: lint
variables: # job-lokal: überschreibt global
RUFF_FLAGS: "--select E,F"
script:
- ruff check $APP_DIR $RUFF_FLAGS
Variablen werden mit $NAME verwendet. Job-lokale Variablen gewinnen gegen globale.
default – gemeinsame Job-Einstellungendefault:
image: python:3.12-slim
before_script: # läuft vor JEDEM script
- python --version
- pip install -r requirements.txt
before_script in default spart das wiederholte Setup. Jeder Job führt es
automatisch vor seinem eigenen script aus.
extends – Job-Vorlagen erben.python-job: # „hidden job" (Punkt-Präfix): läuft nie selbst
image: python:3.12-slim
before_script:
- pip install -r requirements.txt
pytest:
extends: .python-job # erbt image + before_script
stage: test
script:
- pytest -q
mypy:
extends: .python-job
stage: test
script:
- pip install mypy && mypy app
.python-job
– nicht in fünf Jobs.
. beginnt (.python-job), wird nie ausgeführt – er dient
nur als Vorlage zum extends. Praktisch, um Bausteine zu definieren.
CI_COMMIT_BRANCH, CI_PROJECT_DIR,
CI_PIPELINE_SOURCE, CI_REGISTRY_IMAGE … Du brauchst sie in fast jeder
späteren Lektion. (Referenz: Variablen-Spickzettel.)
variables: im Repo schreiben – das ist Klartext in der
Versionsgeschichte. Stattdessen CI/CD-Variablen in den Projekt-Einstellungen anlegen und dort als
masked / protected markieren. Mehr dazu in Lektion 12.
before_script, ersetzt es das aus default –
es wird nicht angehängt. Überraschend, wenn das globale Setup plötzlich fehlt.
Aufgabe: Drei Jobs beginnen alle mit
pip install -r requirements.txt. Zieh das in einen Hidden Job .deps und nutze
extends.
.deps:
before_script:
- pip install -r requirements.txt
pytest:
extends: .deps
stage: test
script: [pytest -q]Frage: Global gilt GREETING: "hallo", im Job steht
GREETING: "ciao". Was gibt echo $GREETING im Job aus?
ciao. Job-lokale Variablen überschreiben gleichnamige globale.
Frage: Wohin gehört ein Deploy-Token DEPLOY_KEY – und warum nicht ins File?
In die CI/CD-Variablen der Projekt-Einstellungen, als masked und protected. Im YAML wäre es Klartext in der Git-Historie – ein dauerhaftes Leck, selbst nach späterem Entfernen.
Wozu dient ein Job mit Punkt-Präfix wie .base?
Hidden Jobs werden nie ausgeführt; sie dienen als Vorlage für extends.
Wo gehören Passwörter und Tokens hin?
Im Repo wären sie dauerhaft in der Git-Historie. Projekt-CI/CD-Variablen, masked + protected.
extends mit mehreren Vorlagen mischt? Schreib mir.