# CI-Pipeline — Spiegel von .gitea/workflows/ci.yml (identischer Job-Inhalt). # Primäres Remote ist Gitea (Gitea); diese Datei greift nur, falls das # Repo (auch) auf einem GitHub-Actions-Remote gespiegelt wird. # # WICHTIG: Braucht einen aktivierten Actions-Runner. Ohne Runner läuft der # Workflow nicht an (kein Fehlschlag, nur kein Lauf). name: CI on: push: branches: ["main", "dev", "dev-*"] pull_request: branches: ["main", "dev", "dev-*"] jobs: # Vollständiges Qualitäts-Gate (= `npm run gate`) gegen echte Infrastruktur: # Postgres 16 mit pgvector + Redis als Service-Container. Garage/S3 wird bewusst # weggelassen: der Storage-Adapter fällt ohne S3_* auf den Stub zurück, S3-abhängige # Prüfungen (test-garage-storage, Byte-Abruf in test-einsatz-sync/test-berichte-pdf) # überspringen sich. Ohne SMTP_HOST überspringt test-mail den echten Versand, ohne # ANTHROPIC_API_KEY/TRANSCRIPTION_API_KEY die Live-KI-Tests. test-berichte-pdf nutzt # Google Chrome des Runners (channel "chrome") oder überspringt sich ohne Browser. gate: runs-on: ubuntu-latest timeout-minutes: 60 services: postgres: image: pgvector/pgvector:0.8.0-pg16 env: POSTGRES_USER: craftvia POSTGRES_PASSWORD: craftvia POSTGRES_DB: craftvia ports: - 5432:5432 options: >- --health-cmd "pg_isready -U craftvia" --health-interval 5s --health-timeout 5s --health-retries 20 redis: image: redis:7.4.2-alpine ports: - 6379:6379 options: >- --health-cmd "redis-cli ping" --health-interval 5s --health-timeout 5s --health-retries 20 # Nur CI-Dummywerte (keine echten Secrets). GitHub-Hosted-Runner: Service-Ports auf localhost. env: DATABASE_URL: "postgresql://craftvia:craftvia@localhost:5432/craftvia?schema=public" # RLS-Test (scripts/test-rls-enforcement.ts): RLS_ENFORCED bleibt aus, der Test schaltet # selbst scharf. RLS_TEST_REQUIRED=true macht aus dem Skip einen harten Fehler. RLS_DATABASE_URL: "postgresql://craftvia_app:craftvia_app_ci@localhost:5432/craftvia?schema=public" RLS_TEST_REQUIRED: "true" REDIS_URL: "redis://localhost:6379" AUTH_SECRET: "ci-dummy-auth-secret-0000000000000000" AUTH_URL: "http://localhost:3000" APP_BASE_URL: "http://localhost:3000" PASSWORD_PEPPER: "0000000000000000000000000000000000000000000000000000000000000abc" steps: - name: Checkout uses: actions/checkout@v4 - name: Node 22 einrichten uses: actions/setup-node@v4 with: node-version: "22.14.0" # npm 11 pinnen: Das committete Lockfile wurde mit npm 11 erzeugt; node 22.14 # bringt npm 10.9.2 mit, das next@16.2.12 -> @swc/helpers anders auflöst und # `npm ci` sonst mit "out of sync" abbricht (siehe Dockerfile). - name: npm 11 pinnen run: npm i -g npm@11.19.0 - name: Abhängigkeiten installieren (Lockfile bindend) run: npm ci --include=optional --no-audit --no-fund - name: Prisma Client generieren run: npx prisma generate - name: Migrationen anwenden run: npx prisma migrate deploy - name: Demo-Seed run: npx prisma db seed # Die Baseline-Migration legt craftvia_app NOLOGIN an; das Passwort ist ein Betriebs- # Secret und wird nie migriert. Für den RLS-Test hier ein CI-Dummy-Passwort setzen # (über die Prisma-Config-Datasource, damit kein psql-Client nötig ist). - name: RLS-Rolle craftvia_app mit LOGIN versehen run: echo "ALTER ROLE craftvia_app WITH LOGIN PASSWORD 'craftvia_app_ci';" | npx prisma db execute --stdin - name: Typprüfung (tsc --noEmit) run: npx tsc --noEmit - name: Lint run: npm run lint - name: Build run: npm run build - name: Tests (scripts/test-*.ts) run: npm run test audit: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Node 22 einrichten uses: actions/setup-node@v4 with: node-version: "22.14.0" - name: npm 11 pinnen run: npm i -g npm@11.19.0 - name: Abhängigkeiten installieren run: npm ci --include=optional --no-audit --no-fund # HARTES Gate: nur Produktions-Abhängigkeiten, ab "high" bricht der Build. # Bewusst --omit=dev, weil die bekannten High-Findings (F-12) in der # Build-/Lint-Toolchain (devDependencies) liegen und die Auslieferung nicht # gefährden. Der Produktionsbaum ist aktuell frei von high/critical -> grün. - name: npm audit (Gate, prod-only, high+) run: npm audit --omit=dev --audit-level=high # INFORMATIV: voller Lauf inkl. devDependencies. Bricht den Build NICHT. - name: npm audit (informativ, voller Baum) continue-on-error: true run: npm audit --audit-level=high sbom: # Optionaler Schritt: erzeugt eine Software Bill of Materials (CycloneDX). runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Node 22 einrichten uses: actions/setup-node@v4 with: node-version: "22.14.0" - name: npm 11 pinnen run: npm i -g npm@11.19.0 - name: Abhängigkeiten installieren run: npm ci --include=optional --no-audit --no-fund # Hinweis: `npm sbom` validiert den installierten Baum streng. Solange das # Lockfile die @swc/helpers-Inkonsistenz trägt (siehe Dockerfile / Folgeänderung # der Dependency-Lane), bricht der Schritt mit ESBOMPROBLEMS ab — daher # continue-on-error. Alternative ohne npm-Baum-Validierung: Syft gegen das # gebaute Image (siehe docs/_certvia-archiv/DEPLOY-PROD-CONTABO.md, Abschnitt SBOM). - name: SBOM erzeugen (CycloneDX) continue-on-error: true run: npm sbom --sbom-format cyclonedx --omit dev > sbom.cyclonedx.json - name: SBOM als Artefakt ablegen continue-on-error: true uses: actions/upload-artifact@v4 with: name: sbom-cyclonedx path: sbom.cyclonedx.json