feat(app): App-Fundament – Flutter-Gerüst und Supabase-Konfiguration #32

Merged
cschlaefke merged 11 commits from feature/31-app-fundament into main 2026-11-02 21:21:02 +00:00
2 changed files with 56 additions and 16 deletions
Showing only changes of commit 77c71c0169 - Show all commits

View file

@ -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

5
env/ci.example.json vendored
View file

@ -1,5 +0,0 @@
{
"SUPABASE_URL": "http://localhost:54321",
"SUPABASE_ANON_KEY": "public-anon-key-placeholder",
"APP_ENV": "ci"
}