Our products run at 99.99% uptime, and releases go out multiple times a week. Those two facts only coexist because deployments are boring by design. This is the checklist that makes them boring.
Before the Release
- Automated tests gate the pipeline. Nothing reaches staging with a red build — no exceptions, including “tiny” changes.
- Database migrations are backwards-compatible. Add columns before you use them; remove them a release after you stop. The old code must always run against the new schema.
- Feature flags wrap risky changes. Deploying code and releasing features are separate events. Flags let us turn functionality on for 5% of users first.
During the Release
We deploy the new version alongside the old one, run health checks against it, then shift traffic gradually. If error rates or latency move beyond thresholds, traffic shifts back automatically — no human needs to notice at 2 AM for the rollback to happen.
After the Release
- Watch the four golden signals — latency, traffic, errors, saturation — for thirty minutes.
- Tag the release so any regression report maps instantly to a diff.
- Post a one-line summary in the team channel: what shipped, what to watch.
The Cultural Part
Checklists fail without a blameless culture around them. When an incident happens, the retrospective asks what the system allowed, not who pressed the button. Teams that fear deploys batch changes; big batches cause big failures. Small, frequent, boring releases are the whole secret.