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 }}