Manual deploys are bugs waiting to happen. Here's the CI/CD pipeline we built for WlthyWise that made releases boring (in the best way).
The stack:
- GitHub Actions for orchestration
- EAS Build for native compilation
- EAS Submit for store uploads
- CodePush for OTA JS updates
The flow:
- PR merged to main → triggers build
- E2E tests run on Detox
- EAS builds iOS + Android in parallel
- Internal testers get builds via TestFlight / Internal Track
- Tag a release → auto-submit to stores
For JS-only changes, CodePush bypasses the full build cycle entirely. This means bug fixes reach users in minutes, not days.
The game changer: separating "native changes" from "JS changes" in your commit history. We use conventional commits + a script that checks if native/ folders were modified. No native changes? CodePush. Native changes? Full EAS build.
Result: deploy frequency went from weekly to multiple times daily.