Skip to content

CI/CD overview

Aether ships over-the-air updates to React Native apps. Wiring it into CI means a merge to your main branch publishes a release, instead of someone running the CLI by hand.

Every pipeline in these guides does the same four things:

  1. Installs a pinned version of @aetherpush/cli.
  2. Logs in with a deploy-scoped API key.
  3. Runs aether release-react to bundle the app and upload the release.
  4. On GitLab, CircleCI, Jenkins, and Bitrise, filters that file before uploading it.

The release command is the same on every platform:

Terminal window
aether release-react "my-react-native-app" android \
--deploymentName "Staging" \
--rollout "100%" \
--json > release.json

--deploymentName picks the channel clients pull from. --rollout sets the share of clients eligible for the release. --json prints the full server response, including signed download URLs. The GitLab, CircleCI, Jenkins, and Bitrise templates then keep eight fields in the uploaded file: label, packageHash, size, appVersion, releaseMethod, rollout, isMandatory, and isDisabled. The GitHub Action maps the full --json object to step outputs and does not upload that file.

The guides set up two deployments on the same Aether app:

  • Staging deploys automatically on merge, at 100% rollout. Internal builds and testers track this channel.
  • Production sits behind a manual gate, at 25% rollout. The pipeline pauses until someone approves, then releases to a quarter of clients.

Staging and Production are deployment channels, not separate servers. Both run against the same Aether server, which is the CLI’s built-in production endpoint unless you override it.

CI authenticates with an API key scoped to deploy only. Create it in the dashboard, under API Keys.

The key is a long-lived credential a machine can use without a login session. It is the one secret each pipeline needs. Scoping it to deploy limits the damage if it leaks: the key can publish releases and nothing else. Prerequisites covers how to create and store it.

Do not use a session access key (created under Account → CLI access keys in the dashboard) in CI. Those are tied to a user session, expire after 60 days, and stop working when the owner resets their password.

Each guide is self-contained. Start with Prerequisites, then follow the one for your CI system:

The configs these guides are built from are maintained outside this repo:

  • GitLab CI, CircleCI, Jenkins, and Bitrise: aether-cli/examples/ci/ (gitlab-ci.yml, circleci-config.yml, Jenkinsfile, bitrise.yml).
  • GitHub Actions: the aetherpush-deploy-action repository (action.yml and its README).

When those change, update these docs to match. The upstream file is the source of truth.