Ergebnisse weitergeben – und Pipelines schneller machen.
Wovon hängt ab, ob der nächste Stage startet?
Ein Stage muss vollständig grün sein, sonst stoppt die Pipeline.
Jeder Job startet in einem frischen Container. Lädt pytest Dependencies herunter,
sind sie für den nächsten Job verschwunden. Erzeugt es einen Coverage-Report, sieht ihn niemand.
Zwei Keywords lösen zwei verschiedene Probleme:
artifacts |
cache |
|
|---|---|---|
| Zweck | Ergebnis weitergeben | Dateien wiederverwenden |
| Beispiel | Coverage-Report, Build-Output | heruntergeladene pip-Pakete |
| Verlässlich da? | Ja (nach grünem Job) | Nein – nur ein Beschleuniger |
| Sichtbar in UI? | Ja, herunterladbar | Nein |
pytest:
stage: test
script:
- pip install -r requirements.txt pytest-cov
- pytest --cov=app --cov-report=xml --junitxml=report.xml
artifacts:
paths:
- coverage.xml
reports:
junit: report.xml # GitLab zeigt Testergebnisse im MR an
expire_in: 1 week # nach 1 Woche automatisch gelöscht
paths: sind Dateien zum Download. reports: sind spezielle Artifacts,
die GitLab versteht und im Merge Request aufbereitet (z. B. Test- und Coverage-Reports).
pip-Downloads wiederverwendenpytest:
stage: test
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.pip-cache"
cache:
key:
files:
- requirements.txt # neuer Cache nur bei Änderung
paths:
- .pip-cache/
script:
- pip install -r requirements.txt && pytest -q
key: files: [requirements.txt] bekommst du einen neuen Cache nur, wenn sich die
Dependencies ändern. So bleibt der Cache aktuell, ohne ihn ständig neu aufzubauen.
artifacts: when: always.
$CI_PROJECT_DIR liegen. Ein systemweiter Pfad wie
/root/.cache lässt sich nicht direkt cachen – deshalb lenken wir PIP_CACHE_DIR ins Projekt um.
expire_in sammeln sich Artifacts an und füllen den Projekt-Speicher. Im Workshop ein
gern vergessener Punkt – immer ein Ablaufdatum setzen.
Frage: Der build-Job erzeugt ein Wheel (dist/*.whl),
das der deploy-Job installieren soll. Artifact oder Cache?
Artifact. Das Wheel ist ein Ergebnis, das verlässlich an einen späteren Job
weitergegeben werden muss – genau die Aufgabe von artifacts: paths: [dist/]. Ein Cache
wäre falsch, weil er fehlen darf.
Aufgabe: Ergänze den build-Job so, dass er den Ordner dist/
als Artifact mit Ablauf nach 3 Tagen weitergibt.
build:
stage: build
script:
- pip install build && python -m build
artifacts:
paths:
- dist/
expire_in: 3 daysSzenario: Ein Kollege cached /usr/local/lib/python3.12 und wundert sich,
dass nichts schneller wird. Was ist falsch?
Der Pfad liegt ausserhalb von $CI_PROJECT_DIR und kann gar nicht gecacht
werden. Richtig: PIP_CACHE_DIR ins Projektverzeichnis umlenken und diesen Ordner cachen.
Worauf darfst du dich bei Korrektheit niemals verlassen?
Cache ist optional und kann fehlen. Artifacts eines grünen Jobs sind verlässlich.
Wie sicherst du Logs eines fehlgeschlagenen Jobs?
Standardmässig nur bei Erfolg; when: always lädt Artifacts auch bei Fehlern hoch.
reports: lohnt oder wie man Caches teilt? Schreib mir.