Skip to content

Release to Staging v2.9.24 - 2026-06-01#2144

Merged
transphorm merged 1 commit into
stagingfrom
release/staging-2026-06-01
Jun 1, 2026
Merged

Release to Staging v2.9.24 - 2026-06-01#2144
transphorm merged 1 commit into
stagingfrom
release/staging-2026-06-01

Conversation

@github-actions

@github-actions github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

🚀 Weekly Release to Staging

Release Date: June 01, 2026
Release Branch: release/staging-2026-06-01

This automated PR promotes a snapshot of dev to staging for testing.

What's Included

All commits merged to dev up to the branch creation time.

Note: This PR uses a dedicated release branch, so new commits to dev will NOT automatically appear here.

Review Checklist

  • All CI checks pass
  • Code review completed
  • QA team notified
  • Ready to merge to staging environment

Next Steps

After merging, the staging environment will be updated. A production release PR will be created on Sunday.


This PR was automatically created by the Release Calendar workflow on June 01, 2026

)

* simplify deploy architecture

* update fastlane

* fixes

* pr feedback
@vercel

vercel Bot commented Jun 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
self-webview-app Ignored Ignored Preview Jun 1, 2026 10:29pm

Request Review

@transphorm transphorm merged commit 5f3eead into staging Jun 1, 2026
15 checks passed
@transphorm transphorm deleted the release/staging-2026-06-01 branch June 1, 2026 22:33
@greptile-apps

greptile-apps Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This release refactors Android CI deployment to decouple build (Fastlane) from Play Store upload (upload_to_play_store.py), adds iOS production App Store submission support, bumps Android API 35→36 and NDK 27→28, and upgrades fastlane 2.232→2.235 with several dependency bumps.

  • Android build: Fastlane now only produces the signed AAB; a dedicated Python script handles resumable, WIF-authenticated uploads to the Play Store track or Internal App Sharing, gaining per-chunk progress logging and a new --mode query pre-upload diagnostic.
  • iOS production submission: deploy_auto production path now conditionally calls upload_to_app_store when IOS_SUBMIT_FOR_REVIEW=true, and TestFlight upload is wrapped with a new ios_upload_with_idempotent_retry helper that treats ITMS-4238 "Redundant Binary Upload" responses as success instead of retrying indefinitely.
  • Architecture control: ANDROID_RELEASE_ARCHITECTURES=arm64-v8a is now injected as a CI env var and forwarded to Gradle via two properties (reactNativeArchitectures, selfAppArchitectures), with build.gradle updated to parse the comma-separated value with a new parseArchitectures closure.

Confidence Score: 4/5

Safe to merge to staging — no data loss or security risk; two edge-case failures possible on rare retry scenarios.

The Android build/upload split, resumable upload improvements, and iOS App Store submission gate are all well-structured. The two flagged issues (potential unprocessed-build submission when ITMS-4238 fires in a fast retry, and the silent all-ABI build when selfAppArchitectures is empty) would surface as visible CI failures rather than silent regressions, and both require unusual preconditions to trigger.

app/fastlane/helpers/ios.rb (ITMS-4238 interaction with production submission) and app/android/app/build.gradle (empty abiFilters spread) deserve a second look before the production release PR.

Important Files Changed

Filename Overview
app/fastlane/helpers/ios.rb Adds ios_upload_with_idempotent_retry and ios_build_already_uploaded?; the idempotency logic is well-reasoned but the production-submit code path that follows may attempt to submit an unprocessed build when ITMS-4238 fires.
app/fastlane/Fastfile iOS production track now conditionally submits to App Store; Android upload lanes removed in favour of build_only; architecture env var plumbed through to Gradle properties. Logic is mostly sound with the noted edge case.
app/scripts/upload_to_play_store.py Switches to explicit socket timeout via httplib2, per-chunk resumable upload with progress logging, and adds a read-only query mode. Idempotency and retry logic are well-handled.
app/android/app/build.gradle Adds parseArchitectures closure and selfAppArchitectures property support; no guard against an empty list being spread into abiFilters.
.github/workflows/mobile-deploy.yml API level 35→36, NDK 27→28, timeout extended to 30 min, adds pre-upload query step (continue-on-error) and failure artifact upload for the AAB.
app/Gemfile fastlane version bumped from ~2.232 to ~2.235; lock file is consistent.
app/scripts/mobile-deploy-confirm.cjs Updates local deploy command from android internal_test to android build_only and adjusts success messaging to clarify that Android upload is CI-only.

