ci: run Expo build intelligently — scoped bundle check + reserved native build#1029
Conversation
Replace the single per-PR native EAS build with two workflows: - expo-bundle.yml: fast local `expo export` Metro bundle check, path-scoped to the types/client/react-core/react-native/expo dependency chain. No EXPO_TOKEN or EAS credits. - expo-native.yml: full native EAS build reserved for push to main, workflow_dispatch, and PRs labeled `expo:native-build`. Closes KNO-14076.
|
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a610498. Configure here.
…n builds An unrelated `labeled` event on the same PR spun up a run in the same concurrency group and, via cancel-in-progress, killed an in-flight opt-in EAS build before its job's if-guard skipped it. Add the label/event as a group discriminator so only matching runs coalesce. Addresses comment by @cursor: unrelated labels cancel native build.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1029 +/- ##
=======================================
Coverage 64.49% 64.49%
=======================================
Files 212 212
Lines 10217 10217
Branches 1389 1389
=======================================
Hits 6589 6589
Misses 3603 3603
Partials 25 25 |

What & why
The Expo build (
expo.yml) ran a full native Android EAS cloud build on every PR, with no path filter — ~10–25 min plus EAS queue/credits, so it was usually stale by the time anyone looked, and it ran on PRs that couldn't possibly affect the Expo/RN packages.This splits it into two workflows so it runs intelligently — only when something in the Expo/React Native dependency chain changes, and with the cheap-but-effective check on PRs.
Closes KNO-14076.
Dependency chain (the only packages that can break the Expo app)
@knocklabs/react(web-only), the other examples, and the*-configpackages are not in the chain.Changes
expo-bundle.yml— per-PR fast check (new)pull_requestonly when the dependency chain changes (path-filtered), plusworkflow_dispatch.expo export(Metro bundle). Because@knocklabs/expore-exports all of@knocklabs/react-nativeand both expose a"react-native"export condition pointing at source, Metro bundles the RN/expo source the example renders — so an upstreamclient/react-corechange that breaks how react-native/expo bundle surfaces here.EXPO_TOKEN, no EAS credits, ~2–3 min.expo-native.yml— full native EAS build, reserved (new)main(path-scoped, post-merge native signal),workflow_dispatch, and PRs labeledexpo:native-build(opt-in for a risky PR).previewEAS profile (internal distribution, no autoIncrement).expo.yml— removed (superseded by the two above).Coverage
cicd.yml(build:packages+type:check, every PR — already)expo-bundle.yml(this PR)expo-native.ymlon merge tomain(this PR)