name: Build Mobile on: workflow_dispatch: workflow_call: inputs: ref: required: false type: string secrets: KEY_JKS: required: true ALIAS: required: true ANDROID_KEY_PASSWORD: required: true ANDROID_STORE_PASSWORD: required: true pull_request: push: branches: [main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: {} jobs: pre-job: runs-on: ubuntu-latest permissions: contents: read outputs: should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }} steps: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - id: found_paths uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 with: filters: | mobile: - 'mobile/**' workflow: - '.github/workflows/build-mobile.yml' - name: Check if we should force jobs to run id: should_force run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT" build-sign-android: name: Build and sign Android needs: pre-job permissions: contents: read # Skip when PR from a fork if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && needs.pre-job.outputs.should_run == 'true' }} runs-on: mich steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ inputs.ref || github.sha }} persist-credentials: false - name: Create the Keystore env: KEY_JKS: ${{ secrets.KEY_JKS }} working-directory: ./mobile run: printf "%s" $KEY_JKS | base64 -d > android/key.jks - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'zulu' java-version: '17' - name: Restore Gradle Cache id: cache-gradle-restore uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4 with: path: | ~/.gradle/caches ~/.gradle/wrapper ~/.android/sdk mobile/android/.gradle mobile/.dart_tool key: build-mobile-gradle-${{ runner.os }}-main - name: Setup Flutter SDK uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0 with: channel: 'stable' flutter-version-file: ./mobile/pubspec.yaml cache: true - name: Setup Android SDK uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3.2.2 with: packages: '' - name: Get Packages working-directory: ./mobile run: flutter pub get - name: Generate translation file run: make translation working-directory: ./mobile - name: Generate platform APIs run: make pigeon working-directory: ./mobile - name: Build Android App Bundle working-directory: ./mobile env: ALIAS: ${{ secrets.ALIAS }} ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }} IS_MAIN: ${{ github.ref == 'refs/heads/main' }} run: | if [[ $IS_MAIN == 'true' ]]; then flutter build apk --release flutter build apk --release --split-per-abi --target-platform android-arm,android-arm64,android-x64 else flutter build apk --debug --split-per-abi --target-platform android-arm64 fi - name: Publish Android Artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: release-apk-signed path: mobile/build/app/outputs/flutter-apk/*.apk - name: Save Gradle Cache id: cache-gradle-save uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4 if: github.ref == 'refs/heads/main' with: path: | ~/.gradle/caches ~/.gradle/wrapper ~/.android/sdk mobile/android/.gradle mobile/.dart_tool key: ${{ steps.cache-gradle-restore.outputs.cache-primary-key }}