# kryz-go-flutter Release Pipeline # Triggers on version tags (v1.0.0, v1.0.1, etc.) # Produces signed artifacts and attaches them to a Gitea Release name: Release on: push: tags: - "v*" env: FLUTTER_VERSION: "3.44.0" jobs: # ── Lint (gate) ───────────────────────────────────────────── lint: name: Lint runs-on: [self-hosted, linux, x64] steps: - name: Checkout uses: actions/checkout@v4 - name: Ensure CI container image run: | set -e if docker image inspect kryz-ci:latest &>/dev/null; then echo "CI image kryz-ci:latest already cached — skipping build." else echo "Building CI image (first run, ~25 min)..." docker build -f .devcontainer/ci.Dockerfile -t kryz-ci:latest .devcontainer echo "CI image built successfully." fi - name: Analyze Dart code run: | docker run --rm \ -v "${PWD}:/workspace" \ -w /workspace \ kryz-ci:latest \ bash -c 'flutter pub get && flutter analyze lib/ test/' - name: Check formatting run: | docker run --rm \ -v "${PWD}:/workspace" \ -w /workspace \ kryz-ci:latest \ dart format --set-exit-if-changed lib/ test/ # ── Test (gate) ────────────────────────────────────────────────── test: name: Test runs-on: [self-hosted, linux, x64] needs: [lint] steps: - name: Checkout uses: actions/checkout@v4 - name: Ensure CI container image run: | set -e if docker image inspect kryz-ci:latest &>/dev/null; then echo "CI image kryz-ci:latest already cached — skipping build." else echo "Building CI image (first run, ~25 min)..." docker build -f .devcontainer/ci.Dockerfile -t kryz-ci:latest .devcontainer echo "CI image built successfully." fi - name: Run tests run: | docker run --rm \ -v "${PWD}:/workspace" \ -w /workspace \ kryz-ci:latest \ bash -c 'python3 ci_stub_gen.py && flutter pub get && flutter test --reporter=expanded' # ── Android release build ──────────────────────────────────── build-android: name: Build Android Release runs-on: [self-hosted, linux, x64] needs: [test] steps: - name: Checkout uses: actions/checkout@v4 - name: Ensure CI container image run: | set -e if docker image inspect kryz-ci:latest &>/dev/null; then echo "CI image kryz-ci:latest already cached — skipping build." else echo "Building CI image (first run, ~25 min)..." docker build -f .devcontainer/ci.Dockerfile -t kryz-ci:latest .devcontainer echo "CI image built successfully." fi - name: Generate stubs + install deps run: | docker run --rm \ -v "${PWD}:/workspace" \ -w /workspace \ kryz-ci:latest \ bash -c 'python3 ci_stub_gen.py && flutter pub get' - name: Run whitelabel build script if: hashFiles('theme.json') != '' run: | docker run --rm \ -v "${PWD}:/workspace" \ -w /workspace \ kryz-ci:latest \ python3 build_whitelabel.py - name: Configure release signing if: env.ANDROID_KEYSTORE_BASE64 != '' env: ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} ANDROID_KEY_PASS: ${{ secrets.ANDROID_KEY_PASS }} run: | echo "$ANDROID_KEYSTORE_BASE64" | base64 -d > android/app/release.keystore cat > android/key.properties <