Deployments¶
A deployment is a first-class entity that says: "these devices should receive this artifact, at this percentage, with this rollout seed."
Anatomy¶
| Field | Notes |
|---|---|
artifact |
The firmware to deliver. Required. |
groups |
Zero or more device groups. Members are unioned. |
channels |
Zero or more release channels. Members are unioned. |
percentage |
Integer 0–100. Cohort cutoff. |
rollout_seed |
Auto-generated. Don't change mid-rollout. |
state |
draft, active, paused, completed, cancelled. |
created_at / created_by |
For audit. |
A device is eligible for a deployment when it belongs to at least one of the deployment's groups and/or one of its channels and its hardware is compatible with the artifact.
A device is offered the artifact when, additionally, its cohort
bucket falls below the deployment's percentage.
States¶
stateDiagram-v2
[*] --> draft: create
draft --> active: start
active --> paused: pause
paused --> active: resume
active --> completed: complete
paused --> completed: complete
active --> cancelled: cancel
paused --> cancelled: cancel
draft --> cancelled: cancel
completed --> [*]
cancelled --> [*]
A paused deployment is invisible to devices; checks return as if it
didn't exist. Resuming restores normal behavior; cohort decisions are
preserved because the seed and percentage are unchanged.
Multiple deployments at once¶
You can have many active deployments in a project. The engine simply picks the highest build number among artifacts the device is both eligible for and inside the cohort cutoff for. This naturally handles:
- A 100% deployment of build 41 (the floor) plus a 5% canary of build 42. Devices outside the canary cohort get 41; inside it they get 42.
- A
betachannel deployment of 42 alongside astablechannel deployment of 41. Devices on each channel get the right one.
See Cohorts and rollout math for details.