From aa0de96dcea4d8f0350b29d551360565fcf1c474 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 20 Jun 2026 00:54:39 -0700 Subject: [PATCH] ci(ios-testflight): run the beta lane every ~2h instead of nightly An iOS change waited up to ~24h for the nightly TestFlight upload (and stranded another day if that nightly failed). Run the existing, proven, serialized lane every ~2h instead, so an iOS-affecting merge reaches internal TestFlight within ~2h. This reuses the per-ref-serialized decide+upload path unchanged (no push trigger): a per-push lane would either cancel superseded pending runs into red checks or, with per-SHA concurrency, let parallel archives race on the timestamp build number. ~2h spacing exceeds one archive's duration (~30-60m) so runs do not overlap and uploads never collide. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ios-testflight.yml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ios-testflight.yml b/.github/workflows/ios-testflight.yml index 2aa57f3ced59..792280b51426 100644 --- a/.github/workflows/ios-testflight.yml +++ b/.github/workflows/ios-testflight.yml @@ -27,11 +27,22 @@ on: default: false type: boolean schedule: - # Nightly at 09:10 UTC. The decide job skips the run only when the current - # main HEAD was already uploaded by a prior successful run (SHA compare, not - # a wall-clock window), so a failed or missed nightly retries the - # not-yet-uploaded commit instead of permanently stranding it. - - cron: "10 9 * * *" + # Every ~2h (at :17 to stay off the top-of-hour rush). The decide job skips a + # run only when the current main HEAD was already uploaded by a prior + # successful run (SHA compare, not a wall-clock window), so an iOS-affecting + # change reaches internal TestFlight within ~2h of landing on main, and a + # failed or missed run retries the not-yet-uploaded commit instead of + # permanently stranding it. + # + # Why ~2h and not a push trigger / per-commit: a per-push lane needs either a + # shared concurrency group (which cancels superseded pending runs into red + # checks) or per-SHA concurrency (which removes the serialization that keeps + # parallel archives from racing on the timestamp build number). ~2h spacing + # keeps runs from overlapping (an archive+upload takes ~30-60m), so this + # single per-ref lane stays serialized and uploads never collide. If faster + # turnaround is ever needed, tighten the interval (still > one archive's + # duration) rather than adding a push trigger. + - cron: "17 */2 * * *" concurrency: group: ios-testflight-${{ github.ref_name }}