# 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: pull_request: push: branches: [main] env: SUPABASE_CLI_VERSION: 3.0.0 # Einzige Stelle für die Flutter-Version (= lokale Version, Dart 3.13.7; muss zu app/pubspec.yaml passen). # Muss ein existierendes Tag in github.com/flutter/flutter sein. Ein Cirrus-Image mit dieser Version gibt es nicht. FLUTTER_VERSION: 3.47.9 FLUTTER_HOME: /opt/flutter 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: node:22.12-bookworm # gepinnt; enthält git, curl, unzip, xz und Node (für JS-Actions) env: PUB_CACHE: ${{ github.workspace }}/.pub-cache defaults: run: working-directory: app steps: - uses: https://code.forgejo.org/actions/checkout@v4 - name: Flutter-SDK-Cache id: flutter-cache uses: https://code.forgejo.org/actions/cache@v4 with: path: ${{ env.FLUTTER_HOME }} key: flutter-${{ env.FLUTTER_VERSION }}-node22.12-bookworm - name: Flutter installieren run: | if [ ! -x "$FLUTTER_HOME/bin/flutter" ]; then rm -rf "$FLUTTER_HOME" git clone --depth 1 --branch "$FLUTTER_VERSION" https://github.com/flutter/flutter.git "$FLUTTER_HOME" fi echo "$FLUTTER_HOME/bin" >> "$GITHUB_PATH" export PATH="$FLUTTER_HOME/bin:$PATH" export CI=true flutter config --no-analytics --enable-web flutter --version flutter precache --web working-directory: . - name: Pub-Cache uses: https://code.forgejo.org/actions/cache@v4 with: path: ${{ github.workspace }}/.pub-cache key: pub-${{ env.FLUTTER_VERSION }}-${{ hashFiles('app/pubspec.lock') }} restore-keys: pub-${{ env.FLUTTER_VERSION }}- - 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 . - name: Analyse run: flutter analyze --fatal-infos - name: Tests 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: node:22.12-bookworm # gepinnt; enthält git, curl, unzip, xz und Node (für JS-Actions) env: PUB_CACHE: ${{ github.workspace }}/.pub-cache defaults: run: working-directory: app steps: - uses: https://code.forgejo.org/actions/checkout@v4 - name: Flutter-SDK-Cache id: flutter-cache uses: https://code.forgejo.org/actions/cache@v4 with: path: ${{ env.FLUTTER_HOME }} key: flutter-${{ env.FLUTTER_VERSION }}-node22.12-bookworm - name: Flutter installieren run: | if [ ! -x "$FLUTTER_HOME/bin/flutter" ]; then rm -rf "$FLUTTER_HOME" git clone --depth 1 --branch "$FLUTTER_VERSION" https://github.com/flutter/flutter.git "$FLUTTER_HOME" fi echo "$FLUTTER_HOME/bin" >> "$GITHUB_PATH" export PATH="$FLUTTER_HOME/bin:$PATH" export CI=true flutter config --no-analytics --enable-web flutter --version flutter precache --web working-directory: . - name: Pub-Cache uses: https://code.forgejo.org/actions/cache@v4 with: path: ${{ github.workspace }}/.pub-cache key: pub-${{ env.FLUTTER_VERSION }}-${{ hashFiles('app/pubspec.lock') }} restore-keys: pub-${{ env.FLUTTER_VERSION }}- - name: Abhängigkeiten run: flutter pub get - name: Web-Build run: flutter build web --release --dart-define-from-file=env/ci.example.json supabase: runs-on: docker container: 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; } # Bereits gemergte Migrationen dürfen nicht verändert werden if [ "${{ github.event_name }}" = "pull_request" ]; then git fetch origin "${{ github.base_ref }}" --depth=1 changed=$(git diff --name-only --diff-filter=M "origin/${{ github.base_ref }}"...HEAD -- supabase/migrations || true) if [ -n "$changed" ]; then echo "Geänderte bestehende Migrationen: $changed"; exit 1; fi fi # RLS-/pgTAP-Tests: braucht einen Runner mit Docker-Socket (Label "docker-host"). # Nutzt die eingecheckte supabase/config.toml. Ohne passenden Runner Job bei Bedarf deaktivieren. supabase-tests: runs-on: docker-host steps: - uses: https://code.forgejo.org/actions/checkout@v4 - uses: https://code.forgejo.org/actions/setup-node@v4 with: 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@${{ 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@${{ env.SUPABASE_CLI_VERSION }} stop --no-backup || true