Skip to content
BPMN 2.0 templates

Software release with parallel quality gates and canary rollout

Release pipeline modelled in BPMN: build and sign artefacts, then four quality gates in parallel (integration tests, SAST and dependency scan, regression testing, release notes), a fix-and-rebuild loop, change approval, a canary deployment with a 30-minute bake timer, SLO comparison, and promotion to full traffic or automatic rollback. Illustrative canary settings.

Template previewBPMN 2.0
Rendering…

Make it your own.

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Process_SoftwareRelease_defs" targetNamespace="http://flowss.ai/bpmn">
  <bpmn:process id="Process_SoftwareRelease" name="Software release" isExecutable="false">
    <bpmn:documentation>A release candidate passes four checks that run in parallel and are joined by a parallel gateway: automated integration tests, a security scan (static analysis and software-composition analysis), manual regression and exploratory testing, and release notes. Any failing gate loops back to the developers, and the re-tagged build runs every gate again. After change approval the build is deployed as a canary, held for a 30-minute bake time (intermediate timer event) and compared against the baseline's SLOs before it is promoted or rolled back. The 5 % canary share and 30-minute bake are illustrative values.</bpmn:documentation>
    <bpmn:laneSet id="Process_SoftwareRelease_lanes">
      <bpmn:lane id="Lane_Developers" name="Development team"><bpmn:flowNodeRef>Start_Cut</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_FixDefects</bpmn:flowNodeRef></bpmn:lane>
      <bpmn:lane id="Lane_Pipeline" name="CI/CD pipeline"><bpmn:flowNodeRef>Gw_BuildMerge</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Build</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_GatesFork</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Integration</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Scan</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_GatesJoin</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_GatesPassed</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Canary</bpmn:flowNodeRef><bpmn:flowNodeRef>Timer_Bake</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_CompareSLO</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_Healthy</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Promote</bpmn:flowNodeRef><bpmn:flowNodeRef>End_Live</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Rollback</bpmn:flowNodeRef></bpmn:lane>
      <bpmn:lane id="Lane_Quality" name="Quality and security"><bpmn:flowNodeRef>Task_Regression</bpmn:flowNodeRef></bpmn:lane>
      <bpmn:lane id="Lane_ReleaseMgmt" name="Release management"><bpmn:flowNodeRef>Task_Notes</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Approve</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Review</bpmn:flowNodeRef><bpmn:flowNodeRef>End_RolledBack</bpmn:flowNodeRef></bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="Start_Cut" name="Release branch cut"/>
    <bpmn:exclusiveGateway id="Gw_BuildMerge"/>
    <bpmn:serviceTask id="Task_Build" name="Build and sign artefacts"/>
    <bpmn:parallelGateway id="Gw_GatesFork"/>
    <bpmn:serviceTask id="Task_Integration" name="Run integration tests"/>
    <bpmn:serviceTask id="Task_Scan" name="Security scan (SAST, SCA)"/>
    <bpmn:userTask id="Task_Regression" name="Regression testing"/>
    <bpmn:userTask id="Task_Notes" name="Write release notes"/>
    <bpmn:parallelGateway id="Gw_GatesJoin"/>
    <bpmn:exclusiveGateway id="Gw_GatesPassed" name="All gates green?" default="Flow_13"/>
    <bpmn:userTask id="Task_FixDefects" name="Fix failures and re-tag"/>
    <bpmn:userTask id="Task_Approve" name="Approve change"/>
    <bpmn:serviceTask id="Task_Canary" name="Deploy canary (5 % traffic)"/>
    <bpmn:intermediateCatchEvent id="Timer_Bake" name="30-minute bake"><bpmn:timerEventDefinition id="Timer_Bake_ed"><bpmn:timeDuration xsi:type="bpmn:tFormalExpression">PT30M</bpmn:timeDuration></bpmn:timerEventDefinition></bpmn:intermediateCatchEvent>
    <bpmn:serviceTask id="Task_CompareSLO" name="Compare SLOs with baseline"/>
    <bpmn:exclusiveGateway id="Gw_Healthy" name="Canary healthy?" default="Flow_21"/>
    <bpmn:serviceTask id="Task_Promote" name="Promote to 100 % traffic"/>
    <bpmn:endEvent id="End_Live" name="Release live"/>
    <bpmn:serviceTask id="Task_Rollback" name="Roll back canary"/>
    <bpmn:userTask id="Task_Review" name="Open post-incident review"/>
    <bpmn:endEvent id="End_RolledBack" name="Release rolled back"/>
    <bpmn:sequenceFlow id="Flow_1" sourceRef="Start_Cut" targetRef="Gw_BuildMerge"/>
    <bpmn:sequenceFlow id="Flow_2" sourceRef="Gw_BuildMerge" targetRef="Task_Build"/>
    <bpmn:sequenceFlow id="Flow_3" sourceRef="Task_Build" targetRef="Gw_GatesFork"/>
    <bpmn:sequenceFlow id="Flow_4" sourceRef="Gw_GatesFork" targetRef="Task_Integration"/>
    <bpmn:sequenceFlow id="Flow_5" sourceRef="Gw_GatesFork" targetRef="Task_Scan"/>
    <bpmn:sequenceFlow id="Flow_6" sourceRef="Gw_GatesFork" targetRef="Task_Regression"/>
    <bpmn:sequenceFlow id="Flow_7" sourceRef="Gw_GatesFork" targetRef="Task_Notes"/>
    <bpmn:sequenceFlow id="Flow_8" sourceRef="Task_Integration" targetRef="Gw_GatesJoin"/>
    <bpmn:sequenceFlow id="Flow_9" sourceRef="Task_Scan" targetRef="Gw_GatesJoin"/>
    <bpmn:sequenceFlow id="Flow_10" sourceRef="Task_Regression" targetRef="Gw_GatesJoin"/>
    <bpmn:sequenceFlow id="Flow_11" sourceRef="Task_Notes" targetRef="Gw_GatesJoin"/>
    <bpmn:sequenceFlow id="Flow_12" sourceRef="Gw_GatesJoin" targetRef="Gw_GatesPassed"/>
    <bpmn:sequenceFlow id="Flow_13" name="no" sourceRef="Gw_GatesPassed" targetRef="Task_FixDefects"/>
    <bpmn:sequenceFlow id="Flow_14" name="yes" sourceRef="Gw_GatesPassed" targetRef="Task_Approve"><bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=allGatesPassed</bpmn:conditionExpression></bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_15" sourceRef="Task_FixDefects" targetRef="Gw_BuildMerge"/>
    <bpmn:sequenceFlow id="Flow_16" sourceRef="Task_Approve" targetRef="Task_Canary"/>
    <bpmn:sequenceFlow id="Flow_17" sourceRef="Task_Canary" targetRef="Timer_Bake"/>
    <bpmn:sequenceFlow id="Flow_18" sourceRef="Timer_Bake" targetRef="Task_CompareSLO"/>
    <bpmn:sequenceFlow id="Flow_19" sourceRef="Task_CompareSLO" targetRef="Gw_Healthy"/>
    <bpmn:sequenceFlow id="Flow_20" name="yes" sourceRef="Gw_Healthy" targetRef="Task_Promote"><bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=sloWithinBudget</bpmn:conditionExpression></bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_21" name="no" sourceRef="Gw_Healthy" targetRef="Task_Rollback"/>
    <bpmn:sequenceFlow id="Flow_22" sourceRef="Task_Promote" targetRef="End_Live"/>
    <bpmn:sequenceFlow id="Flow_23" sourceRef="Task_Rollback" targetRef="Task_Review"/>
    <bpmn:sequenceFlow id="Flow_24" sourceRef="Task_Review" targetRef="End_RolledBack"/>
    <bpmn:textAnnotation id="Note_Canary"><bpmn:text>5 % canary share and 30-minute bake time are illustrative policy values.</bpmn:text></bpmn:textAnnotation>
  </bpmn:process>
  <bpmn:collaboration id="Process_SoftwareRelease_collab">
    <bpmn:participant id="Process_SoftwareRelease_pool" name="Engineering — release" processRef="Process_SoftwareRelease"/>
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Process_SoftwareRelease_di">
    <bpmndi:BPMNPlane id="Process_SoftwareRelease_plane" bpmnElement="Process_SoftwareRelease_collab">
      <bpmndi:BPMNShape id="Process_SoftwareRelease_pool_di" bpmnElement="Process_SoftwareRelease_pool" isHorizontal="true"><dc:Bounds x="160" y="80" width="2298" height="720"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Lane_Developers_di" bpmnElement="Lane_Developers" isHorizontal="true"><dc:Bounds x="190" y="80" width="2268" height="150"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Lane_Pipeline_di" bpmnElement="Lane_Pipeline" isHorizontal="true"><dc:Bounds x="190" y="230" width="2268" height="270"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Lane_Quality_di" bpmnElement="Lane_Quality" isHorizontal="true"><dc:Bounds x="190" y="500" width="2268" height="150"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Lane_ReleaseMgmt_di" bpmnElement="Lane_ReleaseMgmt" isHorizontal="true"><dc:Bounds x="190" y="650" width="2268" height="150"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Start_Cut_di" bpmnElement="Start_Cut"><dc:Bounds x="262" y="137" width="36" height="36"/><bpmndi:BPMNLabel><dc:Bounds x="240" y="105" width="80" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gw_BuildMerge_di" bpmnElement="Gw_BuildMerge" isMarkerVisible="true"><dc:Bounds x="405" y="285" width="50" height="50"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Build_di" bpmnElement="Task_Build"><dc:Bounds x="530" y="270" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gw_GatesFork_di" bpmnElement="Gw_GatesFork"><dc:Bounds x="705" y="285" width="50" height="50"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Integration_di" bpmnElement="Task_Integration"><dc:Bounds x="830" y="270" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Scan_di" bpmnElement="Task_Scan"><dc:Bounds x="830" y="390" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Regression_di" bpmnElement="Task_Regression"><dc:Bounds x="830" y="535" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Notes_di" bpmnElement="Task_Notes"><dc:Bounds x="830" y="685" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gw_GatesJoin_di" bpmnElement="Gw_GatesJoin"><dc:Bounds x="1005" y="285" width="50" height="50"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gw_GatesPassed_di" bpmnElement="Gw_GatesPassed" isMarkerVisible="true"><dc:Bounds x="1155" y="285" width="50" height="50"/><bpmndi:BPMNLabel><dc:Bounds x="1082" y="268" width="82" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_FixDefects_di" bpmnElement="Task_FixDefects"><dc:Bounds x="1280" y="115" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Approve_di" bpmnElement="Task_Approve"><dc:Bounds x="1280" y="685" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Canary_di" bpmnElement="Task_Canary"><dc:Bounds x="1430" y="270" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Timer_Bake_di" bpmnElement="Timer_Bake"><dc:Bounds x="1612" y="292" width="36" height="36"/><bpmndi:BPMNLabel><dc:Bounds x="1591" y="333" width="78" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_CompareSLO_di" bpmnElement="Task_CompareSLO"><dc:Bounds x="1730" y="270" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gw_Healthy_di" bpmnElement="Gw_Healthy" isMarkerVisible="true"><dc:Bounds x="1905" y="285" width="50" height="50"/><bpmndi:BPMNLabel><dc:Bounds x="1889" y="266" width="83" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Promote_di" bpmnElement="Task_Promote"><dc:Bounds x="2030" y="270" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="End_Live_di" bpmnElement="End_Live"><dc:Bounds x="2212" y="292" width="36" height="36"/><bpmndi:BPMNLabel><dc:Bounds x="2199" y="333" width="62" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Rollback_di" bpmnElement="Task_Rollback"><dc:Bounds x="2030" y="390" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_Review_di" bpmnElement="Task_Review"><dc:Bounds x="2180" y="685" width="100" height="80"/></bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="End_RolledBack_di" bpmnElement="End_RolledBack"><dc:Bounds x="2362" y="707" width="36" height="36"/><bpmndi:BPMNLabel><dc:Bounds x="2344" y="748" width="73" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1"><di:waypoint x="280" y="173"/><di:waypoint x="280" y="310"/><di:waypoint x="405" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="455" y="310"/><di:waypoint x="530" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="630" y="310"/><di:waypoint x="705" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="755" y="310"/><di:waypoint x="830" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="730" y="335"/><di:waypoint x="730" y="430"/><di:waypoint x="830" y="430"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="730" y="335"/><di:waypoint x="730" y="575"/><di:waypoint x="830" y="575"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_7_di" bpmnElement="Flow_7"><di:waypoint x="730" y="335"/><di:waypoint x="730" y="725"/><di:waypoint x="830" y="725"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_8_di" bpmnElement="Flow_8"><di:waypoint x="930" y="310"/><di:waypoint x="1005" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_9_di" bpmnElement="Flow_9"><di:waypoint x="930" y="430"/><di:waypoint x="1030" y="430"/><di:waypoint x="1030" y="335"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_10_di" bpmnElement="Flow_10"><di:waypoint x="930" y="575"/><di:waypoint x="1030" y="575"/><di:waypoint x="1030" y="335"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_11_di" bpmnElement="Flow_11"><di:waypoint x="930" y="725"/><di:waypoint x="1030" y="725"/><di:waypoint x="1030" y="335"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_12_di" bpmnElement="Flow_12"><di:waypoint x="1055" y="310"/><di:waypoint x="1155" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_13_di" bpmnElement="Flow_13"><di:waypoint x="1180" y="285"/><di:waypoint x="1180" y="155"/><di:waypoint x="1280" y="155"/><bpmndi:BPMNLabel><dc:Bounds x="1186" y="266" width="15" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_14_di" bpmnElement="Flow_14"><di:waypoint x="1180" y="335"/><di:waypoint x="1180" y="725"/><di:waypoint x="1280" y="725"/><bpmndi:BPMNLabel><dc:Bounds x="1186" y="338" width="20" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_15_di" bpmnElement="Flow_15"><di:waypoint x="1330" y="115"/><di:waypoint x="1330" y="100"/><di:waypoint x="430" y="100"/><di:waypoint x="430" y="285"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_16_di" bpmnElement="Flow_16"><di:waypoint x="1380" y="725"/><di:waypoint x="1405" y="725"/><di:waypoint x="1405" y="310"/><di:waypoint x="1430" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_17_di" bpmnElement="Flow_17"><di:waypoint x="1530" y="310"/><di:waypoint x="1612" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_18_di" bpmnElement="Flow_18"><di:waypoint x="1648" y="310"/><di:waypoint x="1730" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_19_di" bpmnElement="Flow_19"><di:waypoint x="1830" y="310"/><di:waypoint x="1905" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_20_di" bpmnElement="Flow_20"><di:waypoint x="1955" y="310"/><di:waypoint x="2030" y="310"/><bpmndi:BPMNLabel><dc:Bounds x="1961" y="291" width="20" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_21_di" bpmnElement="Flow_21"><di:waypoint x="1930" y="335"/><di:waypoint x="1930" y="430"/><di:waypoint x="2030" y="430"/><bpmndi:BPMNLabel><dc:Bounds x="1936" y="338" width="15" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_22_di" bpmnElement="Flow_22"><di:waypoint x="2130" y="310"/><di:waypoint x="2212" y="310"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_23_di" bpmnElement="Flow_23"><di:waypoint x="2130" y="430"/><di:waypoint x="2155" y="430"/><di:waypoint x="2155" y="725"/><di:waypoint x="2180" y="725"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_24_di" bpmnElement="Flow_24"><di:waypoint x="2280" y="725"/><di:waypoint x="2362" y="725"/></bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Note_Canary_di" bpmnElement="Note_Canary"><dc:Bounds x="1570" y="550" width="230" height="44"/></bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>