From 74c35094c4c94a0ed63a7d08e773fd41e73c6274 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 17 Sep 2025 00:57:38 -0500 Subject: [PATCH] Run release tests before deploying Try to catch proguard issues --- .github/actions/setup-emulator/action.yml | 38 +++++++++++++++++++++ .github/workflows/bundle.yml | 22 +++++++++++- .github/workflows/check.yml | 41 ++--------------------- .github/workflows/deploy.yml | 38 ++++++++++++++++++++- fastlane/Fastfile | 33 ++++++++++++++++++ 5 files changed, 131 insertions(+), 41 deletions(-) create mode 100644 .github/actions/setup-emulator/action.yml diff --git a/.github/actions/setup-emulator/action.yml b/.github/actions/setup-emulator/action.yml new file mode 100644 index 000000000..3cfb5f412 --- /dev/null +++ b/.github/actions/setup-emulator/action.yml @@ -0,0 +1,38 @@ +name: 'Setup Android Emulator' + +inputs: + api-level: + description: 'API level for the emulator' + required: true + default: '29' + script: + description: 'Script to run in the emulator' + required: true + +runs: + using: "composite" + steps: + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '21' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Enable KVM + shell: bash + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Run tests on emulator + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ inputs.api-level }} + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: ${{ inputs.script }} diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml index f9fb8995e..a909babe1 100644 --- a/.github/workflows/bundle.yml +++ b/.github/workflows/bundle.yml @@ -25,7 +25,7 @@ jobs: with: bundler-cache: true - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v5 with: distribution: 'temurin' @@ -43,6 +43,26 @@ jobs: MAPBOX_KEY: ${{ secrets.MAPBOX_KEY }} GOOGLE_KEY: ${{ secrets.GOOGLE_KEY }} run: bundle exec fastlane bundle + + - name: Install bundletool + run: | + wget -q https://github.com/google/bundletool/releases/download/1.17.2/bundletool-all-1.17.2.jar + sudo mv bundletool-all-1.17.2.jar /usr/local/bin/bundletool.jar + echo '#!/bin/bash' | sudo tee /usr/local/bin/bundletool + echo 'java -jar /usr/local/bin/bundletool.jar "$@"' | sudo tee -a /usr/local/bin/bundletool + sudo chmod +x /usr/local/bin/bundletool + + - name: Extract APKs from bundles + env: + KEY_PATH: ${{ runner.temp }}/keystore.jks + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} + run: bundle exec fastlane apkFromBundle + + - name: Build test APK + run: ./gradlew app:assembleGoogleplayReleaseAndroidTest + - name: Upload artifacts uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 34efa029a..1cb5ecfbd 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -45,47 +45,10 @@ jobs: - name: checkout uses: actions/checkout@v5 - - name: Set up JDK 21 - uses: actions/setup-java@v5 - with: - distribution: 'temurin' - java-version: '21' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - -# - name: AVD cache -# uses: actions/cache@v4 -# id: avd-cache -# with: -# path: | -# ~/.android/avd/* -# ~/.android/adb* -# key: avd-${{ matrix.api-level }} -# -# - name: create AVD and generate snapshot for caching -# if: steps.avd-cache.outputs.cache-hit != 'true' -# uses: reactivecircus/android-emulator-runner@v2 -# with: -# api-level: ${{ matrix.api-level }} -# force-avd-creation: false -# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -# disable-animations: false -# script: echo "Generated AVD snapshot for caching." - - - name: run tests - uses: reactivecircus/android-emulator-runner@v2 + - name: Run tests + uses: ./.github/actions/setup-emulator with: api-level: ${{ matrix.api-level }} - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true script: ./gradlew -Pcoverage app:test${{ matrix.flavor }}DebugUnitTest app:connected${{ matrix.flavor }}DebugAndroidTest - name: Upload test reports diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0e76de653..c5434dcc8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -13,9 +13,45 @@ jobs: bundle: uses: ./.github/workflows/bundle.yml secrets: inherit + + release-test: + runs-on: ubuntu-latest + needs: [bundle] + steps: + - name: checkout + uses: actions/checkout@v5 + + - name: Download release artifacts + uses: actions/download-artifact@v5 + with: + name: release + path: build-outputs + + - name: Run release Android tests + uses: ./.github/actions/setup-emulator + with: + api-level: 29 + script: | + # Install the pre-built APKs + adb install build-outputs/app/build/outputs/apk/googleplayRelease/universal.apk + adb install build-outputs/app/build/outputs/apk/androidTest/googleplayRelease/app-googleplay-release-androidTest.apk + + # Run tests without rebuilding + ./gradlew app:connectedGoogleplayReleaseAndroidTest \ + -x :app:packageGoogleplayRelease \ + -x :app:assembleGoogleplayRelease \ + -x :app:assembleGoogleplayReleaseAndroidTest + + - name: Upload release test reports + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: release-test-reports-googleplay + path: app/build/reports/** + deploy: runs-on: ubuntu-latest - needs: [ bundle ] + needs: [ bundle, release-test ] steps: - uses: actions/checkout@v5 - name: Fastlane key diff --git a/fastlane/Fastfile b/fastlane/Fastfile index fc27ed9ed..7bab52dc0 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -69,4 +69,37 @@ platform :android do } ) end + + desc "Generate APKs from bundles" + lane :apkFromBundle do + app_bundle = "app/build/outputs/bundle/googleplayRelease/app-googleplay-release.aab" + wear_bundle = "wear/build/outputs/bundle/release/wear-release.aab" + app_bundle_dir = "app/build/outputs/apk/googleplayRelease" + wear_bundle_dir = "wear/build/outputs/apk/release" + + sh( + "bundletool", + "build-apks", + "--output-format", "DIRECTORY", + "--bundle", app_bundle, + "--output", app_bundle_dir, + "--mode", "universal", + "--ks", ENV["KEY_PATH"], + "--ks-pass", "pass:#{ENV["KEY_STORE_PASSWORD"]}", + "--ks-key-alias", ENV["KEY_ALIAS"], + "--key-pass", "pass:#{ENV["KEY_PASSWORD"]}", + ) + sh( + "bundletool", + "build-apks", + "--output-format", "DIRECTORY", + "--bundle", wear_bundle, + "--output", wear_bundle_dir, + "--mode", "universal", + "--ks", ENV["KEY_PATH"], + "--ks-pass", "pass:#{ENV["KEY_STORE_PASSWORD"]}", + "--ks-key-alias", ENV["KEY_ALIAS"], + "--key-pass", "pass:#{ENV["KEY_PASSWORD"]}", + ) + end end