Skip to content

ci: smoke both iOS flavors on a real device - #9

Merged
gmaclennan merged 1 commit into
recipefrom
ci/ios-lite-real-device-smoke
Aug 22, 2026
Merged

ci: smoke both iOS flavors on a real device#9
gmaclennan merged 1 commit into
recipefrom
ci/ios-lite-real-device-smoke

Conversation

@gmaclennan

Copy link
Copy Markdown
Member

real-device-smoke-ios fetches the nodejs-mobile-ios artifact — the full flavor — and lite's only device-class coverage is curated-tests-ios, which runs on a simulator. A simulator is a macOS process and is not subject to the address-space limits a real iOS process is, so that pairing cannot tell you whether a flavor boots on hardware.

That is not hypothetical: 24.19.0-1 shipped an iOS lite build that aborts during Isolate init on every physical device, with every simulator leg green. #8 fixes the build; this closes the hole that let it out.

What changes

The iOS leg gets a flavor matrix defaulting to both, in the shape ios-simulator-tests.yml already uses — an ios_flavors JSON-array input, fromJSON'd into strategy.matrix, and FLAVOR_SUFFIX selecting the per-flavor artifact (nodejs-mobile-ios / nodejs-mobile-ios-lite, both of which already carry include/, so the crc-native addon build needs no change).

fail-fast is off: which flavors boot on hardware is the signal, so both should report rather than one cancelling the other. The build tag gains the flavor (sha-<sha>-<flavor>) because both legs upload to the same BrowserStack project and an untagged pair is indistinguishable in the dashboard.

publish already needs: this job, so a lite build that cannot start on a device now blocks the release rather than shipping.

Cost

None on PRs — the job is gated on release-check and only runs on release and release-dryrun: pushes. On those it adds one iOS device build, on the same single-device default (iPhone 15-17). That is the one genuinely metered resource here, so to be explicit about the trade: the flavor a consumer actually ships is the one that has to be proven on hardware, and full-only coverage bought us a broken release.

Scope

Android stays full-only. Its lite flavor has the same structural blind spot — it is emulator-tested only, and it is pointer-compressed — but an emulator is a much closer proxy to an Android device than a simulator is to an iPhone, so widening it is a separate call rather than something to slip into this PR.

Sequencing

Merge after #8. Nothing breaks if this lands first — the job does not run on a plain push to recipe, since the version of record is still tagged and release-check reports no release — but the next release run would go red on the new lite leg until #8 is in. Verified with actionlint: no new findings (the one it reports is pre-existing, in the Android gradle step).

real-device-smoke-ios fetched the nodejs-mobile-ios artifact -- the full
flavor -- and lite's only device-class coverage was curated-tests-ios on a
simulator. A simulator is a macOS process and is not subject to the
address-space limits a real iOS process is, so that pairing cannot tell
you whether a flavor boots on hardware. 24.19.0-1 shipped an iOS lite
build that aborts during Isolate init on every physical device with every
simulator leg green.

Give the iOS leg a flavor matrix, defaulting to both, in the shape
ios-simulator-tests.yml already uses: an ios_flavors JSON-array input,
fromJSON'd into strategy.matrix, and FLAVOR_SUFFIX selecting the
per-flavor artifact. fail-fast is off because which flavors boot is the
signal, and the build tag carries the flavor so the two BrowserStack
builds are distinguishable.

This only costs device minutes on release and dry-run pushes, where the
job is already gated -- it never runs on a PR. Android stays full-only;
its lite flavor has the same blind spot but the emulator is a closer
proxy there, and widening it is a separate call.

Publish already needs: this job, so a lite build that cannot start on
hardware now blocks the release instead of shipping.
@gmaclennan
gmaclennan merged commit 5225302 into recipe Aug 22, 2026
34 checks passed
@gmaclennan
gmaclennan deleted the ci/ios-lite-real-device-smoke branch August 22, 2026 22:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant