Framework

React Native CI/CD you can self-host

Metro bundles, Hermes sourcemaps and native builds from one pipeline — with the package manager detected from your own lockfile rather than guessed.

The pipeline, step by step

  • rn/bootstrappackage-manager detection, install, and pod install where needed
  • rn/bundlethe Metro bundle and the Hermes sourcemap
  • rn/testJest
  • ios/buildxcodebuild archive and export
  • android/builda signed app bundle

Every one of these is in the step library, with the credentials it can ask for and whether it may run on a fork’s pull request — generated from the file the server itself reads.

The Hermes sourcemap is an artifact, not a side effect

A Hermes bytecode stack trace is unreadable without the sourcemap produced by the same build. Producing it and discarding it — which is what happens when the build directory is cleaned — turns every production crash into a guess. It is collected per build and uploadable to your crash reporter.

Your package manager, from your lockfile

npm, yarn, pnpm or bun, detected from what is actually in the repository and from packageManager if you set it. Installed with a frozen lockfile by default — drift is a failure rather than a warning, because a build that quietly resolved a different dependency tree is not the build you tested.

The native half is not a black box

The iOS and Android builds are the same typed steps a native project uses, with the same signing model. Which means the signing problem is solved once rather than once per framework, and a React Native project gets the same credential scoping and the same fork safety.

What a build produces

IPA, AAB, dSYM, mapping.txt, the Metro bundle and the Hermes sourcemap.

Symbol files are collected on every build rather than on the ones somebody remembers to configure. A crash report that arrives three weeks later resolving to a memory address is a crash report nobody can act on, and the difference is a build-time decision that cannot be made retroactively.