Integrationstests gegen Postgres, direkt in der Pipeline.
services startet GitLab dir eine Wegwerf-DB
neben dem Job. Das ist der Schritt von „Spielzeug-Pipeline" zu „testet wie in echt".
Welche Variable nennt den Default-Branch des Projekts?
CI_DEFAULT_BRANCH – robuster als der feste Name "main".
services startet zusätzlich zum Job-Container einen weiteren Container – z. B. Postgres.
Beide laufen im selben Netzwerk; der Job erreicht den Service über einen Hostnamen.
Der Hostname ist standardmässig vom Image abgeleitet – am klarsten setzt man ihn per alias.
postgres..gitlab-ci.ymlintegration-test:
stage: test
image: python:3.12-slim
services:
- name: postgres:16
alias: postgres # Hostname für den Job
variables:
POSTGRES_DB: tasks_test
POSTGRES_USER: tasks
POSTGRES_PASSWORD: secret
# die App liest ihre Verbindung aus DATABASE_URL:
DATABASE_URL: "postgresql://tasks:secret@postgres:5432/tasks_test"
script:
- pip install -r requirements.txt pytest
- pytest tests/integration -q
Die POSTGRES_*-Variablen werden an beide Container übergeben: Postgres
initialisiert damit Datenbank und Benutzer, und der Job nutzt dieselben Werte in
DATABASE_URL – Hostname postgres, Port 5432.
pg_isready
in einer Schleife im before_script, bevor die Tests starten.
alias wäre der Host vom Image-Namen abgeleitet (Doppelpunkt-Teil weg, Slashes zu
Sonderzeichen). Ein expliziter alias: postgres ist vorhersehbar und lesbar – immer setzen.
POSTGRES_PASSWORD (oder POSTGRES_HOST_AUTH_METHOD: trust) weigert sich das
offizielle Postgres-Image zu starten. Im Test ist ein simples Passwort okay – es ist eine Wegwerf-DB.
docker:dind (nächste Lektion).
„Service" heisst einfach: ein Begleit-Container, den dein Job über einen Hostnamen erreicht.
Frage: Der Service hat alias: db. Wie lautet die DATABASE_URL
für Benutzer app, Passwort pw, DB shop?
postgresql://app:pw@db:5432/shop – Hostname ist der alias, Port 5432.
Aufgabe: Ergänze ein before_script, das wartet, bis Postgres bereit ist,
bevor die Tests laufen. (Tipp: pg_isready -h postgres.)
before_script:
- apt-get update && apt-get install -y postgresql-client
- until pg_isready -h postgres -U tasks; do sleep 1; done
Die Schleife blockiert, bis die DB Verbindungen annimmt – das beseitigt sporadische „connection refused"-Fehler.
Frage: Du brauchst zusätzlich Redis. Wie viele Einträge unter services:
und wie erreichst du Redis?
Zwei Service-Einträge (Postgres + name: redis:7, alias: redis).
Redis erreichst du unter Host redis, Port 6379. Mehrere Services sind völlig normal.
Wie erreicht ein Job seinen Service-Container?
Job- und Service-Container teilen ein Netzwerk; Zugriff per Hostname (Image-Name oder alias).
Warum scheitern Tests manchmal direkt am Start?
Postgres braucht Zeit zum Hochfahren – vor den Tests auf Bereitschaft warten.