diff --git a/.github/workflows/build-mobile.yml b/.github/workflows/build-mobile.yml index 6a9a01d41d..0044b8bc36 100644 --- a/.github/workflows/build-mobile.yml +++ b/.github/workflows/build-mobile.yml @@ -78,6 +78,7 @@ jobs: needs: pre-job permissions: contents: read + deployments: write pull-requests: write if: ${{ github.actor != 'dependabot[bot]' && fromJSON(needs.pre-job.outputs.should_run).mobile == true }} runs-on: mich @@ -144,9 +145,18 @@ jobs: ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }} IS_MAIN: ${{ github.ref == 'refs/heads/main' }} + IS_MAIN_DEPLOYMENT: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + IS_DEPLOYMENT_BUILD: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || (github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork) }} PR_NUMBER: ${{ github.event.pull_request.number }} run: | + if [[ $IS_DEPLOYMENT_BUILD == 'true' ]]; then + export ANDROID_APP_LABEL='Immich Staging' + fi + if [[ $IS_MAIN == 'true' ]]; then + if [[ $IS_MAIN_DEPLOYMENT == 'true' ]]; then + export ANDROID_APPLICATION_ID=app.immich.main + fi flutter build apk --release flutter build apk --release --split-per-abi --target-platform android-arm,android-arm64,android-x64 else @@ -160,6 +170,50 @@ jobs: name: release-apk-signed path: mobile/build/app/outputs/flutter-apk/*.apk + - name: Publish Android APK deployment + if: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || (github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork) }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + APK_URL: ${{ steps.upload-apk.outputs.artifact-url }} + with: + script: | + const artifactUrl = process.env.APK_URL; + const isPullRequest = context.eventName === "pull_request"; + const pullNumber = context.payload.pull_request?.number; + const environment = isPullRequest ? `mobile-android-apk-pr-${pullNumber}` : "mobile-android-apk"; + const description = isPullRequest + ? `Signed Android APK for PR #${pullNumber}` + : "Latest signed Android APK from main"; + const ref = isPullRequest ? context.payload.pull_request.head.sha : context.sha; + + if (!artifactUrl) { + throw new Error("The Android APK artifact URL was not generated"); + } + + const runUrl = `${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + const deployment = await github.rest.repos.createDeployment({ + owner: context.repo.owner, + repo: context.repo.repo, + ref, + environment, + description, + auto_merge: false, + required_contexts: [], + production_environment: false, + transient_environment: isPullRequest, + }); + + await github.rest.repos.createDeploymentStatus({ + owner: context.repo.owner, + repo: context.repo.repo, + deployment_id: deployment.data.id, + state: "success", + environment, + environment_url: artifactUrl, + log_url: runUrl, + description: "Signed APK artifact is ready for testing", + }); + - name: Comment APK download link on PR if: ${{ github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork }} uses: immich-app/devtools/actions/sticky-comment@0135acd12ad9f3369b94a2aa3c0ae8c835a4e926 # sticky-comment-action-v1.0.0 diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index 7e3d67fa81..fc9b64ae1d 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -13,6 +13,16 @@ if (keystorePropertiesFile.exists()) { keystorePropertiesFile.withInputStream { keystoreProperties.load(it) } } +def androidApplicationId = System.getenv("ANDROID_APPLICATION_ID")?.trim() +if (!androidApplicationId) { + androidApplicationId = "app.alextran.immich" +} + +def androidAppLabel = System.getenv("ANDROID_APP_LABEL")?.trim() +if (!androidAppLabel) { + androidAppLabel = "Immich" +} + android { compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -37,11 +47,12 @@ android { } defaultConfig { - applicationId "app.alextran.immich" + applicationId androidApplicationId minSdk = 26 targetSdk = flutter.targetSdkVersion versionCode flutter.versionCode versionName flutter.versionName + manifestPlaceholders = [appLabel: androidAppLabel] } signingConfigs { diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index 5f4de8284a..0bf45a7484 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -25,7 +25,7 @@ -