Release delivery

From commit to announced release

Workflow10 nodes · 10 connections

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.

Read about workflow diagrams

The JSON

release-delivery/diagram.json224 lines
{  "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"      ]    }  ]}

More workflow examples

All examples