Sequence Diagram

sequenceDiagram
    participant CI as GitHub Actions
    participant FL as Fastlane (build_only)
    participant Gradle as Gradle (bundleRelease)
    participant PY as upload_to_play_store.py
    participant Play as Google Play API

    CI->>FL: bundle exec fastlane android build_only
    FL->>Gradle: "-PreactNativeArchitectures=arm64-v8a -PselfAppArchitectures=arm64-v8a"
    Gradle-->>FL: app-release.aab
    FL-->>CI: AAB artifact

    alt PR preview build
        CI->>PY: --mode ias --aab app-release.aab
        PY->>Play: internalappsharingartifacts.uploadbundle (resumable)
        Play-->>PY: downloadUrl
        PY-->>CI: GITHUB_OUTPUT: download_url
    else Production / Internal release
        CI->>PY: --mode query --track internal
        PY->>Play: edits.insert + tracks.get
        Play-->>PY: current releases
        PY->>Play: edits.delete (cleanup)
        CI->>PY: --mode track --aab app-release.aab --track internal
        PY->>Play: edits.insert
        PY->>Play: bundles.upload (resumable, 8 MiB chunks)
        Play-->>PY: versionCode
        PY->>Play: tracks.update
        PY->>Play: edits.commit
        Play-->>PY: success
        PY-->>CI: exit 0
    end
Loading

Comments Outside Diff (1)

  1. app/android/app/build.gradle, line 174-176 (link)

    P2 Empty abiFilters spread if selfAppArchitectures is blank

    parseArchitectures filters out blank tokens with findAll { it }, so passing an empty string or a string of commas returns []. Spreading an empty list — abiFilters(*[]) — calls abiFilters() with no arguments, which in Android Gradle DSL leaves the filter unset, causing all ABIs to be compiled. The CI env var and Fastfile default both guard against this today, but a misconfigured value (e.g., ANDROID_RELEASE_ARCHITECTURES="") would silently produce a much larger, multi-ABI AAB instead of failing the build.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Reviews (1): Last reviewed commit: "simplify Android store deploy, upgrade f..." | Re-trigger Greptile

Comment on lines +159 to +173
# Run a TestFlight upload block, retrying transient failures while treating
# an "already uploaded" rejection from a prior partial attempt as success.
def ios_upload_with_idempotent_retry(max_retries: 3, delay: 15)
already_uploaded = false
with_retry(max_retries: max_retries, delay: delay) do
begin
yield
rescue => e
raise e unless ios_build_already_uploaded?(e)
already_uploaded = true
UI.important("Build already present on App Store Connect; treating upload as successful: #{e.message}")
end
end
report_success("Build already on App Store Connect (skipped re-upload)") if already_uploaded
end

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Unprocessed build may be submitted when ITMS-4238 fires in production path

When ios_upload_with_idempotent_retry swallows ITMS-4238 (binary already on ASC), the upload_to_testflight call with skip_waiting_for_build_processing: false never actually waited for the build to finish processing. The Fastfile then immediately calls upload_to_app_store with skip_binary_upload: true. If the current CI run is a quick retry of a failed predecessor (e.g., within minutes of the previous upload), App Store Connect may reject the submission because the binary hasn't been processed yet, causing the with_retry block around upload_to_app_store to fail. The fix is to call upload_to_testflight (or a dedicated wait action) to wait for processing before attempting App Store submission when already_uploaded is detected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant