Dein erstes .gitlab-ci.yml – eine echte App testet sich selbst.
Statt „Hello World" begleitet uns durch den ganzen Kurs eine kleine, echte App: eine FastAPI-„Tasks"-API in Python – ein Service, der Aufgaben verwaltet. Das Repo enthält ungefähr das hier:
tasks-api/
├── app/
│ └── main.py # die FastAPI-App
├── tests/
│ └── test_main.py # pytest-Tests
├── requirements.txt
└── .gitlab-ci.yml # ← darum geht es
Jedes Mal, wenn jemand Code pusht, soll GitLab automatisch prüfen: Ist der Code sauber formatiert? Laufen die Tests durch? Genau das ist die Aufgabe einer Pipeline.
Eine Pipeline besteht aus vier Bausteinen. Mehr brauchst du fürs Erste nicht:
Bildlich: die Pipeline ist das Fliessband, Stages sind die Stationen in fester Reihenfolge, und Jobs sind die Arbeiter, die an einer Station gleichzeitig anpacken.
test startet erst, wenn lint grün ist..gitlab-ci.ymlDie ganze Pipeline lebt in einer einzigen YAML-Datei im Wurzelverzeichnis des Repos. Hier ist sie – Zeile für Zeile danach erklärt:
stages:
- lint
- test
default:
image: python:3.12-slim
ruff:
stage: lint
script:
- pip install ruff
- ruff check app tests
pytest:
stage: test
script:
- pip install -r requirements.txt
- pytest -q
stages: legt fest: erst lint, dann test. Die Reihenfolge zählt.default: image: – alle Jobs laufen im Docker-Image python:3.12-slim,
sofern sie nichts anderes sagen. (Mehr zu image in einer späteren Lektion.)ruff: und pytest: sind die Namen der Jobs – frei wählbar.stage: und ein script: – eine Liste von Shell-Befehlen.script fehl (Exit-Code ≠ 0), gilt der Job als rot – und die Pipeline stoppt.ruff aus, und nur wenn das klappt, danach pytest.
.gitlab-ci.yml heissen (mit führendem Punkt) und im
Repo-Wurzelverzeichnis liegen. gitlab-ci.yaml oder ein Unterordner werden ignoriert.
tags
erreichbar sein – sonst bleibt der Job „pending" hängen.
stages,
default, variables, workflow, include).
Die kannst du nicht als Job-Namen verwenden.
Nicht spicken – Abrufen aus dem Gedächtnis ist genau die Übung, die hängen bleibt.
In welcher Beziehung stehen Stages und Jobs zeitlich zueinander?
Stages bilden eine feste Reihenfolge; der nächste startet erst, wenn der vorige komplett grün ist. Innerhalb eines Stages laufen alle Jobs gleichzeitig.
Welches Keyword ist in jedem Job zwingend erforderlich?
Ein Job ohne script ist ungültig. image und cache sind optional
(das Image kann auch global per default kommen).
Was passiert, wenn der lint-Stage rot wird?
Ein Stage muss vollständig erfolgreich sein, damit der nächste startet. Genau das verhindert, dass fehlerhafter Code überhaupt erst getestet oder deployt wird.