fix: wait for pods to reach the CocoaPods CDN before triggering hybrid bumps (#1851)
## What and why A pod pushed to trunk isn't immediately resolvable by `pod install` — `18.33.1` was on trunk at 14:35 UTC on 2026-08-27 and still wasn't on the CDN index two hours later. The hybrid bump PRs open right after the release, so their iOS jobs fail with `CocoaPods could not find compatible versions for pod "PurchasesHybridCommon"` until someone reruns them by hand. This waits once in `trigger-dependent-updates`, before kicking off any of the bumps, instead of each hybrid waiting on its own. Per the thread with @vegaro / @tonidero / @facundoolano: waiting here means one already-provisioned `cimg/ruby` docker job blocks, rather than mac executors idling across five repos. The release PR stays open while it waits, so the tagged commit's jobs stay visible. ## Timeout behaviour Three limits interact here, so spelling them out: - **The wait is capped at 3 hours.** CircleCI *cancels* a job that exceeds its max runtime, which would skip the bump steps entirely, so the wait has to stay clear of that cap. We're on the Scale plan (5h), confirmed by a `purchases-ios` job that ran 5.09h, so 3 hours leaves a couple of hours of headroom. Set explicitly rather than inheriting the action's default so a change there can't silently push us over. - **On timeout it still triggers the bumps** (`soft_fail`). Failing would leave every hybrid without a PR at all, which is worse than today; opening them means each can be rerun individually. - **`no_output_timeout: 190m`**, above the wait. The lane logs on every poll so the 10 minute default wouldn't fire in normal operation, but a stalled CDN request would otherwise kill the step at 10 minutes. If the step does fail, the bump steps still run — they're all `when: always`. Net: a normal propagation is absorbed silently, and every failure mode still ends with five bump PRs open. ## Contributing checklist - [x] A description about what and why you are contributing, even if it's trivial. - [x] The issue number(s) or PR number(s) in the description if you are contributing in response to those. Uses `wait_for_pods_in_cocoapods_cdn` from RevenueCat/fastlane-plugin-revenuecat_internal#154; replaces the per-repo approach in RevenueCat/react-native-purchases#1930. - [ ] If applicable, unit tests. The action's logic is unit tested in the plugin; this is the wiring. ## Verification - [x] `circleci config validate .circleci/config.yml` - [x] `ruby -c fastlane/Fastfile` - [x] `bundle exec fastlane wait_for_pods_on_cdn` against the live CDN, resolving the plugin from git (not a local checkout): 18.33.1 resolved both pods and exited 0 - [x] Timeout path with an unpublished version: warns per pod, exits 0 so the bumps still run, and reports `180m remaining` confirming the cap reaches the action - [ ] Exercised on a real release ## Follow-up, not blocking The CDN request has no explicit HTTP timeout, so a hung connection stalls until `no_output_timeout` rather than failing fast. Harmless here given `when: always`, but worth hardening in the plugin. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Touches the stable-release path that fans out bumps to five hybrid repos; mis-tuned timeouts could delay releases or reopen red iOS jobs, though `soft_fail` and `when: always` limit worst-case impact. > > **Overview** > Adds a **single centralized wait** in the `trigger-dependent-updates` CircleCI job so hybrid bump PRs are not opened until `PurchasesHybridCommon` and `PurchasesHybridCommonUI` for the release version resolve on the CocoaPods CDN. > > The new **`wait_for_pods_on_cdn`** Fastlane lane polls via `wait_for_pods_in_cocoapods_cdn` (updated **`fastlane-plugin-revenuecat_internal`** in `Gemfile.lock`) with a **3-hour cap** and **`soft_fail: true`**, so timeouts still allow downstream bumps. CircleCI runs that lane **before** the existing `bump_hybrid_dependencies` steps (which remain **`when: always`**) and sets **`no_output_timeout: 190m`** so a hung CDN request does not fail the step at the default 10 minutes. Fastlane README documents the new lane. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 8c94d4e9b0af27bd8eb5da3ee49379d83eae567a. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
C
Cesar de la Vega committed
81fcdd244c6be171b8c227059a29dcc5ec5ceee6
Parent: 58d4614
Committed by GitHub <noreply@github.com>
on 8/28/2026, 9:46:19 AM