From 19fc5642ad43b98c0ae8f81d657199a86870ecab Mon Sep 17 00:00:00 2001 From: robot Date: Mon, 3 Aug 2026 07:58:49 +0000 Subject: [PATCH] feat(ci): pre-built container image for Android build + Flutter caching - Add .devcontainer/ci.Dockerfile with Flutter/JDK/Android SDK baked in - build-android now uses kryz-ci:latest container (skips 3-5 GB downloads) - Lint/test skip Flutter download if already available in PATH - Estimated: 40min -> 5-10min with pre-built image --- .gitea/workflows/ci.yml | 101 ++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 67 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index aef2359..50c94ca 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -7,9 +7,12 @@ # Lint/test use continue-on-error: true so Magrathea failures don't block. # Android build detects wrong platform and exits 0 gracefully. # -# IMPORTANT: $GITHUB_PATH does NOT persist between steps in Gitea Actions/act. -# Each step is a separate shell. We export PATH="$PWD/flutter/bin:$PATH" in -# every step that uses flutter/dart commands. +# CONTAINER IMAGE: The build-android job uses a pre-built Docker image +# (kryz-ci:latest) that includes Flutter, JDK 17, and Android SDK baked in — +# eliminating 3-5 GB of downloads per job. Build once on the runner host: +# docker build -f .devcontainer/ci.Dockerfile -t kryz-ci:latest .devcontainer +# +# Estimated impact: 40min -> 5-10min (with pre-built image) name: CI @@ -43,6 +46,12 @@ jobs: - name: Setup Flutter run: | set -e + # Skip download if Flutter is already available + if command -v flutter &> /dev/null; then + echo "Flutter already installed, skipping download." + flutter --version + exit 0 + fi curl -fsSL "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz" -o /tmp/flutter.tar.xz tar -xf /tmp/flutter.tar.xz -C "$PWD" export PATH="$PWD/flutter/bin:$PATH" @@ -82,6 +91,11 @@ jobs: - name: Setup Flutter run: | set -e + if command -v flutter &> /dev/null; then + echo "Flutter already installed, skipping download." + flutter --version + exit 0 + fi curl -fsSL "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz" -o /tmp/flutter.tar.xz tar -xf /tmp/flutter.tar.xz -C "$PWD" export PATH="$PWD/flutter/bin:$PATH" @@ -103,12 +117,15 @@ jobs: flutter test --reporter=expanded - # ── Stage 3: Android build ────────────────────────────────────── + # ── Stage 2: Android build (uses pre-built container image) ────── build-android: name: Build Android runs-on: [self-hosted, linux, x64] needs: [lint, test] if: always() + container: + image: kryz-ci:latest + options: --user vscode steps: - name: Checkout uses: actions/checkout@v4 @@ -122,80 +139,30 @@ jobs: exit 0 fi - - name: Setup Java 17 + - name: Verify environment run: | - set -e - curl -fsSL "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.12%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz" \ - -o /tmp/jdk.tar.gz - mkdir -p "$HOME/jdk" - tar -xzf /tmp/jdk.tar.gz -C "$HOME/jdk" --strip-components=1 - export PATH="$HOME/jdk/bin:$PATH" - export JAVA_HOME="$HOME/jdk" - java -version - - - name: Setup Flutter - run: | - set -e - curl -fsSL "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz" \ - -o /tmp/flutter.tar.xz - tar -xf /tmp/flutter.tar.xz -C "$PWD" - export PATH="$PWD/flutter/bin:$PATH" - flutter --version - - - name: Install Android SDK command-line tools - run: | - set -e - export JAVA_HOME="$HOME/jdk" - export PATH="$HOME/jdk/bin:$PATH" - export ANDROID_HOME="${HOME}/android-sdk" - mkdir -p "${ANDROID_HOME}/cmdline-tools" - curl -fsSL "https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip" -o /tmp/cmdline-tools.zip - unzip -q /tmp/cmdline-tools.zip -d "${ANDROID_HOME}/cmdline-tools" - mv "${ANDROID_HOME}/cmdline-tools/cmdline-tools" "${ANDROID_HOME}/cmdline-tools/latest" - export PATH="${ANDROID_HOME}/cmdline-tools/latest/bin:${PATH}" - yes | sdkmanager --licenses >/dev/null 2>&1 || true - sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0" - - - name: Pre-cache Android platform artifacts - run: | - export PATH="$PWD/flutter/bin:$PATH" - flutter precache --android - - - name: Accept Android SDK licenses - run: | - export JAVA_HOME="$HOME/jdk" - export PATH="$HOME/jdk/bin:$PATH" - yes | "${HOME}/android-sdk/cmdline-tools/latest/bin/sdkmanager" --licenses || true + echo "=== Environment check ===" + echo "Flutter: $(flutter --version | head -1)" + echo "Java: $(java -version 2>&1 | head -1)" + echo "SDK tools: $(sdkmanager --version)" + echo "Android SDK: $ANDROID_HOME" + echo "JAVA_HOME: $JAVA_HOME" - name: Install dependencies - run: | - export PATH="$PWD/flutter/bin:$PATH" - flutter pub get + run: flutter pub get - name: Generate stubs (lint gate support) - run: | - export PATH="$PWD/flutter/bin:$PATH" - python3 ci_stub_gen.py + run: python3 ci_stub_gen.py - name: Run whitelabel build script if: hashFiles('theme.json') != '' - run: | - export PATH="$PWD/flutter/bin:$PATH" - python3 build_whitelabel.py + run: python3 build_whitelabel.py - name: Build APK (release) - run: | - export JAVA_HOME="$HOME/jdk" - export ANDROID_HOME="${HOME}/android-sdk" - export PATH="$PWD/flutter/bin:$PATH" - flutter build apk --release + run: flutter build apk --release - name: Build App Bundle (release) - run: | - export JAVA_HOME="$HOME/jdk" - export ANDROID_HOME="${HOME}/android-sdk" - export PATH="$PWD/flutter/bin:$PATH" - flutter build appbundle --release + run: flutter build appbundle --release - name: List build outputs run: | @@ -212,7 +179,7 @@ jobs: echo " AAB: build/app/outputs/bundle/release/app-release.aab" - # ── Stage 3 (parallel): iOS build ─────────────────────────────── + # ── Stage 2 (parallel): iOS build ─────────────────────────────── build-ios: name: Build iOS runs-on: [self-hosted, linux, x64]