Shuffle/.forgejo/workflows/ci.yml
cschlaefke 568f425ef7 ci: install pinned Flutter SDK from git tag instead of missing image
Refs #31

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 20:24:50 +01:00

167 lines
6.4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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