Release Management
Plan, approve, deploy, and roll back releases; group change requests into a release; track ITIL release phases and a release calendar.
Overview
A releasegroups one or more change requests into a single deployable unit — e.g. "v2.4.0 to production" — with its own approval, deployment, and rollback lifecycle, optional ITIL release phases with checklists, and a calendar view. Releases are stored in their own releases collection and referenced back from ChangeRequest.releaseId.
Model Fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| number | string | required | auto (REL-NNNN) | Human-readable identifier, generated on create. |
| name | string | required | — | Display name of the release. |
| version | string | required | — | Version identifier, e.g. "2.4.0". |
| type | enum | required | — | major · minor · patch · hotfix |
| environment | string | required | — | Target environment, e.g. "production". |
| status | enum | optional | planned | planned · in_progress · deployed · rolled_back · cancelled |
| plannedDate | date | optional | — | Planned release date, used by the release calendar. |
| actualDate | date | optional | — | Set automatically to now() when deployed. |
| linkedChangeIds | ObjectId[] | optional | [] | Change requests included in this release (ref ChangeRequest). |
| releaseManagerId | ObjectId | optional | creating user | Owner of the release (ref User). Set to the creator automatically if their id is a valid ObjectId. |
| deployedBy / deployedAt | ObjectId / date | optional | — | Set by the /deploy action. |
| approvedBy / approvedAt | ObjectId / date | optional | — | Set by the /approve action. |
| releaseNotes | string | optional | — | Notes describing what’s in the release. |
| successCriteria | string | optional | — | How success will be measured post-deploy. |
| rollbackPlan | string | optional | — | Plan to revert if the release fails. |
| phases | IReleasePhase[] | optional | [] | ITIL release phases — see below. |
| createdAt / updatedAt | timestamp | optional | auto | Managed by the record. |
Release phase fields (phases[])
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| name | string | required | — | Phase name, e.g. "Build", "Staging validation", "Go-live". |
| description | string | optional | — | What happens in this phase. |
| status | enum | optional | pending | pending · in_progress · completed · skipped |
| plannedStart / plannedEnd | date | optional | — | Planned window for the phase. |
| actualStart / actualEnd | date | optional | — | Actual window, set via the phase update endpoint. |
| assignedTo | string | optional | — | Owner of the phase. |
| checklist | { item, completed }[] | optional | [] | Checklist items for the phase. |
Lifecycle
- •
planned— Default status on create. - •
in_progress— Not set automatically by any action; available as a manual status viaPATCH, and accepted by/deployas a starting state. - •
deployed— Set by/deploy, only fromplannedorin_progress. SetsdeployedBy,deployedAt, andactualDate. - •
rolled_back— Set by/rollback, only fromdeployed. - •
cancelled— Manual status viaPATCH; no dedicated action endpoint.
/approve only transitions a release currently in planned status; it sets approvedAt/approvedBy but does not itself change status.
POST /api/releases
{
"name": "Checkout service v2.4.0",
"version": "2.4.0",
"type": "minor",
"environment": "production",
"plannedDate": "2026-10-01T02:00:00.000Z",
"releaseNotes": "Adds saved payment methods, fixes cart total rounding.",
"rollbackPlan": "Redeploy previous image tag 2.3.6 via the deploy pipeline."
}
# Approve
POST /api/releases/:id/approve
# Deploy
POST /api/releases/:id/deploy
# Roll back after a deployed release
POST /api/releases/:id/rollbackLinking Change Requests to a Release
A ChangeRequest carries its own releaseId field pointing back at the release it belongs to. Adding a change to a release sets that change’s releaseId and adds the change to the release’s linkedChangeIds array; removing it clears both sides. Listing a release’s changes matches on either direction of the link (a change with releaseId equal to the release, or an id present in linkedChangeIds), so the two are kept in sync by the add/remove endpoints but read defensively.
See Change Management for the full change request field reference.
# List changes in a release
GET /api/releases/:id/changes
# Add a change to a release
POST /api/releases/:id/changes
{ "changeId": "665f1a2b3c4d5e6f7a8b9c0d" }
# Remove a change from a release
DELETE /api/releases/:id/changes/:changeIdPhases & Calendar
Phases can be appended to a release and updated individually (status, actual start/end, assignee, checklist). GET /api/releases/calendar returns every release whose plannedDate or actualDate falls in the given month, grouped by date, for calendar-style rendering.
release.created, release.updated, release.approved, release.deployed, release.rolled_back) that can trigger workflows.API Quick Reference
/api/releasesList releases. Query: status, environment, type
/api/releasesCreate a release (requires name, version, type, environment)
/api/releases/:idGet a release with populated manager, deployer, approver, and linked changes
/api/releases/:idUpdate release fields
/api/releases/:id/approveApprove (from planned)
/api/releases/:id/deployDeploy (from planned or in_progress)
/api/releases/:id/rollbackRoll back (from deployed)
/api/releases/:idDelete a release
/api/releases/:id/changesList change requests linked to the release
/api/releases/:id/changesLink a change request to the release (body: { changeId })
/api/releases/:id/changes/:changeIdUnlink a change request from the release
/api/releases/:id/phasesAdd a phase (body: { name, description?, plannedStart?, plannedEnd?, assignedTo?, checklist? })
/api/releases/:id/phases/:phaseIndexUpdate a phase’s status, actual dates, assignee, or checklist
/api/releases/calendarReleases for a given month, grouped by date. Query: year, month