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