Deploying
One command takes an app directory to a live capability. Where the platform reviews releases, it goes live once the release is approved.
revenexx deploy app
Run it from the app directory — the one containing manifest.json.
The five steps
- Register if new — finds the app by name, or creates it.
- Upload — packs the directory and uploads it.
- Build — the platform builds the deployment and waits for it.
- Publish — makes the version available in the Marketplace.
- 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
| Flag | Purpose |
|---|---|
[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-publish | Skip the Marketplace publish. |
--no-install | Skip 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:
# 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:
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:
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:
| Path | How a version ships | When it is right |
|---|---|---|
| CLI tarball | revenexx deploy app from a directory | Local development, a private app you deploy by hand, a CI job that runs the CLI |
| Git-wired | Push to the connected branch | An 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
| Symptom | Usually |
|---|---|
| Rejected before the build | A publish-time rule — a vendor/app key, a summary over 255 characters, an undeclared tag, a claimed global name |
| Build fails on the schema | A 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 out | Raise --timeout; the default is 600 seconds |
Build succeeds, the route still 404s | The install step did not run (it was skipped, or the release is still waiting for approval). Routes are written at install time |
| Version rejected | version in manifest.json was already used. Bump it |
The command fails with release <version> rc <n> was rejected: <reason> — publish and install did NOT run | The 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 yet | The 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
- Bump
versioninmanifest.json, honestly. - Validate the JSON files against
https://schemas.revenexx.com/…— your editor does this if you set$schema. See Validate. - Regenerate:
revenexx apps capabilities --writeandrevenexx apps generate. Commit the diff. - Run the app's tests against the mock adapter, then once against a dev tenant with the
remoteadapter for the fidelity a mock cannot give you. See Testing. revenexx tenants use <staging>andrevenexx deploy app. If it warns that the release is waiting, checkrevenexx release statusand run the resume command it printed once the release is approved.- Call
/defaults, then exercise the new capabilities against the staging tenant. See Verifying live. - Open the app in the Cockpit: views render, existing data survived, no console errors.
revenexx tenants use <production>andrevenexx deploy app, finishing a held release as in step 5.- Repeat step 6 against production.
Next steps
- Publish and install — what steps four and five really do.
- Verifying live — the calls to make afterwards.
- Operating — the deployment and execution screens.
- Scaffolding —
createanddeployin the CLI reference. - Deploy and verify an App — the same path as a walkthrough.