From 4b7834e09016e272d28f449509a53c7ce522eebe Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 13 Jul 2026 09:07:23 +0700 Subject: [PATCH] ci: cache pub deps, filter jobs by path, and speed up release builds CI (every push/PR): - pub-cache cached keyed on pubspec.lock - dorny/paths-filter skips the Flutter job for Go-only changes and vice versa (skipped required checks count as passing) Release: - gomobile installed from the go.mod-pinned x/mobile version instead of @latest (reproducible, covered by the setup-go cache; verified locally that go.sum already satisfies cmd/gomobile) - Android bind targets arm/arm64/amd64 only - 386 dropped, amd64 kept so the universal APK still runs on x86_64 emulators - NDK r29 cached; docker prune dropped from the free-space step - Flutter pinned to 3.41.5 (matches .fvmrc/ci.yml) in both build jobs plus pub-cache caching; xcodeproj gem installed only when missing --- .github/workflows/ci.yml | 41 ++++++++++++++++++++++++++++++ .github/workflows/release.yml | 47 +++++++++++++++++++++++++++++------ 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 986662e8..729ed295 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,9 +11,41 @@ concurrency: cancel-in-progress: true jobs: + changes: + name: Detect changed paths + runs-on: ubuntu-latest + permissions: + pull-requests: read + outputs: + dart: ${{ steps.filter.outputs.dart }} + go: ${{ steps.filter.outputs.go }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Filter paths + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + dart: + - 'lib/**' + - 'test/**' + - 'assets/**' + - 'pubspec.yaml' + - 'pubspec.lock' + - 'analysis_options.yaml' + - 'l10n.yaml' + - '.github/workflows/ci.yml' + go: + - 'go_backend/**' + - '.github/workflows/ci.yml' + flutter: name: Flutter analyze & test runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.dart == 'true' steps: - name: Checkout repository @@ -27,6 +59,13 @@ jobs: channel: "stable" cache: true + - name: Cache pub dependencies + uses: actions/cache@v5 + with: + path: ~/.pub-cache + key: pub-${{ runner.os }}-${{ hashFiles('pubspec.lock') }} + restore-keys: pub-${{ runner.os }}- + - name: Get Flutter dependencies run: flutter pub get @@ -39,6 +78,8 @@ jobs: go: name: Go vet & test runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.go == 'true' defaults: run: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c75867e2..43a0990f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,15 +47,14 @@ jobs: steps: - name: Free disk space run: | - # Remove large unused tools (~15GB total) + # Remove large unused tools (~15GB total). Docker prune was dropped: + # it took 1-2 minutes and the rm below already frees enough. sudo rm -rf /usr/share/dotnet sudo rm -rf /opt/ghc sudo rm -rf /opt/hostedtoolcache/CodeQL sudo rm -rf /usr/local/share/boost sudo rm -rf /usr/share/swift sudo rm -rf /usr/local/.ghcup - # Clean docker images - sudo docker image prune --all --force # Show available space df -h @@ -84,6 +83,12 @@ jobs: key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: gradle-${{ runner.os }}- + - name: Cache Android NDK + uses: actions/cache@v5 + with: + path: /usr/local/lib/android/sdk/ndk/29.0.14206865 + key: ndk-29.0.14206865 + - name: Install Android SDK & NDK run: | # Use pre-installed Android SDK on GitHub runners @@ -101,24 +106,38 @@ jobs: echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/29.0.14206865" >> $GITHUB_ENV - name: Install gomobile + working-directory: go_backend run: | - go install golang.org/x/mobile/cmd/gomobile@latest + # Installed from inside the module so the go.mod-pinned x/mobile + # version is used (reproducible + covered by the setup-go cache). + go install golang.org/x/mobile/cmd/gomobile gomobile init - name: Build Go backend for Android working-directory: go_backend run: | mkdir -p ../android/app/libs - gomobile bind -target=android -androidapi 24 -o ../android/app/libs/gobackend.aar . + # arm/arm64 for shipped APKs, amd64 so the universal APK still works + # on x86_64 emulators; 386 devices no longer exist. + gomobile bind -target=android/arm,android/arm64,android/amd64 -androidapi 24 -o ../android/app/libs/gobackend.aar . env: CGO_ENABLED: 1 - name: Setup Flutter uses: subosito/flutter-action@v2 with: + # Keep in sync with .fvmrc and ci.yml + flutter-version: "3.41.5" channel: "stable" cache: true + - name: Cache pub dependencies + uses: actions/cache@v5 + with: + path: ~/.pub-cache + key: pub-${{ runner.os }}-${{ hashFiles('pubspec.lock') }} + restore-keys: pub-${{ runner.os }}- + - name: Get Flutter dependencies run: flutter pub get @@ -191,8 +210,10 @@ jobs: restore-keys: pods-${{ runner.os }}- - name: Install gomobile + working-directory: go_backend run: | - go install golang.org/x/mobile/cmd/gomobile@latest + # go.mod-pinned x/mobile version (reproducible + cached by setup-go). + go install golang.org/x/mobile/cmd/gomobile gomobile init - name: Build Go backend for iOS @@ -210,8 +231,9 @@ jobs: - name: Add XCFramework to Xcode project run: | - # Install xcodeproj gem for modifying Xcode project - sudo gem install xcodeproj + # xcodeproj usually ships with the preinstalled CocoaPods; only + # install it when missing. + gem list -i xcodeproj >/dev/null || sudo gem install xcodeproj # Create Ruby script to add framework cat > add_framework.rb << 'EOF' @@ -251,9 +273,18 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: + # Keep in sync with .fvmrc and ci.yml + flutter-version: "3.41.5" channel: "stable" cache: true + - name: Cache pub dependencies + uses: actions/cache@v5 + with: + path: ~/.pub-cache + key: pub-${{ runner.os }}-${{ hashFiles('pubspec.lock') }} + restore-keys: pub-${{ runner.os }}- + - name: Get Flutter dependencies run: flutter pub get