do-release-checklist
When to use
You are shipping to production and want a repeatable checklist that reduces risk, or you are formalizing an ad-hoc deploy into canary + rollback + communication steps.
Not for: the incident response after something breaks (use do-incident-runbook), the CI that produces the artifact (use do-ci-pipeline), or infra changes (use do-terraform).
Method
- Pre-flight: confirm CI is green on the exact commit, migrations are backward-compatible, feature flags default safe, config/secrets are in place, and on-call is aware.
- Choose a progressive strategy. Decision: canary when you can route a fraction of traffic; blue/green when you need instant full cutover and rollback. Define the exposure ramp (1% -> 10% -> 50% -> 100%) with a bake time per step.
- Pre-declare rollback triggers before you start: the metrics (error rate, latency, SLO burn), their thresholds, and who has authority to call the abort. Decision: any threshold breach at any step aborts — do not renegotiate mid-rollout.
- Make rollback one action: keep the previous artifact hot, script the revert, and rehearse that migrations and flags roll back cleanly.
- Communicate: announce start/steps/completion in the agreed channel, note the change window, and record what shipped and the deploy ID.
- Post-release: watch dashboards through the bake, verify key user journeys, and close with a short release note.
Example
release: checkout v2.4.0 (commit a1b2c3d, deploy-id 2026-07-11-01)
preflight:
- ci_green_on_commit: a1b2c3d
- migration_backward_compatible: true
- flags_default_safe: true
ramp: # bake + gate at each step
- { traffic: 1%, bake: 10m }
- { traffic: 10%, bake: 15m }
- { traffic: 50%, bake: 15m }
- { traffic: 100%, bake: 30m }
rollback_triggers: # any breach -> abort
- error_rate: "> 1%"
- p99_latency: "> 400ms"
authority: on-call lead
rollback_cmd: kubectl rollout undo deploy/checkout
Pitfalls
- Deciding rollback thresholds mid-incident under pressure — you rationalize a bad rollout instead of aborting.
- A non-backward-compatible migration shipped before the code, so the moment you roll back the app the old code hits a schema it cannot read.
- Ramping straight to 100% with no bake time, giving no window to catch regressions on real traffic.
- No comms, so stakeholders and on-call learn about the deploy from the alert page.
Output format
Checklist grouped: Pre-flight / Rollout / Rollback / Comms / Post-release.
Canary ramp:
| step | traffic % | bake time | health gate |
Rollback:
- triggers + thresholds (pre-declared)
- authority: <who calls abort>
- one-line revert: <command>
1---2name: do-release-checklist3description: Build a production release checklist covering pre-flight gates, canary ramp, pre-declared rollback triggers, and stakeholder comms.4---56# do-release-checklist78## When to use910You are shipping to production and want a repeatable checklist that reduces risk, or you are formalizing an ad-hoc deploy into canary + rollback + communication steps.1112**Not for:** the incident response after something breaks (use do-incident-runbook), the CI that produces the artifact (use do-ci-pipeline), or infra changes (use do-terraform).1314## Method15161. Pre-flight: confirm CI is green on the exact commit, migrations are backward-compatible, feature flags default safe, config/secrets are in place, and on-call is aware.172. Choose a progressive strategy. Decision: canary when you can route a fraction of traffic; blue/green when you need instant full cutover and rollback. Define the exposure ramp (1% -> 10% -> 50% -> 100%) with a bake time per step.183. Pre-declare rollback triggers before you start: the metrics (error rate, latency, SLO burn), their thresholds, and who has authority to call the abort. Decision: any threshold breach at any step aborts — do not renegotiate mid-rollout.194. Make rollback one action: keep the previous artifact hot, script the revert, and rehearse that migrations and flags roll back cleanly.205. Communicate: announce start/steps/completion in the agreed channel, note the change window, and record what shipped and the deploy ID.216. Post-release: watch dashboards through the bake, verify key user journeys, and close with a short release note.2223## Example2425```yaml26release: checkout v2.4.0 (commit a1b2c3d, deploy-id 2026-07-11-01)27preflight:28 - ci_green_on_commit: a1b2c3d29 - migration_backward_compatible: true30 - flags_default_safe: true31ramp: # bake + gate at each step32 - { traffic: 1%, bake: 10m }33 - { traffic: 10%, bake: 15m }34 - { traffic: 50%, bake: 15m }35 - { traffic: 100%, bake: 30m }36rollback_triggers: # any breach -> abort37 - error_rate: "> 1%"38 - p99_latency: "> 400ms"39 authority: on-call lead40rollback_cmd: kubectl rollout undo deploy/checkout41```4243## Pitfalls4445- Deciding rollback thresholds mid-incident under pressure — you rationalize a bad rollout instead of aborting.46- A non-backward-compatible migration shipped before the code, so the moment you roll back the app the old code hits a schema it cannot read.47- Ramping straight to 100% with no bake time, giving no window to catch regressions on real traffic.48- No comms, so stakeholders and on-call learn about the deploy from the alert page.4950## Output format5152```53Checklist grouped: Pre-flight / Rollout / Rollback / Comms / Post-release.5455Canary ramp:56| step | traffic % | bake time | health gate |5758Rollback:59- triggers + thresholds (pre-declared)60- authority: <who calls abort>61- one-line revert: <command>62```