diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 4312dae..4600444 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -1,4 +1,5 @@ -# CI für Pull Requests und main – läuft auf einem Forgejo-Runner mit Docker-Label +# CI für Pull Requests und main – läuft auf einem Forgejo-Runner mit Docker-Label. +# Flutter-Projekt liegt in app/, Supabase in supabase/. name: CI on: @@ -6,11 +7,18 @@ on: push: branches: [main] +env: + SUPABASE_CLI_VERSION: 3.0.0 + jobs: + # Format, Analyse, Tests. Generierte Dateien (*.g.dart, gen-l10n) sind eingecheckt und + # werden hier neu erzeugt; ein Diff bedeutet: Generierung im PR vergessen. flutter: runs-on: docker container: - image: ghcr.io/cirruslabs/flutter:stable # für Releases auf feste Version pinnen + image: ghcr.io/cirruslabs/flutter:3.47.9 # = lokale Flutter-Version (Dart 3.13.7); in beiden Jobs gleich halten + env: + PUB_CACHE: ${{ github.workspace }}/.pub-cache defaults: run: working-directory: app @@ -20,23 +28,57 @@ jobs: - name: Pub-Cache uses: https://code.forgejo.org/actions/cache@v4 with: - path: /root/.pub-cache + path: ${{ github.workspace }}/.pub-cache key: pub-${{ hashFiles('app/pubspec.lock') }} + restore-keys: pub- - - name: Abhängigkeiten + - name: Abhängigkeiten (erzeugt auch gen-l10n) run: flutter pub get - name: Code-Generierung run: dart run build_runner build --delete-conflicting-outputs + - name: Generierte Dateien aktuell? + run: | + git config --global --add safe.directory "$GITHUB_WORKSPACE" + if ! git diff --exit-code -- . ; then + echo "::error::Generierte Dateien sind nicht aktuell. Lokal 'dart run build_runner build --delete-conflicting-outputs' und 'flutter gen-l10n' ausführen und committen." + exit 1 + fi + untracked=$(git ls-files --others --exclude-standard -- lib test) + if [ -n "$untracked" ]; then echo "Nicht eingecheckte generierte Dateien:"; echo "$untracked"; exit 1; fi + - name: Format - run: dart format --set-exit-if-changed lib test + run: dart format --set-exit-if-changed . - name: Analyse run: flutter analyze --fatal-infos - name: Tests - run: flutter test --coverage + run: flutter test + + # Web-Build parallel zu den Prüfungen; Platzhalterwerte aus app/env/ci.example.json (keine Secrets). + web-build: + runs-on: docker + container: + image: ghcr.io/cirruslabs/flutter:3.47.9 + env: + PUB_CACHE: ${{ github.workspace }}/.pub-cache + defaults: + run: + working-directory: app + steps: + - uses: https://code.forgejo.org/actions/checkout@v4 + + - name: Pub-Cache + uses: https://code.forgejo.org/actions/cache@v4 + with: + path: ${{ github.workspace }}/.pub-cache + key: pub-${{ hashFiles('app/pubspec.lock') }} + restore-keys: pub- + + - name: Abhängigkeiten + run: flutter pub get - name: Web-Build run: flutter build web --release --dart-define-from-file=env/ci.example.json @@ -44,9 +86,11 @@ jobs: supabase: runs-on: docker container: - image: node:22-bookworm + image: node:22.12-bookworm steps: - uses: https://code.forgejo.org/actions/checkout@v4 + with: + fetch-depth: 0 - name: Migrationen prüfen (ohne laufende DB) run: | test -d supabase/migrations || { echo "Keine Migrationen – übersprungen"; exit 0; } @@ -58,7 +102,7 @@ jobs: fi # RLS-/pgTAP-Tests: braucht einen Runner mit Docker-Socket (Label "docker-host"). - # Läuft nur, wenn Migrationen existieren. Ohne passenden Runner Job bei Bedarf deaktivieren. + # Nutzt die eingecheckte supabase/config.toml. Ohne passenden Runner Job bei Bedarf deaktivieren. supabase-tests: runs-on: docker-host steps: @@ -68,9 +112,10 @@ jobs: node-version: 22 - name: Supabase starten und Datenbanktests ausführen run: | + test -f supabase/config.toml || { echo "supabase/config.toml fehlt"; exit 1; } test -d supabase/migrations || { echo "Keine Migrationen – übersprungen"; exit 0; } - npx --yes supabase start -x studio,imgproxy,edge-runtime,logflare,vector - npx --yes supabase test db + npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} start -x studio,imgproxy,edge-runtime,logflare,vector + npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} test db - name: Aufräumen if: always() - run: npx --yes supabase stop --no-backup || true + run: npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} stop --no-backup || true diff --git a/env/ci.example.json b/env/ci.example.json deleted file mode 100644 index 10a05f7..0000000 --- a/env/ci.example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "SUPABASE_URL": "http://localhost:54321", - "SUPABASE_ANON_KEY": "public-anon-key-placeholder", - "APP_ENV": "ci" -}