@@ -0,0 +1,54 @@
10+ group: ${{ github.workflow }}-${{ github.ref }}
11+ cancel-in-progress: true
15+ runs-on: ubuntu-latest
18+ - uses: actions/checkout@v4
20+ - uses: actions/setup-java@v4
22+ distribution: temurin
25+ - uses: android-actions/setup-android@v3
27+ - uses: gradle/actions/setup-gradle@v4
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 != ''
35+ OPENCODE_STORE_BASE64: ${{ secrets.OPENCODE_STORE_BASE64 }}
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"
41+ - name: Build release APK
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
49+ - name: Upload release APK
50+ uses: actions/upload-artifact@v4
53+ path: app/build/outputs/apk/**/*.apk
54+ if-no-files-found: error