@@ -0,0 +1,54 @@
1+name: Release Build
2+
3+on:
4+ push:
5+ branches: [master]
6+ pull_request:
7+ workflow_dispatch:
8+
9+concurrency:
10+ group: ${{ github.workflow }}-${{ github.ref }}
11+ cancel-in-progress: true
12+
13+jobs:
14+ release-build:
15+ runs-on: ubuntu-latest
16+
17+ steps:
18+ - uses: actions/checkout@v4
19+
20+ - uses: actions/setup-java@v4
21+ with:
22+ distribution: temurin
23+ java-version: 17
24+
25+ - uses: android-actions/setup-android@v3
26+
27+ - uses: gradle/actions/setup-gradle@v4
28+
29+ # The keystore ships as base64 in a secret so it never touches the repo.
30+ # When the secret isn't configured the Gradle build falls back to an
31+ # unsigned APK, so this workflow is green even before signing is wired up.
32+ - name: Decode signing keystore
33+ if: env.OPENCODE_STORE_BASE64 != ''
34+ env:
35+ OPENCODE_STORE_BASE64: ${{ secrets.OPENCODE_STORE_BASE64 }}
36+ run: |
37+ STORE_FILE="$RUNNER_TEMP/release.keystore"
38+ printf '%s' "$OPENCODE_STORE_BASE64" | base64 -d > "$STORE_FILE"
39+ echo "OPENCODE_STORE_FILE=$STORE_FILE" >> "$GITHUB_ENV"
40+
41+ - name: Build release APK
42+ env:
43+ OPENCODE_STORE_FILE: ${{ env.OPENCODE_STORE_FILE }}
44+ OPENCODE_STORE_PASSWORD: ${{ secrets.OPENCODE_STORE_PASSWORD }}
45+ OPENCODE_KEY_ALIAS: ${{ secrets.OPENCODE_KEY_ALIAS }}
46+ OPENCODE_KEY_PASSWORD: ${{ secrets.OPENCODE_KEY_PASSWORD }}
47+ run: ./gradlew assembleRelease --no-daemon
48+
49+ - name: Upload release APK
50+ uses: actions/upload-artifact@v4
51+ with:
52+ name: release-apk
53+ path: app/build/outputs/apk/**/*.apk
54+ if-no-files-found: error