name: Make Release on: workflow_dispatch: inputs: branch: description: 'Branch to build from' required: true default: 'main' # Or your most common release branch type: string create_github_release: description: 'Create a GitHub Release (and upload assets)' required: true default: true type: boolean permissions: write-all # Needed for creating releases and uploading assets jobs: # Job to prepare common environment variables like version prepare-release-info: runs-on: ubuntu-latest outputs: versionCode: ${{ steps.calculate_version_code.outputs.versionCode }} versionNameBase: ${{ steps.get_version.outputs.versionNameBase }} steps: - name: Checkout code uses: actions/checkout@v5 with: ref: ${{ github.event.inputs.branch }} submodules: 'recursive' fetch-depth: 0 # Needed for git rev-list - name: Get `versionNameBase` id: get_version run: | echo "versionNameBase=$(grep -oP 'VERSION_NAME_BASE = \"\K[^\"]+' ./buildSrc/src/main/kotlin/Configs.kt)" >> $GITHUB_OUTPUT - name: Calculate Version Code id: calculate_version_code uses: ./.github/actions/calculate-version-code # Job for F-Droid build build-fdroid: needs: prepare-release-info # Depends on version info runs-on: ubuntu-latest if: github.repository == 'meshtastic/Meshtastic-Android' outputs: apk_path: app/build/outputs/apk/fdroid/release/app-fdroid-release.apk apk_name: fdroidRelease-${{ needs.prepare-release-info.outputs.versionNameBase }}-${{ needs.prepare-release-info.outputs.versionCode }}.apk steps: - name: Checkout code uses: actions/checkout@v5 with: ref: ${{ github.event.inputs.branch }} submodules: 'recursive' fetch-depth: 0 - name: Load secrets (only keystore for F-Droid) run: | echo $KEYSTORE | base64 -di > ./app/$KEYSTORE_FILENAME echo "$KEYSTORE_PROPERTIES" > ./keystore.properties env: KEYSTORE: ${{ secrets.KEYSTORE }} KEYSTORE_FILENAME: ${{ secrets.KEYSTORE_FILENAME }} KEYSTORE_PROPERTIES: ${{ secrets.KEYSTORE_PROPERTIES }} - name: Set up JDK 21 uses: actions/setup-java@v4 with: java-version: '21' distribution: 'jetbrains' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} build-scan-publish: true build-scan-terms-of-use-url: 'https://gradle.com/terms-of-service' build-scan-terms-of-use-agree: 'yes' add-job-summary: always - name: Build F-Droid release run: ./gradlew assembleFdroidRelease env: VERSION_CODE: ${{ needs.prepare-release-info.outputs.versionCode }} - name: Upload F-Droid APK artifact (for release job) uses: actions/upload-artifact@v4 with: name: fdroid-apk path: app/build/outputs/apk/fdroid/release/app-fdroid-release.apk retention-days: 1 # Keep for a short period as it will be uploaded to release # Job for Play Store build build-google: needs: prepare-release-info # Depends on version info runs-on: ubuntu-latest if: github.repository == 'meshtastic/Meshtastic-Android' outputs: aab_path: app/build/outputs/bundle/googleRelease/app-google-release.aab aab_name: googleRelease-${{ needs.prepare-release-info.outputs.versionNameBase }}-${{ needs.prepare-release-info.outputs.versionCode }}.aab apk_path: app/build/outputs/apk/google/release/app-google-release.apk apk_name: googleRelease-${{ needs.prepare-release-info.outputs.versionNameBase }}-${{ needs.prepare-release-info.outputs.versionCode }}.apk steps: - name: Checkout code uses: actions/checkout@v5 with: ref: ${{ github.event.inputs.branch }} submodules: 'recursive' fetch-depth: 0 - name: Load secrets run: | rm -f ./app/google-services.json # Ensure clean state echo $GSERVICES > ./app/google-services.json echo $KEYSTORE | base64 -di > ./app/$KEYSTORE_FILENAME echo "$KEYSTORE_PROPERTIES" > ./keystore.properties echo "datadogApplicationId=$DATADOG_APPLICATION_ID" >> ./secrets.properties echo "datadogClientToken=$DATADOG_CLIENT_TOKEN" >> ./secrets.properties echo "MAPS_API_KEY=$GOOGLE_MAPS_API_KEY" >> ./secrets.properties env: GSERVICES: ${{ secrets.GSERVICES }} KEYSTORE: ${{ secrets.KEYSTORE }} KEYSTORE_FILENAME: ${{ secrets.KEYSTORE_FILENAME }} KEYSTORE_PROPERTIES: ${{ secrets.KEYSTORE_PROPERTIES }} DATADOG_APPLICATION_ID: ${{ secrets.DATADOG_APPLICATION_ID }} DATADOG_CLIENT_TOKEN: ${{ secrets.DATADOG_CLIENT_TOKEN }} GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }} - name: Set up JDK 21 uses: actions/setup-java@v4 with: java-version: '21' distribution: 'jetbrains' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} build-scan-publish: true build-scan-terms-of-use-url: 'https://gradle.com/terms-of-service' build-scan-terms-of-use-agree: 'yes' add-job-summary: always - name: Build Play Store release run: ./gradlew bundleGoogleRelease assembleGoogleRelease env: VERSION_CODE: ${{ needs.prepare-release-info.outputs.versionCode }} - name: Upload Play Store AAB artifact (for release job) uses: actions/upload-artifact@v4 with: name: google-aab path: app/build/outputs/bundle/googleRelease/app-google-release.aab retention-days: 1 - name: Upload Play Store APK artifact (for release job) uses: actions/upload-artifact@v4 with: name: google-apk path: app/build/outputs/apk/google/release/app-google-release.apk retention-days: 1 # Job to create GitHub release and upload assets (runs after builds if enabled) create-github-release: needs: [ prepare-release-info, build-fdroid, build-google ] runs-on: ubuntu-latest permissions: id-token: write contents: write attestations: write # Only run this job if the input create_github_release is true if: github.repository == 'meshtastic/Meshtastic-Android' && github.event.inputs.create_github_release == 'true' steps: - name: Set up version info id: set_version_info run: | echo "versionCode=${{ needs.prepare-release-info.outputs.versionCode }}" >> $GITHUB_ENV echo "versionNameBase=${{ needs.prepare-release-info.outputs.versionNameBase }}" >> $GITHUB_ENV echo "versionNameFdroid=${{ needs.prepare-release-info.outputs.versionNameBase }} (${{ needs.prepare-release-info.outputs.versionCode }}) fdroid" >> $GITHUB_ENV echo "versionNameGoogle=${{ needs.prepare-release-info.outputs.versionNameBase }} (${{ needs.prepare-release-info.outputs.versionCode }}) google" >> $GITHUB_ENV - name: Create version_info.txt run: | echo -e "versionCode=${{ env.versionCode }}\nversionNameBase=${{ env.versionNameBase }}" > ./version_info.txt - name: Download F-Droid APK uses: actions/download-artifact@v5 with: name: fdroid-apk path: ./fdroid-apk-download - name: Download Google AAB uses: actions/download-artifact@v5 with: name: google-aab path: ./google-aab-download - name: Download Google APK uses: actions/download-artifact@v5 with: name: google-apk path: ./google-apk-download - name: Create GitHub release uses: actions/create-release@v1 id: create_release_step with: draft: true prerelease: true release_name: Meshtastic Android ${{ env.versionNameBase }} (${{ env.versionCode }}) alpha tag_name: v${{ env.versionNameBase }} commitish: ${{ github.event.inputs.branch }} body: | Version: ${{ env.versionNameBase }} (${{ env.versionCode }}) F-Droid version name: `${{ env.versionNameFdroid }}` Google Play version name: `${{ env.versionNameGoogle }}` Autogenerated by GitHub Action. Please review and edit before publishing. env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Add F-Droid APK to release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release_step.outputs.upload_url }} asset_path: ./fdroid-apk-download/app-fdroid-release.apk asset_name: ${{ needs.build-fdroid.outputs.apk_name }} asset_content_type: application/vnd.android.package-archive - name: Add Play Store AAB to release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release_step.outputs.upload_url }} asset_path: ./google-aab-download/app-google-release.aab asset_name: ${{ needs.build-google.outputs.aab_name }} asset_content_type: application/octet-stream - name: Add Play Store APK to release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release_step.outputs.upload_url }} asset_path: ./google-apk-download/app-google-release.apk asset_name: ${{ needs.build-google.outputs.apk_name }} asset_content_type: application/vnd.android.package-archive - name: Add version_info.txt to release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release_step.outputs.upload_url }} asset_path: ./version_info.txt asset_name: version_info.txt asset_content_type: text/plain - name: Attest Build Provenance uses: actions/attest-build-provenance@v2 with: subject-path: | ./google-apk-download/app-google-release.apk ./google-aab-download/app-google-release.aab ./fdroid-apk-download/app-fdroid-release.apk