ci: run Flutter and web build checks from app/

Refs #31

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
cschlaefke 2026-11-02 20:18:58 +01:00
parent e5df79ee0a
commit 77c71c0169
2 changed files with 56 additions and 16 deletions

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 name: CI
on: on:
@ -6,11 +7,18 @@ on:
push: push:
branches: [main] branches: [main]
env:
SUPABASE_CLI_VERSION: 3.0.0
jobs: 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: flutter:
runs-on: docker runs-on: docker
container: 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: defaults:
run: run:
working-directory: app working-directory: app
@ -20,23 +28,57 @@ jobs:
- name: Pub-Cache - name: Pub-Cache
uses: https://code.forgejo.org/actions/cache@v4 uses: https://code.forgejo.org/actions/cache@v4
with: with:
path: /root/.pub-cache path: ${{ github.workspace }}/.pub-cache
key: pub-${{ hashFiles('app/pubspec.lock') }} key: pub-${{ hashFiles('app/pubspec.lock') }}
restore-keys: pub-
- name: Abhängigkeiten - name: Abhängigkeiten (erzeugt auch gen-l10n)
run: flutter pub get run: flutter pub get
- name: Code-Generierung - name: Code-Generierung
run: dart run build_runner build --delete-conflicting-outputs 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 - name: Format
run: dart format --set-exit-if-changed lib test run: dart format --set-exit-if-changed .
- name: Analyse - name: Analyse
run: flutter analyze --fatal-infos run: flutter analyze --fatal-infos
- name: Tests - 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 - name: Web-Build
run: flutter build web --release --dart-define-from-file=env/ci.example.json run: flutter build web --release --dart-define-from-file=env/ci.example.json
@ -44,9 +86,11 @@ jobs:
supabase: supabase:
runs-on: docker runs-on: docker
container: container:
image: node:22-bookworm image: node:22.12-bookworm
steps: steps:
- uses: https://code.forgejo.org/actions/checkout@v4 - uses: https://code.forgejo.org/actions/checkout@v4
with:
fetch-depth: 0
- name: Migrationen prüfen (ohne laufende DB) - name: Migrationen prüfen (ohne laufende DB)
run: | run: |
test -d supabase/migrations || { echo "Keine Migrationen – übersprungen"; exit 0; } test -d supabase/migrations || { echo "Keine Migrationen – übersprungen"; exit 0; }
@ -58,7 +102,7 @@ jobs:
fi fi
# RLS-/pgTAP-Tests: braucht einen Runner mit Docker-Socket (Label "docker-host"). # 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: supabase-tests:
runs-on: docker-host runs-on: docker-host
steps: steps:
@ -68,9 +112,10 @@ jobs:
node-version: 22 node-version: 22
- name: Supabase starten und Datenbanktests ausführen - name: Supabase starten und Datenbanktests ausführen
run: | run: |
test -f supabase/config.toml || { echo "supabase/config.toml fehlt"; exit 1; }
test -d supabase/migrations || { echo "Keine Migrationen – übersprungen"; exit 0; } test -d supabase/migrations || { echo "Keine Migrationen – übersprungen"; exit 0; }
npx --yes supabase start -x studio,imgproxy,edge-runtime,logflare,vector npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} start -x studio,imgproxy,edge-runtime,logflare,vector
npx --yes supabase test db npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} test db
- name: Aufräumen - name: Aufräumen
if: always() 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"
}