[No QA] Separate build and upload jobs in deploy workflow#81269
[No QA] Separate build and upload jobs in deploy workflow#81269roryabraham merged 56 commits intomainfrom
Conversation
Split Android and iOS jobs into separate build and upload jobs to avoid rebuilding when uploads fail. Upload jobs are further split into critical store uploads and non-critical testing uploads that run in parallel. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Since GITHUB_ENV doesn't persist across jobs, we need to set the aabPath, ipaPath, and dsymPath environment variables after downloading the artifacts in the upload jobs. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
On production deploys, native builds are skipped so no artifacts are uploaded. Add conditional checks to skip download/upload steps that depend on build artifacts, while still allowing production rollout steps to run. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
Add SHOULD_DEPLOY_NATIVE output to prep job and reference it throughout the workflow instead of repeating the condition inline. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The dSYM upload lane references Mobile-Expensify/iOS/Pods/FirebaseCrashlytics/upload-symbols, so the checkout needs to pull submodules. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
The dSYM upload lane uses the Crashlytics upload-symbols binary from Mobile-Expensify/iOS/Pods, so we need to install pods before running the upload. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
GitHub Actions expressions don't allow dot-notation access to keys containing hyphens. Changed needs.ios-upload-testflight.result to needs['ios-upload-testflight'].result and similarly for android-upload-google-play. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
Include android-build and ios-build in the postSlackMessageOnFailure job's needs array so build failures also trigger Slack notifications. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
Modified the upload_testflight_hybrid lane to read the IPA path from the ipaPath environment variable. This allows the lane to work when run in a separate job from the build, where the lane context is not available. Co-authored-by: Cursor <cursoragent@cursor.com>
This comment has been minimized.
This comment has been minimized.
|
Codex Review: Didn't find any major issues. What shall we delve into next? ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
@Julesssss ready for review! |
Julesssss
left a comment
There was a problem hiding this comment.
Reviewed as best as I could for large workflow changes. Lets keep an eye out on the next release.
FYI @puneetlath in case the App deploy explodes
firebase.json is no longer needed for Android builds (already removed from main) or for the TestFlight upload job which only uploads a pre-built IPA. iOS build (buildIOS.yml) still loads it for Crashlytics. Co-authored-by: Cursor <cursoragent@cursor.com>
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / Safari |
|
not waiting for reassure since this is a CI/CD-only change |
|
🚧 @roryabraham has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
[No QA] Separate build and upload jobs in deploy workflow (cherry picked from commit 5a6dbe1) (cherry-picked to staging by roryabraham) Co-authored-by: Cursor <cursoragent@cursor.com>
|
🚀 Cherry-picked to staging by https://github.com/roryabraham in version: 9.3.25-0 🚀
|
|
🚀 Deployed to production by https://github.com/puneetlath in version: 9.3.25-13 🚀
|
Explanation of Change
This PR refactors the CI/CD build infrastructure in two main ways:
1. Separate build and upload jobs in
deploy.ymlPreviously, if an upload failed (e.g., Google Play or TestFlight), we had to rebuild the entire app. Now Android and iOS each have dedicated build, upload, and submit jobs. Testing uploads (BrowserStack/Applause) run in parallel with store uploads and use
continue-on-error: trueso they can't block deployments. This also saves money by using large runners only for heavy builds, not while waiting on app store uploads.2. Unified callable build workflows
Extracted build logic into three reusable callable workflows that serve both
deploy.yml(Release) and test builds (Adhoc):buildAndroid.yml– Android HybridApp build via Rock Remote Build, with Gradle cache retry for durability. Produces AAB, APK (via bundletool), and sourcemap artifacts.buildIOS.yml– iOS HybridApp build via Rock Remote Build, with variant-specific provisioning profiles andExportOptions.plist. Includes CocoaPods caching. Produces IPA, dSYM, and sourcemap artifacts.buildWeb.yml– Web build with environment-specific build commands, optional S3 deployment, and Cloudflare cache purging.testBuild.ymlandtestBuildOnPush.ymlnow call these callable workflows directly (replacing the deletedbuildAdHoc.yml). Both support aFORCE_NATIVE_BUILDoption to bypass the Rock remote cache.Fixed Issues
$ #81257
Tests
N/A - GitHub Actions workflow changes will be validated on next deploy
Offline tests
N/A
QA Steps
N/A
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.