diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml new file mode 100644 index 0000000..429f61d --- /dev/null +++ b/.github/workflows/android-build.yml @@ -0,0 +1,119 @@ +name: Android build + +# Pinned first-party actions (bump tag and SHA together when upgrading): +# actions/checkout@v6.0.1 8e8c483db84b4bee98b60c0593521ed34d9990e8 +# actions/setup-python@v6.2.0 a309ff8b426b58ec0e2a45f0f869d46889d02405 +# actions/setup-java@v4.7.1 c5195efecf7bdfc987ee8bae7a71cb8b11521c00 +# actions/upload-artifact@v5.0.0 330a01c490aca151604b8cf639adc76d48f6c5d4 + +on: + pull_request: + branches: + - dev + push: + branches: + - dev + workflow_dispatch: + inputs: + build_release: + description: Build signed/optimized release APK artifacts + required: true + type: boolean + default: true + run_tests: + description: Run Android unit tests + required: true + type: boolean + default: true + +permissions: + contents: read + actions: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + PYTHON_VERSION: "3.11" + JAVA_VERSION: "17" + CHAQUOPY_REF: "9f563f45108a873d7feb363e1f754c0173f1114e" + +jobs: + android: + name: Android test/build + runs-on: ubuntu-latest + timeout-minutes: 90 + defaults: + run: + shell: bash + steps: + - name: Checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + + - name: Set up Java + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 + with: + distribution: temurin + java-version: ${{ env.JAVA_VERSION }} + + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Build Android wheels + run: bash scripts/build-android-wheels-local.sh --python-minor "${PYTHON_VERSION}" --chaquopy-ref "${CHAQUOPY_REF}" + + - name: Run unit tests + if: ${{ github.event_name != 'workflow_dispatch' || inputs.run_tests }} + working-directory: android + run: | + chmod +x gradlew + ./gradlew --no-daemon :app:testDebugUnitTest + + - name: Build debug APK + working-directory: android + run: | + chmod +x gradlew + ./gradlew --no-daemon :app:assembleDebug + + - name: Build release APK + if: ${{ github.event_name != 'workflow_dispatch' || inputs.build_release }} + working-directory: android + run: | + chmod +x gradlew + ./gradlew --no-daemon :app:assembleRelease + + - name: Upload wheels + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 + with: + name: android-wheels-${{ github.ref_name }}-${{ github.run_id }} + path: android/vendor/*.whl + if-no-files-found: error + + - name: Upload debug APK + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 + with: + name: meshchatx-android-debug-${{ github.ref_name }}-${{ github.run_id }} + path: android/app/build/outputs/apk/debug/*.apk + if-no-files-found: error + + - name: Upload test reports + if: ${{ github.event_name != 'workflow_dispatch' || inputs.run_tests }} + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 + with: + name: meshchatx-android-tests-${{ github.ref_name }}-${{ github.run_id }} + path: | + android/app/build/reports/tests/ + android/app/build/test-results/ + if-no-files-found: warn + + - name: Upload release APK + if: ${{ github.event_name != 'workflow_dispatch' || inputs.build_release }} + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 + with: + name: meshchatx-android-release-${{ github.ref_name }}-${{ github.run_id }} + path: android/app/build/outputs/apk/release/*.apk + if-no-files-found: error