Deploying

revenexx deploy app end to end — what the five steps do, every flag, targeting an environment, git-wired versus tarball, and why there is no apps register step.

One command takes an app directory to a live capability. Where the platform reviews releases, it goes live once the release is approved.

Terminal
revenexx deploy app

Run it from the app directory — the one containing manifest.json.

The five steps

  1. Register if new — finds the app by name, or creates it.
  2. Upload — packs the directory and uploads it.
  3. Build — the platform builds the deployment and waits for it.
  4. Publish — makes the version available in the Marketplace.
  5. Install — installs it on the target tenant.

Where the platform reviews releases, the command checks the release round (the platform's review of this upload) after the build. Steps 4 and 5 run only once the release is approved. If it is still in review, the command stops after the build and prints a resume command. See When the release waits for approval.

The build is where your declarations are applied: the schema diff runs, the capabilities are registered, and the publish-time rules are checked. The install is where your routes are written — see Publish and install.

The entrypoint is src/main.js.

Flags

FlagPurpose
[dir]App directory (must contain manifest.json). Defaults to the current directory.
--function-id <id>Deploy to an existing app, skipping find-or-create by name.
--deployment-id <id>Finish an existing deployment instead of uploading a new one: skips packaging and upload, waits for its build, then runs the remaining steps. The resume command a held release prints uses it.
--runtime <runtime>Runtime for a first-time registration. Default node-25.
--specification <spec>Compute specification for a first-time registration.
--owner <tenant>Tenant to install on. Defaults to the active tenant.
--no-publishSkip the Marketplace publish.
--no-installSkip the install.
--timeout <seconds>How long to wait for the platform build. Default 600.
--release-wait <seconds>How long to wait after the build for the release round to be approved or rejected. Default 120.

--runtime and --specification apply only to a first-time registration. Passing them to an existing app does nothing — changing the runtime or the compute size of a registered app is done on the app itself, in App Studio, not on a deploy.

Run revenexx deploy app --help for the live list.

Bump the version first

Every successful build needs a version nobody has used before, so the bump is part of the deploy:

Terminal
# 1. bump `version` in manifest.json
# 2. regenerate, if the schema changed:
revenexx apps capabilities --write
revenexx apps generate
npm test
# 3. deploy
revenexx deploy app

See Versioning.

Targeting an environment

There is no --env flag. You scope a deploy by selecting the tenant first:

Terminal
revenexx tenants use acme-staging
revenexx deploy app

# verify, then:
revenexx tenants use acme-production
revenexx deploy app

The last tenants use stays saved: afterwards every repo on your machine deploys to acme-production until you switch back, and REVENEXX_TENANT or a tenant: in .revenexx.yaml won't change that. To target one deploy without saving anything, pass the flag instead: revenexx deploy app --tenant acme-staging. See how the tenant resolves.

--owner <tenant> changes only the tenant the install runs on; the upload and the build still go to the tenant the CLI resolved. A CI job names the tenant for that one command with --tenant, and for the install with --owner:

CI
revenexx login --token "$REVENEXX_API_KEY" --tenant "$REVENEXX_TENANT"
revenexx deploy app --tenant "$REVENEXX_TENANT" --owner "$REVENEXX_TENANT" --timeout 900 --json

A release still in review ends the command without an error and with nothing published, so a CI job that checks only the exit code goes green. With --json, read published and installed instead (both false while the release waits), then release.state, which is null when no round is recorded; see In CI.

Always deploy to a tenant with real-shaped data before production. A mock adapter cannot tell you that a new notNull column will not apply to a populated table.

Never run deploy app on a git-wired app

If an app's deployments come from a connected repository, revenexx deploy app will still work — it uploads a tarball, and the active deployment loses its commit association. The app keeps running; the link between what is deployed and what is in git is gone.

Pick one path per app:

PathHow a version shipsWhen it is right
CLI tarballrevenexx deploy app from a directoryLocal development, a private app you deploy by hand, a CI job that runs the CLI
Git-wiredPush to the connected branchAn app whose repository is the record of what is deployed

Mixing them is the failure: after one CLI deploy onto a git-wired app, nobody can tell which commit production is running.

If it has already happened, the fix is to redeploy from the connected branch so the association is re-established. Nothing is lost except the audit trail for that one version.

There is no apps register step

revenexx apps register --manifest manifest.json does not work. That command needs a function-id and a runtime, neither of which an app manifest carries, so it fails whatever you pass it.

Registration is the first step of revenexx deploy app and needs no separate command.

If you do reach for the lower-level commands, note that they are revenexx apps <verb> with no apps- prefix on the verb — revenexx apps create-deployment, revenexx apps list-deployments, revenexx apps publish. See the apps command reference.

When the deploy fails

SymptomUsually
Rejected before the buildA publish-time rule — a vendor/app key, a summary over 255 characters, an undeclared tag, a claimed global name
Build fails on the schemaA notNull column with no default on a populated table (without a release round), a type change, a changed generated expression, or a cross-app foreign key. See Migrations
Build times outRaise --timeout; the default is 600 seconds
Build succeeds, the route still 404sThe install step did not run (it was skipped, or the release is still waiting for approval). Routes are written at install time
Version rejectedversion in manifest.json was already used. Bump it
The command fails with release <version> rc <n> was rejected: <reason> — publish and install did NOT runThe release round was rejected for the reason after the colon, and publish and install did not run. Fix it and deploy again
Build succeeds, the command warns the build is not live yetThe release round is still in review or not recorded yet: publish and install did not run. Check with revenexx release status, then run the resume command the warning printed

A release checklist

  1. Bump version in manifest.json, honestly.
  2. Validate the JSON files against https://schemas.revenexx.com/… — your editor does this if you set $schema. See Validate.
  3. Regenerate: revenexx apps capabilities --write and revenexx apps generate. Commit the diff.
  4. Run the app's tests against the mock adapter, then once against a dev tenant with the remote adapter for the fidelity a mock cannot give you. See Testing.
  5. revenexx tenants use <staging> and revenexx deploy app. If it warns that the release is waiting, check revenexx release status and run the resume command it printed once the release is approved.
  6. Call /defaults, then exercise the new capabilities against the staging tenant. See Verifying live.
  7. Open the app in the Cockpit: views render, existing data survived, no console errors.
  8. revenexx tenants use <production> and revenexx deploy app, finishing a held release as in step 5.
  9. Repeat step 6 against production.

Next steps

Was this page helpful?