Step-by-step guide for cutting, validating, and shipping a React Native plugin release using the automated RC pipeline.
- GitHub: write access to
AppsFlyerSDK/appsflyer-react-native-plugin, ability to run Actions - npm: publish rights for the
react-native-appsflyerpackage - Jira: access to the project for fix-version validation
- Slack: member of the release notification channel
release.yml (RC) ── lint-test-build.yml ───┐
ios-e2e.yml ──────────┤
android-e2e.yml ──────┤
▼
publish RC to npm
create pre-release + PR
│
rc-smoke.yml (auto-triggers)
│
QA adds "pass QA ready for deploy" label
│
promote-release.yml
(strips -rcN suffix)
│
Human merges PR to master
│
release.yml (production)
(publishes to npm @latest)
- Go to Actions > Release > Run workflow. Select
release_type: rc. - Fill in the required inputs:
| Input | Required | Example | Description |
|---|---|---|---|
release_type |
Yes | rc |
Release type (rc or production). |
rn_version |
Yes | 6.18.0-rc1 |
Plugin version. Must match X.Y.Z-rcN format for RC. |
ios_sdk_version |
No | 6.18.0 |
iOS native AppsFlyer SDK version to pin — RC only. |
android_sdk_version |
No | 6.18.0 |
Android native AppsFlyer SDK version to pin — RC only. |
base_branch |
No | development |
Branch to cut the release from (default: development). |
pc_version |
No | 6.15.2 |
PurchaseConnector iOS version override. Leave empty to auto-fetch latest from GitHub. |
skip_unit |
No | false |
Skip Jest + ESLint inside Lint, Test & Build. |
skip_builds |
No | false |
Skip Android + iOS release builds inside Lint, Test & Build. |
skip_e2e |
No | false |
Skip iOS + Android E2E test jobs. Blocks publish if not skipped. |
dry_run |
No | true |
Default is true. Set to false to actually publish to npm. Dry runs still create the branch and PR. |
- Click Run workflow.
Once triggered, the pipeline runs these stages in order:
- Validate inputs -- checks version format, branch existence, and Jira fix version.
- Lint, Test & Build -- Jest tests, ESLint, Android release build, iOS release build.
- Create release branch -- creates
releases/X.Y.Z-rcNfrombase_branchwith version bumps in:package.json(version field;react-native-appsflyer.podspecreads from this)android/build.gradle(Android SDK fallback version)android/.../RNAppsFlyerConstants.java(PLUGIN_VERSION)ios/RNAppsFlyer.h(kAppsFlyerPluginVersion)README.md(SDK version badges)CHANGELOG.md(new entry prepended)
- E2E tests -- iOS and Android E2E suites run on the release branch.
- Publish RC --
npm publish --tag rc(skipped ifdry_runis true). - GitHub pre-release -- created with release notes.
- PR to master -- auto-opened from the release branch.
- Slack notification -- posts to the release channel.
- Smoke tests --
rc-smoke.ymltriggers automatically after the RC workflow succeeds. Installs the RC from npm in a fresh project and runs smoke scenarios. Posts arc-smoke/npmcheck-run on the release branch.
- Wait for the
rc-smoke/npmcheck-run to appear green on the PR. - Install the RC in a test app and validate manually:
npm install react-native-appsflyer@6.18.0-rc1
- Test attribution, deep linking, and any feature changes specific to this release.
- If the RC passes QA, apply the label
pass QA ready for deployto the PR.
If the RC fails QA: fix the issue on development, then cut a new RC with an incremented suffix (e.g., 6.18.0-rc2).
When the pass QA ready for deploy label is applied:
promote-release.ymltriggers automatically.- It verifies
rc-smoke/npmpassed, then strips the-rcNsuffix from all version files on the release branch and commits. - You must manually merge the PR to master. The bot cannot merge (org policy).
When the PR merges to master:
release.ymltriggers automatically (production path).- It publishes to npm with the
latesttag. - Creates a GitHub release (not pre-release).
- Notifies Slack.
# Verify npm
npm view react-native-appsflyer version
# Expected: 6.18.0
# Verify GitHub
# Check https://github.com/AppsFlyerSDK/appsflyer-react-native-plugin/releasesCheck the rc-smoke.yml run logs and the .af-e2e/reports artifacts. Common causes:
- npm registry propagation delay (retry the smoke workflow manually)
- E2E infrastructure flake (re-run the workflow via Actions > RC Smoke > Run workflow)
The smoke workflow hasn't finished or wasn't triggered. Run rc-smoke.yml manually with the RC version and release branch, wait for it to pass, then re-apply the pass QA ready for deploy label.
The published package is valid. Manually complete the failed steps:
- Create the PR from the release branch to master if missing.
- Post to Slack manually.
Fix the root cause (auth, network, version conflict), then re-run the RC workflow with the same version. npm rejects duplicate version+tag combos, so if the version was partially published, you may need to npm unpublish react-native-appsflyer@6.18.0-rc1 first (within 72h) or bump to -rc2.
- Deprecate the bad version:
npm deprecate react-native-appsflyer@6.18.0-rc1 "broken, use 6.18.0-rc2" - Fix the issue on
development. - Cut a new RC with the next suffix (
-rc2).
Check .af-e2e/reports artifacts in the workflow run. E2E failures block npm publish (unless skip_e2e was set). Fix the issue, then either:
- Re-run the failed E2E job from the Actions UI, or
- Cut a new RC if code changes are needed.
The workflow triggers on pull_request: closed to master from releases/* branches. If it didn't fire:
- Verify the PR was merged (not just closed).
- Verify the source branch matched
releases/*. - Use the manual dispatch: Actions > Release > Run workflow, select
productiontype, enter the version.
These files contain version strings. The RC and promote workflows update them automatically. Listed here for manual intervention scenarios.
| File | Field | Updated by |
|---|---|---|
package.json |
"version" |
RC workflow |
react-native-appsflyer.podspec |
s.version (reads from package.json) |
Indirect |
android/build.gradle |
appsflyerVersion fallback |
RC workflow |
android/.../RNAppsFlyerConstants.java |
PLUGIN_VERSION |
RC workflow |
ios/RNAppsFlyer.h |
kAppsFlyerPluginVersion |
RC workflow |
README.md |
SDK version badges | RC workflow |
CHANGELOG.md |
Release entry | RC workflow |