Vom Zweischritt zur echten Kette: build → test → deploy mit parallelen Jobs.
Erst aus dem Kopf, dann weiterlesen – das festigt Lektion 1:
Wie laufen mehrere Jobs im selben Stage?
Jobs eines Stages laufen parallel (sofern genug Runner-Kapazität da ist). Genau das nutzen wir gleich aus.
Unsere Tasks-API bekommt jetzt vier Stationen. Manche Stationen haben mehrere Arbeiter, die gleichzeitig anpacken:
pytest und mypy laufen gleichzeitig. Erst wenn beide grün sind, beginnt build..gitlab-ci.ymlstages:
- lint
- test
- build
- deploy
default:
image: python:3.12-slim
ruff:
stage: lint
script:
- pip install ruff && ruff check app tests
pytest: # läuft parallel zu mypy
stage: test
script:
- pip install -r requirements.txt && pytest -q
mypy: # läuft parallel zu pytest
stage: test
script:
- pip install mypy && mypy app
package:
stage: build
script:
- pip install build && python -m build
deploy:
stage: deploy
script:
- echo "Deploy nach staging … (echtes Deploy folgt in Lektion 9)"
Zwei Jobs (pytest, mypy) teilen sich den Stage test – also laufen sie
gleichzeitig. Die Reihenfolge der Stages in der stages:-Liste bestimmt den Ablauf der Stationen.
stages:)
und die Parallelität (mehrere Jobs in denselben Stage legen).
stages: ganz weglässt, nutzt GitLab automatisch:
.pre → build → test → deploy → .post. Ein Job ohne stage:-Angabe landet
standardmässig in test.
.pre (immer ganz zuerst) und .post (immer ganz zuletzt)
brauchst du nicht in stages: aufzulisten – sie sind immer verfügbar. Praktisch z. B. für
einen globalen Setup- oder Aufräum-Job.
pytest startet nicht zwingend vor mypy. Verlass dich nie auf die Start-Reihenfolge
paralleler Jobs – sie dürfen nicht voneinander abhängen. (Echte Abhängigkeiten kommen in Lektion 10 mit needs.)
Frage: Du fügst dem Stage build einen zweiten Job docs hinzu.
Laufen package und docs nacheinander oder gleichzeitig?
Gleichzeitig – sie sind im selben Stage build. deploy startet erst,
wenn beide fertig und grün sind.
Aufgabe: Ergänze die Pipeline um einen neuen Stage security
zwischen test und build, mit einem Job pip-audit,
der pip install pip-audit && pip-audit ausführt.
Tipp: Zwei Stellen ändern – die stages:-Liste und einen neuen Job-Block.
stages:
- lint
- test
- security # neu, an der richtigen Position
- build
- deploy
# … bestehende Jobs …
pip-audit:
stage: security
script:
- pip install pip-audit && pip-audit
Die Position in stages: bestimmt, wann der Stage läuft –
nicht die Position des Job-Blocks weiter unten.
Frage: mypy schlägt fehl, pytest ist grün.
Welche der Stages build und deploy laufen noch?
Keiner von beiden. Da mypy im Stage test rot ist, gilt der ganze
Stage als fehlgeschlagen – build und deploy starten nicht.
(Wie man einen Job trotzdem „nicht blockierend" macht, zeigt allow_failure später.)
Was bestimmt, in welcher Reihenfolge Stages ablaufen?
Allein die stages:-Liste legt die Reihenfolge fest. Wo der Job-Block in der Datei steht,
ist egal.
Welchen Stage bekommt ein Job ganz ohne stage:?
Ohne Angabe landet ein Job im Stage test – Teil der vordefinierten Reihenfolge
.pre, build, test, deploy, .post.
stages & stage.
Schau dir die Abschnitte zu vordefinierten Stages und .pre/.post an.