diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 86bfa195cd75..4791ad8ebec0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -137,7 +137,7 @@ jobs: - name: Setup Node id: setup-node uses: ./.github/actions/composite/setupNode - with: + with: IS_HYBRID_BUILD: 'true' - name: Run grunt build @@ -166,8 +166,9 @@ jobs: env: OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} run: | - op document get --output ./upload-key.keystore upload-key.keystore - op document get --output ./android-fastlane-json-key.json android-fastlane-json-key.json + op read op://Mobile-Deploy-CI/firebase.json/firebase.json --force --out-file ./firebase.json + op read op://Mobile-Deploy-CI/upload-key.keystore/upload-key.keystore --force --out-file ./upload-key.keystore + op read op://Mobile-Deploy-CI/android-fastlane-json-key.json/android-fastlane-json-key.json --force --out-file ./android-fastlane-json-key.json # Copy the keystore to the Android directory for Fullstory cp ./upload-key.keystore Mobile-Expensify/Android @@ -218,7 +219,7 @@ jobs: else echo "Skipping the completion of the previous version rollout" fi - + # Submit the new version for review and slow rollout when it's approved bundle exec fastlane android upload_google_play_production_hybrid_rollout env: @@ -230,6 +231,31 @@ jobs: env: BROWSERSTACK: ${{ secrets.BROWSERSTACK }} + - name: Generate APK from AAB + run: | + json=$(curl -s https://api.github.com/repos/google/bundletool/releases/latest) + downloadUrl=$(echo "$json" | jq -r ".assets | .[].browser_download_url") + curl "$downloadUrl" -4 -sL -o 'bundletool.jar' + java -jar bundletool.jar build-apks --bundle=${{ env.aabPath }} --output=Expensify.apks \ + --mode=universal \ + --ks=upload-key.keystore \ + --ks-pass=pass:${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_PASSWORD }} \ + --ks-key-alias=${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_ALIAS }} \ + --key-pass=pass:${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEY_PASSWORD }} + + unzip -p Expensify.apks universal.apk > Expensify.apk + + - name: Upload Android APK build artifact + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + uses: actions/upload-artifact@v4 + with: + name: android-hybrid-apk-artifact + path: Expensify.apk + + - name: Upload Android build to Firebase distribution + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + run: bundle exec fastlane android upload_firebase_distribution + - name: Upload Android build artifact if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} uses: actions/upload-artifact@v4 @@ -451,7 +477,7 @@ jobs: - name: Setup Node id: setup-node uses: ./.github/actions/composite/setupNode - with: + with: IS_HYBRID_BUILD: 'true' - name: Setup Ruby @@ -488,9 +514,10 @@ jobs: env: OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} run: | - op document get --output ./OldApp_AppStore.mobileprovision OldApp_AppStore - op document get --output ./OldApp_AppStore_Share_Extension.mobileprovision OldApp_AppStore_Share_Extension - op document get --output ./OldApp_AppStore_Notification_Service.mobileprovision OldApp_AppStore_Notification_Service + op read op://Mobile-Deploy-CI/firebase.json/firebase.json --force --out-file ./firebase.json + op read op://Mobile-Deploy-CI/OldApp_AppStore/OldApp_AppStore.mobileprovision --force --out-file ./OldApp_AppStore.mobileprovision + op read op://Mobile-Deploy-CI/OldApp_AppStore_Share_Extension/OldApp_AppStore_Share_Extension.mobileprovision --force --out-file ./OldApp_AppStore_Share_Extension.mobileprovision + op read op://Mobile-Deploy-CI/OldApp_AppStore_Notification_Service/OldApp_AppStore_Notification_Service.mobileprovision --force --out-file ./OldApp_AppStore_Notification_Service.mobileprovision - name: Decrypt AppStore profile run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore.mobileprovision NewApp_AppStore.mobileprovision.gpg @@ -537,8 +564,8 @@ jobs: run: | # Complete the previous version rollout bundle exec fastlane ios complete_hybrid_rollout - - # Submit the new version for review and phased rollout when it's approved + + # Submit the new version for review and phased rollout when it's approved bundle exec fastlane ios submit_hybrid_for_rollout env: VERSION: ${{ steps.getIOSVersion.outputs.IOS_VERSION }} @@ -549,6 +576,10 @@ jobs: env: BROWSERSTACK: ${{ secrets.BROWSERSTACK }} + - name: Upload iOS build to Firebase distribution + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + run: bundle exec fastlane ios upload_firebase_distribution + - name: Upload iOS build artifact if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} uses: actions/upload-artifact@v4 @@ -756,6 +787,7 @@ jobs: "./android-sourcemaps-artifact/index.android.bundle.map#android-sourcemap.js.map" "./android-aab-artifact/app-production-release.aab#android.aab" "./android-hybrid-build-artifact/Expensify-release.aab#android-hybrid.aab" + "./android-hybrid-apk-artifact/Expensify.apk#android-hybrid.apk" "./android-hybrid-sourcemap-artifact/index.android.bundle.map#android-hybrid-sourcemap.js.map" "./desktop-staging-sourcemaps-artifact/desktop-staging-merged-source-map.js.map#desktop-staging-sourcemap.js.map" "./desktop-staging-build-artifact/NewExpensify.dmg#desktop-staging.dmg" diff --git a/Gemfile.lock b/Gemfile.lock index 3c0202ff325c..53a966923ee9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -165,6 +165,9 @@ GEM apktools (~> 0.7) aws-sdk-s3 (~> 1) mime-types (~> 3.3) + fastlane-plugin-firebase_app_distribution (0.10.0) + google-apis-firebaseappdistribution_v1 (~> 0.3.0) + google-apis-firebaseappdistribution_v1alpha (~> 0.2.0) fastlane-sirp (1.0.0) sysrandom (~> 1.0) ffi (1.17.0) @@ -184,6 +187,10 @@ GEM representable (~> 3.0) retriable (>= 2.0, < 4.a) rexml + google-apis-firebaseappdistribution_v1 (0.3.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-firebaseappdistribution_v1alpha (0.2.0) + google-apis-core (>= 0.11.0, < 2.a) google-apis-iamcredentials_v1 (0.17.0) google-apis-core (>= 0.11.0, < 2.a) google-apis-playcustomapp_v1 (0.13.0) @@ -229,7 +236,7 @@ GEM molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.4.1) - nanaimo (0.4.0) + nanaimo (0.3.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) @@ -274,12 +281,12 @@ GEM uber (0.1.0) unicode-display_width (2.6.0) word_wrap (1.0.0) - xcodeproj (1.27.0) + xcodeproj (1.25.1) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.4.0) + nanaimo (~> 0.3.0) rexml (>= 3.3.6, < 4.0) xcpretty (0.3.0) rouge (~> 2.0.7) @@ -298,6 +305,7 @@ DEPENDENCIES cocoapods (= 1.15.2) fastlane (~> 2, >= 2.222.0) fastlane-plugin-aws_s3 + fastlane-plugin-firebase_app_distribution xcodeproj (< 1.26.0) xcpretty (~> 0) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index d1724e070d72..c7c0b00ea58c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -197,6 +197,16 @@ platform :android do ) end + desc "Upload app to Firebase distribution" + lane :upload_firebase_distribution do + firebase_app_distribution( + app: "1:1008697809946:android:2e48f9ffe8d0b6a2", + service_credentials_file: "./firebase.json", + android_artifact_path: ENV[KEY_GRADLE_AAB_PATH], + android_artifact_type: "AAB" + ) + end + desc "Upload HybridApp to Google Play for internal testing" lane :upload_google_play_internal_hybrid do # Google is very unreliable, so we retry a few times @@ -507,6 +517,15 @@ platform :ios do sh("echo '{\"ipa_path\": \"#{lane_context[SharedValues::S3_IPA_OUTPUT_PATH]}\",\"html_path\": \"#{lane_context[SharedValues::S3_HTML_OUTPUT_PATH]}\"}' > ../ios_paths.json") end + desc "Upload app to Firebase distribution" + lane :upload_firebase_distribution do + firebase_app_distribution( + app: "1:1008697809946:ios:3ffad71f664f2886", + service_credentials_file: "./firebase.json", + ipa_path: ENV[KEY_IPA_PATH], + ) + end + desc "Upload app to TestFlight" lane :upload_testflight do upload_to_testflight( diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile index c6ab0dfb46a4..3844e2a6958c 100644 --- a/fastlane/Pluginfile +++ b/fastlane/Pluginfile @@ -3,3 +3,4 @@ # Ensure this file is checked in to source control! gem 'fastlane-plugin-aws_s3' +gem 'fastlane-plugin-firebase_app_distribution'