Skip to content
Weave templates

CI/CD Pipeline (Swimlanes)

Five lanes — developer, CI, artefacts, CD and environments — carrying a change from a pull request through signed images and a manual gate to production, with canary smoke tests and automated rollback.

Template previewWeave
Rendering…

Make it your own.

{
  "nodes": [
    { "id": "l1", "type": "swimlane", "label": "Developer",           "x": 20, "y": 20,  "width": 1020, "height": 150, "fill": "rgba(224,242,254,0.35)", "stroke": "#0369a1" },
    { "id": "l2", "type": "swimlane", "label": "CI — build & test",   "x": 20, "y": 190, "width": 1020, "height": 150, "fill": "rgba(219,234,254,0.35)", "stroke": "#1d4ed8" },
    { "id": "l3", "type": "swimlane", "label": "Artefacts",           "x": 20, "y": 360, "width": 1020, "height": 150, "fill": "rgba(254,243,199,0.35)", "stroke": "#b45309" },
    { "id": "l4", "type": "swimlane", "label": "CD — Argo CD",        "x": 20, "y": 530, "width": 1020, "height": 150, "fill": "rgba(237,233,254,0.35)", "stroke": "#6d28d9" },
    { "id": "l5", "type": "swimlane", "label": "Environments",        "x": 20, "y": 700, "width": 1020, "height": 150, "fill": "rgba(220,252,231,0.35)", "stroke": "#15803d" },

    { "id": "dev",   "type": "laptop",  "label": "Feature branch",      "x": 70,  "y": 45, "width": 150, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },
    { "id": "pr",    "type": "card",    "label": "Pull request + review","x": 260, "y": 45, "width": 150, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },
    { "id": "merge", "type": "ribbon",  "label": "Merge to main",       "x": 450, "y": 65, "width": 150, "height": 64,  "fill": "#fde68a", "stroke": "#b45309", "bold": true },

    { "id": "build", "type": "gear",             "label": "Build + unit tests",  "x": 70,  "y": 215, "width": 150, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "lint",  "type": "clipboard",        "label": "Lint + type check",   "x": 260, "y": 215, "width": 150, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "sast",  "type": "bug",              "label": "SAST + dep scan",     "x": 450, "y": 215, "width": 160, "height": 104, "fill": "#fee2e2", "stroke": "#b91c1c" },
    { "id": "itest", "type": "flask",            "label": "Integration tests",   "x": 640, "y": 215, "width": 150, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "img",   "type": "docker-container", "label": "Build image",         "x": 830, "y": 215, "width": 150, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },

    { "id": "ecr",  "type": "container-registry", "label": "ECR — tagged images", "x": 70,  "y": 385, "width": 160, "height": 104, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "helm", "type": "file-stack",         "label": "Helm chart repo",     "x": 270, "y": 385, "width": 150, "height": 104, "fill": "#fef3c7", "stroke": "#b45309" },
    { "id": "sbom", "type": "certificate",        "label": "SBOM + cosign signature", "x": 460, "y": 385, "width": 170, "height": 104, "fill": "#fef3c7", "stroke": "#b45309" },

    { "id": "argo",   "type": "cog-cluster", "label": "Argo CD sync",       "x": 70,  "y": 555, "width": 150, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9", "bold": true },
    { "id": "appr",   "type": "gate",        "label": "Manual approval gate","x": 260, "y": 555, "width": 160, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9" },
    { "id": "rollbk", "type": "arrow-left",  "label": "Rollback to previous","x": 460, "y": 575, "width": 170, "height": 64,  "fill": "#fee2e2", "stroke": "#b91c1c" },

    { "id": "denv",  "type": "kubernetes",  "label": "dev cluster",        "x": 70,  "y": 725, "width": 140, "height": 104, "fill": "#dcfce7", "stroke": "#15803d" },
    { "id": "senv",  "type": "kubernetes",  "label": "staging cluster",    "x": 250, "y": 725, "width": 150, "height": 104, "fill": "#dcfce7", "stroke": "#15803d" },
    { "id": "penv",  "type": "kubernetes",  "label": "production cluster", "x": 440, "y": 725, "width": 160, "height": 104, "fill": "#dcfce7", "stroke": "#15803d", "bold": true },
    { "id": "smoke", "type": "gauge-chart", "label": "Canary + smoke tests","x": 640, "y": 725, "width": 160, "height": 104, "fill": "#dcfce7", "stroke": "#15803d" },
    { "id": "alert", "type": "bell",        "label": "SLO alert",          "x": 840, "y": 725, "width": 140, "height": 104, "fill": "#fee2e2", "stroke": "#b91c1c" }
  ],
  "edges": [
    { "id": "c1",  "source": "dev",   "target": "pr" },
    { "id": "c2",  "source": "pr",    "target": "merge", "label": "2 approvals" },
    { "id": "c3",  "source": "merge", "target": "build", "label": "push to main", "thickness": 3 },
    { "id": "c4",  "source": "build", "target": "lint" },
    { "id": "c5",  "source": "lint",  "target": "sast" },
    { "id": "c6",  "source": "sast",  "target": "itest" },
    { "id": "c7",  "source": "itest", "target": "img" },
    { "id": "c8",  "source": "img",   "target": "ecr",  "label": "push :sha",  "thickness": 2 },
    { "id": "c9",  "source": "img",   "target": "helm", "label": "bump values" },
    { "id": "c10", "source": "img",   "target": "sbom", "label": "sign + attest" },
    { "id": "c11", "source": "ecr",   "target": "argo",  "thickness": 2 },
    { "id": "c12", "source": "helm",  "target": "argo" },
    { "id": "c13", "source": "sbom",  "target": "argo",  "label": "policy check", "style": "dashed" },
    { "id": "c14", "source": "argo",  "target": "denv",  "label": "auto-sync" },
    { "id": "c15", "source": "argo",  "target": "senv",  "label": "auto-sync" },
    { "id": "c16", "source": "senv",  "target": "appr",  "label": "promote" },
    { "id": "c17", "source": "appr",  "target": "penv",  "label": "sync tag", "thickness": 2 },
    { "id": "c18", "source": "penv",  "target": "smoke" },
    { "id": "c19", "source": "smoke", "target": "alert", "label": "error budget burn" },
    { "id": "c20", "source": "alert", "target": "rollbk","style": "dashed" },
    { "id": "c21", "source": "rollbk","target": "penv",  "label": "previous revision", "style": "dashed" }
  ]
}