Skip to content

chore(release): v0.2.7 #1

chore(release): v0.2.7

chore(release): v0.2.7 #1

name: Android Release Build
# Triggers:
# - Automatically on push to the release branch (alongside the desktop release)
# - Manually via workflow_dispatch (useful to re-run after desktop release is created)
#
# Required GitHub secrets:
# ANDROID_KEYSTORE — base64-encoded .jks keystore file
# ANDROID_KEY_ALIAS — key alias (e.g. "key0")
# ANDROID_STORE_PASSWORD — keystore password
# ANDROID_KEY_PASSWORD — key password (can be same as store password)
# POSTHOG_API_KEY — analytics key (same as desktop release)
#
# Optional — only needed for automated Google Play uploads:
# GOOGLE_PLAY_SERVICE_ACCOUNT_JSON — contents of the service account JSON file
# (see CONTRIBUTING.md for setup instructions)
on:
push:
branches:
- release
workflow_dispatch:
inputs:
upload_to_play_store:
description: 'Upload AAB to Google Play (internal track)'
type: boolean
default: false
jobs:
android:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Setup Java 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install Rust stable + Android targets
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android,armv7-linux-androideabi,i686-linux-android,x86_64-linux-android
- name: Install Android NDK r27
run: |
"$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --install "ndk;27.0.12077973"
echo "NDK_HOME=$ANDROID_SDK_ROOT/ndk/27.0.12077973" >> $GITHUB_ENV
- name: Install frontend dependencies
run: yarn install
- name: Get version from package.json
id: version
run: echo "VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT
- name: Decode keystore
run: echo "${{ secrets.ANDROID_KEYSTORE }}" | base64 --decode > "$RUNNER_TEMP/release.keystore"
# ── APK (for sideloading / GitHub release) ────────────────────────────
- name: Build release APK (arm64)
env:
NDK_HOME: ${{ env.NDK_HOME }}
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
run: yarn tauri android build --apk --target aarch64
- name: Sign APK
run: |
UNSIGNED=$(find src-tauri/gen/android/app/build/outputs/apk -name "*.apk" | head -1)
echo "Found unsigned APK: $UNSIGNED"
BUILD_TOOLS=$(ls "$ANDROID_SDK_ROOT/build-tools" | sort -V | tail -1)
SIGNED="dota-keeper-${{ steps.version.outputs.VERSION }}-android.apk"
"$ANDROID_SDK_ROOT/build-tools/$BUILD_TOOLS/apksigner" sign \
--ks "$RUNNER_TEMP/release.keystore" \
--ks-key-alias "${{ secrets.ANDROID_KEY_ALIAS }}" \
--ks-pass "pass:${{ secrets.ANDROID_STORE_PASSWORD }}" \
--key-pass "pass:${{ secrets.ANDROID_KEY_PASSWORD }}" \
--out "$SIGNED" \
"$UNSIGNED"
echo "SIGNED_APK=$SIGNED" >> $GITHUB_ENV
- name: Upload APK as workflow artifact
uses: actions/upload-artifact@v4
with:
name: dota-keeper-${{ steps.version.outputs.VERSION }}-android
path: ${{ env.SIGNED_APK }}
retention-days: 30
- name: Attach APK to GitHub release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload "v${{ steps.version.outputs.VERSION }}" "${{ env.SIGNED_APK }}" --clobber || \
echo "⚠️ Could not upload to release (may not exist yet). APK is available as a workflow artifact."
# ── AAB (for Google Play Store) ────────────────────────────────────────
- name: Build release AAB (all ABIs)
if: ${{ inputs.upload_to_play_store == true }}
env:
NDK_HOME: ${{ env.NDK_HOME }}
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
run: yarn tauri android build --aab
- name: Sign AAB
if: ${{ inputs.upload_to_play_store == true }}
run: |
UNSIGNED=$(find src-tauri/gen/android/app/build/outputs/bundle -name "*.aab" | head -1)
echo "Found unsigned AAB: $UNSIGNED"
SIGNED="dota-keeper-${{ steps.version.outputs.VERSION }}.aab"
jarsigner -verbose \
-sigalg SHA256withRSA \
-digestalg SHA-256 \
-keystore "$RUNNER_TEMP/release.keystore" \
-storepass "${{ secrets.ANDROID_STORE_PASSWORD }}" \
-keypass "${{ secrets.ANDROID_KEY_PASSWORD }}" \
-signedjar "$SIGNED" \
"$UNSIGNED" \
"${{ secrets.ANDROID_KEY_ALIAS }}"
echo "SIGNED_AAB=$SIGNED" >> $GITHUB_ENV
- name: Upload AAB to Google Play (internal track)
if: ${{ inputs.upload_to_play_store == true }}
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
packageName: com.volthawk.dota_keeper
releaseFiles: ${{ env.SIGNED_AAB }}
track: internal
status: completed