From 6c4211d4138b41aa05dfa5e641dac7aefaa10f1e Mon Sep 17 00:00:00 2001 From: Tony Giorgio Date: Wed, 8 Oct 2025 15:40:08 -0500 Subject: [PATCH 1/2] feat: add Android APK and AAB builds to release workflow Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 178 ++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1490c4eb..0381a3ba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -101,6 +101,184 @@ jobs: prerelease: false args: ${{ matrix.args }} + build-android: + needs: create-release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: 1.2.2 + + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: | + ~/.bun/install/cache + frontend/node_modules + key: ${{ runner.os }}-bun-${{ hashFiles('frontend/bun.lockb') }} + restore-keys: | + ${{ runner.os }}-bun- + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-linux-android,armv7-linux-androideabi,x86_64-linux-android,i686-linux-android + + - name: Setup Android NDK + uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: r25c + add-to-path: true + + - name: Cache Gradle + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + frontend/src-tauri/gen/android/.gradle + frontend/src-tauri/gen/android/build + frontend/src-tauri/gen/android/app/build + key: ${{ runner.os }}-gradle-${{ hashFiles('frontend/src-tauri/gen/android/**/*.gradle*', 'frontend/src-tauri/gen/android/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + with: + workspaces: "frontend/src-tauri -> target" + cache-on-failure: true + + - name: Cache Cargo registry + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache Cargo bin + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/ + key: ${{ runner.os }}-cargo-bin-tauri-cli + restore-keys: | + ${{ runner.os }}-cargo-bin- + + - name: Cache APT packages + uses: actions/cache@v4 + with: + path: /var/cache/apt/archives + key: ${{ runner.os }}-apt-android-${{ hashFiles('.github/workflows/release.yml') }} + restore-keys: | + ${{ runner.os }}-apt-android- + ${{ runner.os }}-apt- + + - name: Install Linux dependencies + run: | + sudo apt-get update + sudo apt-get install -y libssl-dev + + - name: Install frontend dependencies + working-directory: ./frontend + run: bun install + + - name: Install Tauri CLI + run: | + if ! command -v cargo-tauri &> /dev/null; then + cargo install tauri-cli + else + echo "Tauri CLI already installed" + fi + env: + CARGO_CFG_TARGET_OS: linux + + - name: Setup Android signing + env: + ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} + ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} + run: | + cd frontend/src-tauri/gen/android + echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > $RUNNER_TEMP/keystore.jks + echo "keyAlias=$ANDROID_KEY_ALIAS" > keystore.properties + echo "password=$ANDROID_KEY_PASSWORD" >> keystore.properties + echo "storeFile=$RUNNER_TEMP/keystore.jks" >> keystore.properties + + - name: Build Tauri Android App (Signed Release) + working-directory: ./frontend + run: | + export ANDROID_HOME=$ANDROID_SDK_ROOT + export NDK_HOME=${{ steps.setup-ndk.outputs.ndk-path }} + + # Set up Android NDK toolchain paths + export PATH=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH + + # Set up cross-compilation environment variables for each target + export AR_aarch64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar + export CC_aarch64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang + export CXX_aarch64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang++ + export RANLIB_aarch64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib + + export AR_armv7_linux_androideabi=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar + export CC_armv7_linux_androideabi=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang + export CXX_armv7_linux_androideabi=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang++ + export RANLIB_armv7_linux_androideabi=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib + + export AR_x86_64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar + export CC_x86_64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android24-clang + export CXX_x86_64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android24-clang++ + export RANLIB_x86_64_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib + + export AR_i686_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar + export CC_i686_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android24-clang + export CXX_i686_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android24-clang++ + export RANLIB_i686_linux_android=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib + + # Create symlinks for ranlib that OpenSSL expects + sudo ln -sf $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib /usr/local/bin/aarch64-linux-android-ranlib + sudo ln -sf $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib /usr/local/bin/armv7a-linux-androideabi-ranlib + sudo ln -sf $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib /usr/local/bin/x86_64-linux-android-ranlib + sudo ln -sf $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib /usr/local/bin/i686-linux-android-ranlib + + cargo tauri android build + env: + VITE_OPEN_SECRET_API_URL: https://enclave.trymaple.ai + VITE_MAPLE_BILLING_API_URL: https://billing.opensecret.cloud + VITE_CLIENT_ID: ba5a14b5-d915-47b1-b7b1-afda52bc5fc6 + + - name: Upload Android APK to Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload ${{ github.ref_name }} \ + frontend/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk \ + --clobber + + - name: Upload Android AAB to Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload ${{ github.ref_name }} \ + frontend/src-tauri/gen/android/app/build/outputs/bundle/universalRelease/app-universal-release.aab \ + --clobber + update-latest-json: needs: build-tauri runs-on: ubuntu-latest From 4e16e7059aa1c14f261a14083af917d6458edcf9 Mon Sep 17 00:00:00 2001 From: Tony Giorgio Date: Wed, 8 Oct 2025 15:43:17 -0500 Subject: [PATCH 2/2] chore: bump Android versionCode to 1003002003 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- frontend/src-tauri/tauri.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src-tauri/tauri.conf.json b/frontend/src-tauri/tauri.conf.json index 676f938a..04cf437c 100644 --- a/frontend/src-tauri/tauri.conf.json +++ b/frontend/src-tauri/tauri.conf.json @@ -68,7 +68,7 @@ "developmentTeam": "X773Y823TN" }, "android": { - "versionCode": 1003002002 + "versionCode": 1003002003 }, "windows": { "certificateThumbprint": null,