compose.yaml aus docs/11-betrieb.md, ergänzt um Healthchecks für db-backup und offsite-backup. Das Dokument verlangt für jeden Dienst einen, die abgedruckte Fassung hatte für die beiden keinen, und ohne ihn zeigt Dockge nur "läuft", auch wenn seit Wochen nichts mehr gesichert wird. Die Migration läuft im Startkommando von web, nicht in einem Init-Container. Die Prisma-CLI samt Schema-Engine liegt dafür unter /app/migrator im Image: ein Container, der nur startet, wenn gerade eine Registry erreichbar ist, wäre auf einem Homeserver die falsche Bauart. Alle drei Images gebaut und laufen gegen eine echte Postgres-Instanz geprüft: web wendet Migrationen an und liefert /api/health aus, worker schreibt sein Lebenszeichen, pdf rendert ein echtes PDF. Die CI prüft Lint, Typen, Tests und E2E gegen den Standalone-Server, also so, wie der Container startet, und hält das Bündel-Budget aus docs/09-performance-und-ux.md ein. Phase 0 aus TASKS.md ist damit abgehakt.
109 lines
3.0 KiB
YAML
109 lines
3.0 KiB
YAML
name: Prüfung
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
concurrency:
|
|
group: ci-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
pruefen:
|
|
name: Lint, Typen, Tests
|
|
runs-on: ubuntu-latest
|
|
|
|
services:
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
env:
|
|
POSTGRES_DB: afis
|
|
POSTGRES_USER: afis
|
|
POSTGRES_PASSWORD: afis
|
|
ports: ['5432:5432']
|
|
options: >-
|
|
--health-cmd "pg_isready -U afis -d afis"
|
|
--health-interval 10s --health-timeout 5s --health-retries 5
|
|
|
|
env:
|
|
DATABASE_URL: postgresql://afis:afis@localhost:5432/afis
|
|
DIRECT_DATABASE_URL: postgresql://afis:afis@localhost:5432/afis
|
|
APP_URL: http://127.0.0.1:3100
|
|
AUTH_SECRET: nur-fuer-die-pruefung-mindestens-32-zeichen-lang
|
|
DISCORD_CLIENT_ID: pruefung
|
|
DISCORD_CLIENT_SECRET: pruefung
|
|
DISCORD_BOT_TOKEN: pruefung
|
|
DISCORD_GUILD_ID: '0'
|
|
NEXT_TELEMETRY_DISABLED: '1'
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: pnpm/action-setup@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 22
|
|
cache: pnpm
|
|
|
|
- run: pnpm install --frozen-lockfile
|
|
|
|
# Erzeugt den Prisma-Client nach packages/db/src/generated und übersetzt
|
|
# @afis/db. Muss vor lint, typecheck und test laufen.
|
|
- name: Datenbankpaket bauen
|
|
run: pnpm --filter @afis/db run build
|
|
|
|
- name: Datenbank aufbauen
|
|
run: pnpm db:deploy
|
|
|
|
- run: pnpm db:seed
|
|
|
|
- run: pnpm lint
|
|
|
|
- run: pnpm typecheck
|
|
|
|
# Die Regeltests in packages/db laufen gegen die echte Postgres-Instanz.
|
|
- run: pnpm test
|
|
|
|
- name: Playwright-Browser
|
|
run: pnpm --filter @afis/web exec playwright install --with-deps chromium
|
|
|
|
# Baut die Anwendung und prüft sie über den Standalone-Server, also genau
|
|
# so, wie der Container sie startet.
|
|
- run: pnpm test:e2e
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
if: failure()
|
|
with:
|
|
name: playwright-report
|
|
path: web/playwright-report/
|
|
retention-days: 7
|
|
|
|
# Budget aus docs/09-performance-und-ux.md: erste Route unter 120 kB
|
|
# JavaScript nach Kompression.
|
|
- name: Bündelgröße prüfen
|
|
run: pnpm --filter @afis/web exec node ../scripts/check-bundle-budget.mjs
|
|
|
|
images:
|
|
name: Images bauen
|
|
runs-on: ubuntu-latest
|
|
needs: pruefen
|
|
if: github.event_name == 'pull_request'
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
dienst: [web, worker, pdf]
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: docker/setup-buildx-action@v3
|
|
# Auf Pull Requests nur bauen, nicht schieben. Das Schieben macht
|
|
# .github/workflows/images.yml auf main.
|
|
- uses: docker/build-push-action@v6
|
|
with:
|
|
context: .
|
|
file: docker/${{ matrix.dienst }}.Dockerfile
|
|
push: false
|
|
cache-from: type=gha,scope=${{ matrix.dienst }}
|
|
cache-to: type=gha,mode=max,scope=${{ matrix.dienst }}
|