All guides

Releases: the gate before a deploy

A release is a record and a set of gates - checks, approvals, a backup - that a change passes before anyone deploys it. What each gate does, and where the process stops.

Verified on August 14, 2026

Deploying to production from a button is fine until the day it is not. The Releases tab on an instance is the other way: a change becomes a release, the release passes gates, and the whole passage is written down.

Be clear about the boundary first. This tab prepares a deploy and stops at ready to deploy. It does not deploy anything itself — that is still the environment's own Deploy button, covered by the guide on deploying from Git. What you get here is everything that should happen before that click, and a record of who let it through.

The policy decides everything else

Before any of it means anything, there is a release policy — one per environment kind, not per environment. It answers five questions, and the rest of the tab simply obeys.

The release policy panel: backup required, one approval, self-approval blocked, catalog and health checks required, rollback and data restore allowed.
The policy is the rule; every release afterwards is just the rule being applied.

The defaults are not the same everywhere:

ProductionStaging and development
Backup before deployrequirednot required
Approvals10
Self-approvalblockedallowed
Catalog checksrequiredrequired
Health checksrequirednot required

An environment is classified by its key: anything containing prod counts as production, anything with stag as staging, dev as development — and anything unrecognised is treated as staging, not as production. Worth knowing when you name an environment something creative.

Creating a release

A release names a source, a target, and the commit that is moving. The source is optional: with none, the release is manual and you supply the branch yourself. With one, the platform resolves the commit that environment is actually running, which is what makes "promote staging to production" mean something exact rather than "whatever is on the branch right now".

A title and a description are optional too; leave them empty and the release is titled from the two environments.

The checks, and which of them can stop you

Run checks puts the release through seven automated checks. Each returns a status — passed, warning, failed or skipped — and, separately, a severity.

The checks panel: git integrity, catalog dependencies, environment health, billing status and security all passed, with the backup readiness check raising a warning.
Status and severity are two different things. Only a failed BLOCKER stops the release.

Those two words together are the whole logic: a release is blocked only when a check that is failed is also a blocker. A failed warning-level check does not stop anything — it is there to be read.

Three of the checks are switched by policy: catalog dependencies, environment health, and backup readiness. When policy turns one off it is not silently dropped — it is recorded as skipped, with the environment it was skipped for. A check that did not run and a check that passed must never look alike.

Approvals, and why you may not approve your own

If the policy asks for approvals, the release stops at waiting approval and nothing moves until a person acts.

A release card at "waiting approval", showing the branch and commit, source, target and author, its history so far, and the Approve button.
The one state where the screen is asking you for something rather than telling you something.

On production, self-approval is blocked by default: the person who created the release cannot approve it. Attempting it is refused, not quietly ignored. That single rule is most of what a release process is for — it puts a second pair of eyes between a change and the customers who will meet it.

A rejection takes a reason. Approvals are counted, and the release only becomes approved once the policy's count is reached.

The backup step

When the policy requires a backup, an approved release does not go straight to ready — it waits for one. Trigger backup takes it, and the release moves on when the backup is done.

This is the same backup machinery described in the backups guide, with the same caveat about what a copy is worth: a backup you have never restored is a belief. What the release adds is that the copy is tied to this release, so afterwards you can tell which backup belongs to which change.

Where it ends, and what to do next

The pipeline is: draft → checking → blocked or waiting approval → approved → backup running → ready to deploy. Every step is recorded as a transition with its reason, its actor and its time, and the card shows the chain. That history is the reason to use this tab at all: months later it answers "who approved this, and what did the checks say" without anybody having to remember.

At ready to deploy the tab has done its job. Deploy from the environment, then come back if you need the record.

Two more things on the card are worth knowing. Clone as draft copies a release into a fresh draft — the fastest way to re-run something after a blocker was fixed, without retyping it. And the policy also states whether rolling back and restoring data are permitted for this environment, so the rules are written in one place even though those buttons live elsewhere.

The tab needs builds.view to open. Rolling back a deployment needs deployments.rollback, which the developer role has and a viewer does not.