1.5.1 #274
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Android Build | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| pull_request: | |
| release: | |
| types: | |
| - published | |
| jobs: | |
| build: | |
| if: github.event_name != 'release' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK 21 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "21" | |
| - name: Set up Gradle | |
| uses: gradle/actions/setup-gradle@v4 | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| with: | |
| packages: "tools platform-tools platforms;android-36 build-tools;36.0.0" | |
| - name: Run debug unit tests | |
| run: ./gradlew testDebugUnitTest | |
| - name: Build debug APK | |
| run: ./gradlew :app:assembleDebug | |
| - name: Upload debug APK artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: app-debug-apk | |
| path: app/build/outputs/apk/debug/*.apk | |
| if-no-files-found: error | |
| release-apk: | |
| if: github.event_name == 'release' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK 21 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "21" | |
| - name: Set up Gradle | |
| uses: gradle/actions/setup-gradle@v4 | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| with: | |
| packages: "tools platform-tools platforms;android-36 build-tools;36.0.0" | |
| - name: Validate signing secrets | |
| env: | |
| ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} | |
| ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} | |
| ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} | |
| ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} | |
| run: | | |
| missing=() | |
| [ -n "${ANDROID_KEYSTORE_B64}" ] || missing+=("ANDROID_KEYSTORE_B64") | |
| [ -n "${ANDROID_KEYSTORE_PASSWORD}" ] || missing+=("ANDROID_KEYSTORE_PASSWORD") | |
| [ -n "${ANDROID_KEY_ALIAS}" ] || missing+=("ANDROID_KEY_ALIAS") | |
| [ -n "${ANDROID_KEY_PASSWORD}" ] || missing+=("ANDROID_KEY_PASSWORD") | |
| if [ "${#missing[@]}" -gt 0 ]; then | |
| echo "Missing required GitHub secrets: ${missing[*]}" | |
| exit 1 | |
| fi | |
| - name: Decode release keystore | |
| run: printf '%s' "${{ secrets.ANDROID_KEYSTORE_B64 }}" | base64 --decode > "${{ runner.temp }}/release.keystore" | |
| - name: Validate keystore and alias | |
| env: | |
| ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} | |
| ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} | |
| run: | | |
| keytool -list \ | |
| -keystore "${{ runner.temp }}/release.keystore" \ | |
| -storepass "${ANDROID_KEYSTORE_PASSWORD}" \ | |
| -alias "${ANDROID_KEY_ALIAS}" > /dev/null | |
| - name: Build release APK | |
| env: | |
| ANDROID_KEYSTORE_PATH: ${{ runner.temp }}/release.keystore | |
| ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} | |
| ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} | |
| ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} | |
| run: ./gradlew :app:assembleRelease | |
| - name: Resolve signed APK | |
| run: | | |
| ls -la app/build/outputs/apk/release | |
| SIGNED_APK="$(find app/build/outputs/apk/release -maxdepth 1 -type f -name '*.apk' ! -name '*-unsigned.apk' | head -n 1)" | |
| if [ -z "${SIGNED_APK}" ]; then | |
| echo "No signed APK was produced." | |
| exit 1 | |
| fi | |
| echo "SIGNED_APK=${SIGNED_APK}" >> "${GITHUB_ENV}" | |
| - name: Attach APK to GitHub release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| files: ${{ env.SIGNED_APK }} |