ci(renovate): let the Expo SDK lead, and the family follow via expo install --fix #16
No reviewers
Labels
No labels
dependencies
major
security-pin
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
trails-cool/trails!16
Loading…
Reference in a new issue
No description provided.
Delete branch "ci/renovate-expo-sdk"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Renovate's first dashboard (#12) proposed ~16 individual Expo bumps —
expo, 18expo-*packages, and@expo/metro-runtimeto v57. Every one is unmergeable on its own: the SDK pins the whole native family throughbundledNativeModules.json, and CI never compiles native code, so nothing catches the breakage. That is exactly how theexpo-modules-coremacro mismatch got in in June 2026.The community consensus is that Renovate and Expo genuinely fight — Expo wraps npm with
expo install, and the family has to move together. So rather than fight it, this models the real workflow: expo leads, everything else follows via--fix.Changes
The SDK-managed family is disabled for individual updates:
/^expo-/,@expo/metro-runtime,/^react-native/,@sentry/react-native,jest-expo.@expo/metro-runtimeis new to this list — it was being proposed to v57 while the SDK is on 56, and the old Dependabot config never covered it either.expoitself stays enabled, with a postUpgradeTask runningpnpm --filter @trails-cool/mobile exec expo install --fix. That rewrites the whole family to the versions the new SDK pins, so a bump and its fallout land as one coherent PR instead of sixteen. Added to the globalallowedCommands(anchored), since postUpgradeTasks silently no-op without it.Expo majors get
dependencyDashboardApproval. An SDK major is a project — upgrade guide, native rebuild, EAS credits — so it should open only when deliberately ticked, not appear unbidden on a Monday.reactremains deliberately excluded from the disable list: the web apps own its version through the workspace catalog.Caveat, recorded in the config itself
A green PR here proves the JS side only. CI does not compile native code, so an SDK bump still needs an EAS build before merge — which lines up with the existing policy of only spending EAS credits when native deps actually change.
Validated with
renovate-config-validator: Config validated successfully.Extended to the whole
@expo/scope after a good question — naming@expo/metro-runtimeindividually missed the rest of it.The authoritative source is
expo/bundledNativeModules.jsonin the installed SDK. For SDK 56 it pins 121 packages, four of them under@expo/:@expo/fingerprint~0.19.4^0.20.3← already off-pin@expo/metro-runtime~56.0.15^56.0.15✓@expo/ui~56.0.18@expo/vector-icons^15.0.2The rule now matches
/^@expo\//so a newly-added@expo/*is covered by default instead of drifting until someone notices — which is exactly what happened with fingerprint.A decision for you:
@expo/fingerprintIt is SDK-managed and already ahead of its pin, and Renovate had it queued in the
developmentgroup, which would have pushed it further still.How it got there: commit
3da7b8d— "Fix lockfile sync: add @expo/fingerprint to root devDependencies" — and nothing in the codebase imports it. It is a phantom direct dependency added to satisfy lockfile resolution, which is why its version was never aligned to the SDK.I have deliberately not touched it, because there are three defensible answers and the choice is yours:
~0.19.4— matches the SDK and keepsexpo-doctorquiet, but may reintroduce whatever lockfile-sync problem3da7b8dwas fixing.pnpm install --frozen-lockfile.My inclination is (2) then (1) as fallback, but it wants verifying rather than guessing. Happy to test it if you want.