chore: stop publishing Experimental app#7321
Conversation
WalkthroughThis PR removes support for experimental builds across the entire CI/CD pipeline, consolidating all Android and iOS build and upload processes to produce only official store releases. The ChangesCI/CD Experimental Build Removal
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Suggested reviewers
Suggested labelstype: chore 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Warning Review ran into problems🔥 ProblemsErrors were encountered while retrieving linked issues. Errors (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.github/workflows/build-official-android.yml (1)
68-72:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAdd explicit check for build-android success before uploading.
Line 72 uses
always()but only checksupload-hold.result, allowing the job to run even whenbuild-androidfails. Ifbuild-androidfails andupload-holdis skipped (e.g., trigger is not 'pr'), the condition still evaluates true, causingupload-androidto run and mask the real build failure with a downstream upload error.Suggested fix
upload-android: name: Upload runs-on: ubuntu-latest needs: [build-android, upload-hold] - if: ${{ always() && (needs.upload-hold.result == 'success' || needs.upload-hold.result == 'skipped') }} + if: ${{ always() && needs.build-android.result == 'success' && (needs.upload-hold.result == 'success' || needs.upload-hold.result == 'skipped') }}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/build-official-android.yml around lines 68 - 72, The upload-android job's if condition allows the job to run even when build-android failed because it only checks needs.upload-hold.result; update the upload-android job's condition to also require that needs.build-android.result == 'success' (in addition to the existing upload-hold checks) so the upload step is skipped when the build failed; ensure you reference the job name upload-android and the dependency keys needs.build-android.result and needs.upload-hold.result when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/actions/build-ios/action.yml:
- Around line 86-92: The "Set Google Services" step incorrectly checks
APP_STORE_CONNECT_API_KEY_BASE64 but decodes inputs.GOOGLE_SERVICES_IOS; fix by
removing the if conditional entirely (recommended for official-only builds) or
change the check to test inputs.GOOGLE_SERVICES_IOS (i.e. replace the condition
with if [[ "${{ inputs.GOOGLE_SERVICES_IOS }}" ]]; then) so the decoded value
matches the variable being checked; update the run block in the "Set Google
Services" step accordingly.
---
Outside diff comments:
In @.github/workflows/build-official-android.yml:
- Around line 68-72: The upload-android job's if condition allows the job to run
even when build-android failed because it only checks needs.upload-hold.result;
update the upload-android job's condition to also require that
needs.build-android.result == 'success' (in addition to the existing upload-hold
checks) so the upload step is skipped when the build failed; ensure you
reference the job name upload-android and the dependency keys
needs.build-android.result and needs.upload-hold.result when making the change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 9ecdc89e-22a4-45fe-8a38-345ebd7babc8
📒 Files selected for processing (14)
.github/actions/build-android/action.yml.github/actions/build-ios/action.yml.github/actions/upload-android/action.yml.github/actions/upload-internal-android/action.yml.github/actions/upload-ios/action.yml.github/workflows/build-android.yml.github/workflows/build-develop.yml.github/workflows/build-ios.yml.github/workflows/build-official-android.yml.github/workflows/build-official-ios.yml.github/workflows/build-pr.ymlandroid/fastlane/Fastfileios/fastlane/Fastfileios/fastlane/README.md
💤 Files with no reviewable changes (2)
- .github/workflows/build-ios.yml
- .github/workflows/build-android.yml
📜 Review details
🧰 Additional context used
🪛 markdownlint-cli2 (0.22.1)
ios/fastlane/README.md
[warning] 24-24: Heading style
Expected: setext; Actual: atx
(MD003, heading-style)
[warning] 25-25: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 29-29: Heading style
Expected: setext; Actual: atx
(MD003, heading-style)
[warning] 30-30: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 34-34: Heading style
Expected: setext; Actual: atx
(MD003, heading-style)
[warning] 35-35: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (8)
ios/fastlane/README.md (1)
19-38: LGTM!android/fastlane/Fastfile (1)
36-42: LGTM!Also applies to: 45-50
ios/fastlane/Fastfile (1)
20-27: LGTM!Also applies to: 31-67, 139-145
.github/actions/upload-ios/action.yml (1)
36-52: LGTM!Also applies to: 86-96, 123-123
.github/actions/build-ios/action.yml (1)
79-84: LGTM!Also applies to: 96-96, 106-122
.github/workflows/build-official-ios.yml (1)
20-57: LGTM!Also applies to: 67-91
.github/actions/build-android/action.yml (1)
49-72: LGTM!Also applies to: 82-97
.github/actions/upload-internal-android/action.yml (1)
21-44: LGTM!Also applies to: 77-77
|
Android Build Available Rocket.Chat 4.72.0.108889 Internal App Sharing: https://play.google.com/apps/test/RQQ8k09hlnQ/ahAO29uNSzrgPeMaelcYdyT50zzccgGGa91xbspqRnjOY4PsHNx7gK3FEQVDamIc0bOn5kDfM7p9rMsu6O_h4Fj3c4 |
f0e1e35 to
c8965da
Compare
1d3e795 to
431ed09
Compare
PR2 of the phased Experimental → Official migration (design doc + NATIVE-1118).
CI is no longer building or publishing the Experimental variant. The Official
publish pipeline is unchanged in behaviour; this just rips out the parallel
experimental arm from every workflow, composite action, and fastlane lane it
touched.
Workflows
- Delete .github/workflows/build-android.yml and build-ios.yml (the parameterised
workflows whose only remaining caller was the experimental path; Official
already had build-official-{android,ios}.yml).
- Remove android-build-experimental-store / ios-build-experimental-store from
build-pr.yml and build-develop.yml.
- Drop `type` workflow input from build-official-{android,ios}.yml and stop
passing GOOGLE_SERVICES_IOS_EXPERIMENTAL / BUGSNAG_KEY to the iOS composite.
Composite actions
- build-android: drop type/KEYSTORE_EXPERIMENTAL_*/BUGSNAG_KEY inputs and the
experimental arms in keystore decode, gradle.properties, gradle bundle, and
bugsnag upload. Only the Official AAB upload step remains.
- build-ios: drop type/BUGSNAG_KEY/GOOGLE_SERVICES_IOS_EXPERIMENTAL, drop the
experimental fastlane invocation and all `inputs.type == 'experimental'`
artifact uploads. Keep the PlistBuddy `Set IS_OFFICIAL YES` block until PR3
removes the key from the source Info.plists.
- upload-{android,internal-android,ios}: drop type input, the experimental
download branches, and the `Rocket.Chat Experimental` PR-comment label.
Fastlane
- ios/fastlane/Fastfile: delete build_experimental and build_experimental_simulator;
collapse `beta` to a no-options Official lane (chat.rocket.ios + BUGSNAG_KEY_OFFICIAL).
Keep build_official and its `prepare_ios_official.sh` call — PR3 deletes both
in lockstep with the pbxproj rewrite.
- android/fastlane/Fastfile: delete experimental_production; collapse `beta` and
`internal_app_sharing` to no-options Official lanes (chat.rocket.android).
Verified by `grep -rn experimental|Experimental|EXPERIMENTAL .github/ ios/fastlane/Fastfile android/fastlane/Fastfile` returning zero, and by YAML/Ruby
parse on every modified file.
Out-of-band steps (App Store Connect archive, Play Console internal entry, GH
Environments + Secrets cleanup) are tracked separately in the design doc and
are not part of this PR.
https://rocketchat.atlassian.net/browse/NATIVE-1118
431ed09 to
694d654
Compare
There was a problem hiding this comment.
♻️ Duplicate comments (1)
.github/actions/build-ios/action.yml (1)
86-92:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winIncorrect variable check in Google Services setup.
Line 89 checks
if [[ $APP_STORE_CONNECT_API_KEY_BASE64 ]]; thenbut then decodes${{ inputs.GOOGLE_SERVICES_IOS }}. This checks the wrong variable—the condition should verify the input being used, not an unrelated one.Since this is now the official-only build path and
GOOGLE_SERVICES_IOSis marked as required (line 33), you can safely remove the conditional entirely.🔧 Proposed fix
- name: Set Google Services working-directory: ios run: | - if [[ $APP_STORE_CONNECT_API_KEY_BASE64 ]]; then - echo ${{ inputs.GOOGLE_SERVICES_IOS }} | base64 --decode > GoogleService-Info.plist - fi + echo ${{ inputs.GOOGLE_SERVICES_IOS }} | base64 --decode > GoogleService-Info.plist shell: bash🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/actions/build-ios/action.yml around lines 86 - 92, The "Set Google Services" step uses the wrong conditional (checks APP_STORE_CONNECT_API_KEY_BASE64) while decoding inputs.GOOGLE_SERVICES_IOS; remove the entire if/fi guard and always decode the required GOOGLE_SERVICES_IOS input into GoogleService-Info.plist (i.e., in the step that currently contains the if [[ $APP_STORE_CONNECT_API_KEY_BASE64 ]]; then ... fi, replace it with a single unconditional decode of GOOGLE_SERVICES_IOS to GoogleService-Info.plist).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Duplicate comments:
In @.github/actions/build-ios/action.yml:
- Around line 86-92: The "Set Google Services" step uses the wrong conditional
(checks APP_STORE_CONNECT_API_KEY_BASE64) while decoding
inputs.GOOGLE_SERVICES_IOS; remove the entire if/fi guard and always decode the
required GOOGLE_SERVICES_IOS input into GoogleService-Info.plist (i.e., in the
step that currently contains the if [[ $APP_STORE_CONNECT_API_KEY_BASE64 ]];
then ... fi, replace it with a single unconditional decode of
GOOGLE_SERVICES_IOS to GoogleService-Info.plist).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: e050ed60-42db-41d4-9a05-4606a7410b4e
📒 Files selected for processing (14)
.github/actions/build-android/action.yml.github/actions/build-ios/action.yml.github/actions/upload-android/action.yml.github/actions/upload-internal-android/action.yml.github/actions/upload-ios/action.yml.github/workflows/build-android.yml.github/workflows/build-develop.yml.github/workflows/build-ios.yml.github/workflows/build-official-android.yml.github/workflows/build-official-ios.yml.github/workflows/build-pr.ymlandroid/fastlane/Fastfileios/fastlane/Fastfileios/fastlane/README.md
💤 Files with no reviewable changes (2)
- .github/workflows/build-ios.yml
- .github/workflows/build-android.yml
📜 Review details
🧰 Additional context used
🪛 markdownlint-cli2 (0.22.1)
ios/fastlane/README.md
[warning] 24-24: Heading style
Expected: setext; Actual: atx
(MD003, heading-style)
[warning] 25-25: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 29-29: Heading style
Expected: setext; Actual: atx
(MD003, heading-style)
[warning] 30-30: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 34-34: Heading style
Expected: setext; Actual: atx
(MD003, heading-style)
[warning] 35-35: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🪛 zizmor (1.25.2)
.github/workflows/build-official-ios.yml
[warning] 73-74: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false
(artipacked)
.github/workflows/build-official-android.yml
[warning] 74-75: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false
(artipacked)
[warning] 91-92: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false
(artipacked)
.github/workflows/build-pr.yml
[warning] 71-71: secrets unconditionally inherited by called workflow (secrets-inherit): this reusable workflow
(secrets-inherit)
🔇 Additional comments (12)
.github/actions/build-android/action.yml (1)
48-98: LGTM!.github/actions/build-ios/action.yml (1)
65-84: LGTM!Also applies to: 94-122
.github/actions/upload-android/action.yml (1)
17-86: LGTM!.github/actions/upload-internal-android/action.yml (1)
21-82: LGTM!.github/actions/upload-ios/action.yml (1)
32-126: LGTM!.github/workflows/build-develop.yml (1)
26-42: LGTM!.github/workflows/build-official-android.yml (1)
20-103: LGTM!.github/workflows/build-official-ios.yml (1)
20-91: LGTM!.github/workflows/build-pr.yml (1)
22-39: LGTM!Also applies to: 47-47, 67-67, 74-74, 83-83, 86-86
android/fastlane/Fastfile (1)
36-41: LGTM!Also applies to: 45-49
ios/fastlane/README.md (1)
24-29: LGTM!Also applies to: 34-38
ios/fastlane/Fastfile (1)
20-27: LGTM!Also applies to: 31-31, 48-49, 53-53, 65-65, 121-123, 125-125, 129-130, 135-135, 140-141, 144-144
Proposed changes
PR2 of the phased Experimental → Official migration documented in the design doc (stacked on top of #7320 / PR1). Merge PR1 first.
CI no longer builds or publishes the Experimental variant. The Official publish pipeline is unchanged in behaviour — this just rips out the parallel experimental arm from every workflow, composite action, and fastlane lane it touched.
Workflows
.github/workflows/build-android.ymlandbuild-ios.yml(parameterised workflows whose only remaining caller was the experimental path; Official already hasbuild-official-{android,ios}.yml).android-build-experimental-store/ios-build-experimental-storejobs frombuild-pr.ymlandbuild-develop.yml.typeworkflow input frombuild-official-{android,ios}.yml; stop passingGOOGLE_SERVICES_IOS_EXPERIMENTALand the non-officialBUGSNAG_KEYto the iOS composite.Composite actions
build-android: droptype/KEYSTORE_EXPERIMENTAL_*/BUGSNAG_KEYinputs and the experimental arms in keystore decode,gradle.properties, gradle bundle, and bugsnag upload. Only the Official AAB upload step remains.build-ios: droptype/BUGSNAG_KEY/GOOGLE_SERVICES_IOS_EXPERIMENTAL, drop the experimental fastlane invocation, and drop allinputs.type == 'experimental'artifact uploads. Keep thePlistBuddy Set IS_OFFICIAL YESblock — it remains load-bearing until PR3 removes the key from the source Info.plists.upload-{android,internal-android,ios}: droptypeinput, the experimental download branches, and theRocket.Chat ExperimentalPR-comment label.Fastlane
ios/fastlane/Fastfile: deletebuild_experimentalandbuild_experimental_simulator; collapsebetato a no-options Official lane (chat.rocket.ios+BUGSNAG_KEY_OFFICIAL). Keepbuild_officialand itsprepare_ios_official.shcall — PR3 deletes both in lockstep with the pbxproj rewrite.android/fastlane/Fastfile: deleteexperimental_production; collapsebetaandinternal_app_sharingto no-options Official lanes (chat.rocket.android).Explicitly NOT in this PR (intentionally deferred to PR3):
scripts/prepare_ios_official.shand its call frombuild_official— still load-bearing for the Official pbxproj rewrite.IS_OFFICIAL YESstep inbuild-ios/action.yml— removed when PR3 drops the key from the source Info.plists.experimentalflavor, JSisOfficialswitch,DeprecationModal, store records, GH secrets / environments.Out-of-band (admin UI, not in this diff) — to be done by a maintainer when this lands:
chat.rocket.reactnativeapp record (TestFlight stops).experimental_android_build,experimental_ios_build,upload_experimental_android,upload_experimental_ios.KEYSTORE_EXPERIMENTAL_*andEXPERIMENTAL_KEYSTORE_*(both naming conventions),GOOGLE_SERVICES_IOS_EXPERIMENTAL, and the non-officialBUGSNAG_KEY(keepBUGSNAG_KEY_OFFICIAL). Verify against the actual GitHub secrets list before deletion — two naming conventions coexist historically.Issue(s)
https://rocketchat.atlassian.net/browse/NATIVE-1121
How to test or reproduce
grep -rn "experimental\|Experimental\|EXPERIMENTAL" .github/ ios/fastlane/Fastfile android/fastlane/Fastfile→ zero hits.grep -rn "build_experimental\|experimental_production" ios/fastlane/ android/fastlane/→ zero hits.grep -rn "prepare_ios_official" .→ 3 hits (the script itself + 2 fastlane lanes that still call it:build_officialandbuild_official_simulator).official_{android,ios}_build; no Experimental jobs remain to approve.Screenshots
n/a — CI / fastlane only.
Types of changes
Checklist
Further comments
Stacked on PR1 (#7320); base branch is
remove-experimental-pr1-begin-sunset, notdevelop. When PR1 merges, rebase this PR onto develop before merge.After this PR lands and the out-of-band admin-UI steps are done, PR3 ("Delete code") becomes the cleanup pass — Xcode target deletion, Android flavor removal,
IS_OFFICIAL/isOfficialpurge,prepare_ios_official.shdeletion, and removal of theDeprecationModalshipped in PR1.Summary by CodeRabbit