Release delivery
From commit to announced release
Developer
Continuous integration
Release governance
Production environment
Release communication
Failure and rollback
Change
Build and verify
Promote and observe
Blocking checks
Recovery path
Commit
Signed change
Pull request
Reviewed diff
Build
Locked inputs
reproducible
Quality gates
Test and scan
blocking
Approve
Release owner
human gate
Deploy
Canary 10%
production
Verify
Smoke and SLO
Announce
Status and notes
Stop release
Gate failed
Rollback
Last good image
owner: on-call
merge
healthy
red
unhealthy
restore
diagram.html#The link keeps the view, selection, route and playback.
About this diagram
Steps done by different owners, in order: a release process, an incident runbook, an agent’s tool call.
Ask for one like it
Draw our release process as a workflow, with a lane for rollbacks.
The JSON
{ "kind": "workflow", "title": "Release delivery", "subtitle": "From commit to announced release", "lanes": [ { "id": "dev", "label": "Developer" }, { "id": "ci", "label": "Continuous integration" }, { "id": "approval", "label": "Release governance" }, { "id": "environment", "label": "Production environment" }, { "id": "communication", "label": "Release communication" }, { "id": "exceptions", "label": "Failure and rollback", "tone": "exception" } ], "phases": [ { "id": "change", "label": "Change", "nodes": ["commit", "pull-request"] }, { "id": "verify", "label": "Build and verify", "nodes": ["build", "checks", "failed"] }, { "id": "promote", "label": "Promote and observe", "nodes": [ "approve", "deploy", "verify-prod", "announce", "rollback" ] } ], "groups": [ { "id": "blocking-checks", "label": "Blocking checks" }, { "id": "recovery", "label": "Recovery path", "tone": "security" } ], "nodes": [ { "id": "commit", "type": "client", "lane": "dev", "card": { "title": "Commit", "subtitle": "Signed change" } }, { "id": "pull-request", "type": "client", "lane": "dev", "card": { "title": "Pull request", "subtitle": "Reviewed diff" } }, { "id": "build", "type": "service", "lane": "ci", "group": "blocking-checks", "card": { "title": "Build", "subtitle": "Locked inputs", "tag": "reproducible", "brand": "githubactions" } }, { "id": "checks", "type": "security", "lane": "ci", "group": "blocking-checks", "card": { "title": "Quality gates", "subtitle": "Test and scan", "tag": "blocking" } }, { "id": "approve", "type": "security", "lane": "approval", "card": { "title": "Approve", "subtitle": "Release owner", "tag": "human gate" } }, { "id": "deploy", "type": "gateway", "lane": "environment", "card": { "title": "Deploy", "subtitle": "Canary 10%", "tag": "production", "brand": "kubernetes" } }, { "id": "verify-prod", "type": "service", "lane": "environment", "card": { "title": "Verify", "subtitle": "Smoke and SLO" } }, { "id": "announce", "type": "external", "lane": "communication", "card": { "title": "Announce", "subtitle": "Status and notes" } }, { "id": "failed", "type": "security", "lane": "exceptions", "card": { "title": "Stop release", "subtitle": "Gate failed" } }, { "id": "rollback", "type": "queue", "lane": "exceptions", "group": "recovery", "card": { "title": "Rollback", "subtitle": "Last good image", "tag": "owner: on-call" } } ], "edges": [ { "id": "e1", "from": "commit", "to": "pull-request", "tone": "main" }, { "id": "e2", "from": "pull-request", "to": "build", "label": "merge", "tone": "main" }, { "id": "e3", "from": "build", "to": "checks", "tone": "main" }, { "id": "e4", "from": "checks", "to": "approve", "tone": "main" }, { "id": "e5", "from": "approve", "to": "deploy", "tone": "main" }, { "id": "e6", "from": "deploy", "to": "verify-prod", "tone": "main" }, { "id": "e7", "from": "verify-prod", "to": "announce", "label": "healthy", "tone": "main" }, { "id": "e8", "from": "checks", "to": "failed", "label": "red", "tone": "error" }, { "id": "e9", "from": "verify-prod", "to": "rollback", "label": "unhealthy", "tone": "error" }, { "id": "e10", "from": "rollback", "to": "deploy", "label": "restore", "kind": "return" } ], "views": [ { "id": "happy", "label": "Happy path", "caption": "Every change is reviewed, built once and verified in production before it is announced.", "nodes": [ "commit", "pull-request", "build", "checks", "approve", "deploy", "verify-prod", "announce" ] }, { "id": "stops", "label": "Stop conditions", "caption": "A red gate stops promotion; an unhealthy release rolls back to the last good image.", "nodes": ["checks", "failed", "verify-prod", "rollback", "deploy"] } ], "notes": [ { "title": "One happy path", "items": [ "Every change is reviewed before a reproducible build", "Blocking checks must be green before human approval", "Production is complete only after smoke and SLO verification" ] }, { "title": "Stop conditions", "items": [ "Test or security failure stops promotion", "Production health can reverse a release", "Rollback ownership is visible before an incident" ] } ]}