Files
Laufzettel/.gitea/workflows/ci.yml
T
Florian Wilde d97aebed95
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat(betrieb): native Installation, Proxmox-Einzeiler und Abnahme (#37)
Zwei Wege in den Betrieb, beide so weit gefahren, wie es hier moeglich war.

deploy/install.sh richtet Debian 13 in neun Schritten ein: PostgreSQL 17 hoert
nur am Unix-Socket, der Dienstnutzer hat kein Login, die Geheimnisse entstehen
im Zielsystem und liegen 0600 bei root. Die Umgebungsdatei wird nie
ueberschrieben -- auch nicht beim Aktualisieren, sonst enden alle Sitzungen und
die verschluesselten Bind-Passwoerter waeren unlesbar.

deploy/proxmox/laufzettel.sh legt den Container an und ruft install.sh darin
auf. Der pct-Teil ist ungetestet, weil kein PVE-Host zur Verfuegung stand; die
Gegenprobe steht als Pruefliste in docs/betrieb/proxmox.md, das Folge-Issue ist
Nummer 38.

Die Abnahme gegen alle 61 Kriterien hat drei Zusagen ohne Deckung gefunden, alle
behoben: der Healthcheck des Webdienstes konnte nie bestehen (busybox loest
localhost nach ::1 auf, Next lauscht nur auf IPv4), die CI-Pipeline konnte in
keinem Job gruen werden (kein LDAP-Dienst, kein gestarteter Server, kein
shellcheck), und der README nannte fuer die Entwicklungsdatenbank den falschen
Port.

Closes #19
2026-09-27 13:09:14 +02:00

170 lines
5.4 KiB
YAML

name: Prüfung
on:
push:
branches: [main, "feat/**", "fix/**"]
pull_request:
branches: [main]
jobs:
pruefung:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:17-alpine
env:
POSTGRES_USER: laufzettel
POSTGRES_PASSWORD: laufzettel
POSTGRES_DB: laufzettel_test
options: >-
--health-cmd "pg_isready -U laufzettel"
--health-interval 5s
--health-timeout 5s
--health-retries 10
env:
DATABASE_URL: postgresql://laufzettel:laufzettel@localhost:5432/laufzettel_test?schema=public
TEST_DATABASE_URL: postgresql://laufzettel:laufzettel@localhost:5432/laufzettel_test?schema=public
APP_SECRET: ci-geheimnis-mit-mindestens-32-zeichen-laenge
APP_URL: http://localhost:3000
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
- name: pnpm bereitstellen
run: corepack enable pnpm
env:
COREPACK_ENABLE_DOWNLOAD_PROMPT: 0
- name: Abhängigkeiten installieren
run: pnpm install --frozen-lockfile
- name: Prisma-Client erzeugen
run: pnpm exec prisma generate
# Der Verzeichnis-Abgleich wird gegen ein echtes OpenLDAP geprueft. Ohne
# diesen Container bricht `pnpm test` in CI ab (tests/fixtures/ldap gibt in
# CI absichtlich keinen stillen Uebersprung) -- gefunden bei der Abnahme zu
# #019. Kein services:-Block, weil der Container die Fixture-LDIFs aus dem
# Arbeitsbaum einhaengt und Dienste vor dem Checkout starten.
#
# Bedingung an den Runner: die Schritte muessen den von compose
# veroeffentlichten Port 127.0.0.1:1389 selbst erreichen. Auf einem
# act_runner, der die Schritte in einem Container ausfuehrt und nur den
# Docker-Socket durchreicht, liegt der Port auf dem Host -- dort braucht es
# `--network host` fuer den Job oder einen Runner im Host-Modus. Ungeprueft:
# fuer dieses Repo ist noch kein Runner registriert.
- name: LDAP-Testverzeichnis starten
run: docker compose -f docker-compose.test.yml up -d --wait ldap
- name: Code-Stil prüfen
run: pnpm lint
- name: Format prüfen
run: pnpm format:pruefen
- name: Typen prüfen
run: pnpm typecheck
- name: Tests
run: pnpm test
- name: Bauen
run: pnpm build
- name: Dokumentation prüfen
run: pnpm pruefe:doku
# Im Container und nicht per apt: so laeuft in CI genau die Fassung, die
# auch lokal geprueft wird, und der Runner braucht shellcheck nicht selbst
# mitzubringen.
- name: Shell-Skripte prüfen
run: |
docker run --rm -v "$PWD:/mnt:ro" koalaman/shellcheck:stable \
--severity=warning /mnt/deploy/install.sh /mnt/deploy/proxmox/laufzettel.sh
- name: LDAP-Testverzeichnis stoppen
if: always()
run: docker compose -f docker-compose.test.yml down -v
e2e:
runs-on: ubuntu-latest
needs: pruefung
services:
postgres:
image: postgres:17-alpine
env:
POSTGRES_USER: laufzettel
POSTGRES_PASSWORD: laufzettel
POSTGRES_DB: laufzettel_test
options: >-
--health-cmd "pg_isready -U laufzettel"
--health-interval 5s
--health-timeout 5s
--health-retries 10
env:
DATABASE_URL: postgresql://laufzettel:laufzettel@localhost:5432/laufzettel_test?schema=public
APP_SECRET: ci-geheimnis-mit-mindestens-32-zeichen-laenge
APP_URL: http://127.0.0.1:3000
AUTH_LOCAL_ENABLED: "true"
SEED_ADMIN_EMAIL: admin@firma.example
SEED_ADMIN_PASSWORD: ci-passwort-nur-fuer-tests
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
- name: pnpm bereitstellen
run: corepack enable pnpm
env:
COREPACK_ENABLE_DOWNLOAD_PROMPT: 0
- name: Abhängigkeiten installieren
run: pnpm install --frozen-lockfile
- name: Browser holen
run: pnpm exec playwright install --with-deps chromium
- name: Schema und Seed
run: pnpm exec prisma migrate deploy && pnpm db:seed
- name: Bauen
run: pnpm build
# Playwright bringt keinen Server mit (kein webServer in der Config, damit
# lokal immer gegen einen bewusst gebauten Stand geprueft wird). In CI muss
# er deshalb hier starten, sonst bricht global-setup mit „Unter
# http://127.0.0.1:3000 antwortet keine Anwendung“ ab -- gefunden bei der
# Abnahme zu #019.
- name: Gebauten Stand starten
run: |
pnpm start &
echo $! > /tmp/laufzettel.pid
for i in $(seq 1 60); do
if curl -fsS http://127.0.0.1:3000/api/gesundheit > /dev/null; then
echo "Anwendung antwortet nach ${i}s."
exit 0
fi
sleep 1
done
echo "Die Anwendung ist nicht hochgekommen." >&2
exit 1
- name: Ende-zu-Ende-Tests
run: pnpm exec playwright test
- name: Stand beenden
if: always()
run: kill "$(cat /tmp/laufzettel.pid)" || true
- uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-bericht
path: playwright-report/
retention-days: 7