<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="Electron" modified="2026-02-23T08:00:00.000Z" agent="draw.io" version="24.0.0">
  <diagram name="CI/CD Pipeline" id="cicd-pipeline">
    <mxGraphModel dx="1400" dy="800" grid="1" gridSize="10">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <!-- Title -->
        <mxCell id="title" value="TechShop CI/CD Pipeline — GitHub Actions + Azure Container Apps (Part 10)" style="text;html=1;strokeColor=none;fillColor=none;align=center;fontSize=16;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="60" y="15" width="1100" height="40" as="geometry" />
        </mxCell>

        <!-- PR FLOW -->
        <mxCell id="pr-header" value="Pull Request Branch" style="swimlane;startSize=30;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="40" y="70" width="1130" height="160" as="geometry" />
        </mxCell>

        <mxCell id="pr1" value="ESLint +&lt;br/&gt;TypeScript&lt;br/&gt;check" style="rounded=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontSize=11;whiteSpace=wrap;" vertex="1" parent="pr-header">
          <mxGeometry x="20" y="50" width="160" height="80" as="geometry" />
        </mxCell>
        <mxCell id="pr2" value="Vitest&lt;br/&gt;(affected libs)&lt;br/&gt;&gt;80% coverage" style="rounded=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontSize=11;whiteSpace=wrap;" vertex="1" parent="pr-header">
          <mxGeometry x="210" y="50" width="160" height="80" as="geometry" />
        </mxCell>
        <mxCell id="pr3" value=".NET build&lt;br/&gt;+ xUnit tests&lt;br/&gt;(Postgres service)" style="rounded=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontSize=11;whiteSpace=wrap;" vertex="1" parent="pr-header">
          <mxGeometry x="400" y="50" width="160" height="80" as="geometry" />
        </mxCell>
        <mxCell id="pr4" value="Kiota drift&lt;br/&gt;check&lt;br/&gt;(git diff fail)" style="rounded=1;fillColor=#FFF9C4;strokeColor=#F57F17;fontSize=11;whiteSpace=wrap;" vertex="1" parent="pr-header">
          <mxGeometry x="590" y="50" width="160" height="80" as="geometry" />
        </mxCell>
        <mxCell id="pr5" value="Playwright smoke&lt;br/&gt;(chromium only&lt;br/&gt;critical paths)" style="rounded=1;fillColor=#FFF3E0;strokeColor=#E65100;fontSize=11;whiteSpace=wrap;" vertex="1" parent="pr-header">
          <mxGeometry x="780" y="50" width="160" height="80" as="geometry" />
        </mxCell>
        <mxCell id="pr6" value="✅ PR Checks&lt;br/&gt;Passed&lt;br/&gt;→ Merge to main" style="rounded=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontSize=11;whiteSpace=wrap;fontStyle=1;" vertex="1" parent="pr-header">
          <mxGeometry x="960" y="50" width="150" height="80" as="geometry" />
        </mxCell>

        <mxCell id="pr-arr1" edge="1" source="pr1" target="pr2" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="pr-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="pr-arr2" edge="1" source="pr2" target="pr3" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="pr-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="pr-arr3" edge="1" source="pr3" target="pr4" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="pr-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="pr-arr4" edge="1" source="pr4" target="pr5" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="pr-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="pr-arr5" edge="1" source="pr5" target="pr6" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#2E7D32;strokeWidth=2;" parent="pr-header"><mxGeometry relative="1" as="geometry"/></mxCell>

        <!-- MERGE FLOW -->
        <mxCell id="main-header" value="Merge to main → Deploy" style="swimlane;startSize=30;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="40" y="260" width="1130" height="160" as="geometry" />
        </mxCell>

        <mxCell id="m1" value="Docker build&lt;br/&gt;Angular SSR&lt;br/&gt;+ .NET API" style="rounded=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontSize=11;whiteSpace=wrap;" vertex="1" parent="main-header">
          <mxGeometry x="20" y="50" width="150" height="80" as="geometry" />
        </mxCell>
        <mxCell id="m2" value="Push to&lt;br/&gt;Azure Container&lt;br/&gt;Registry (ACR)" style="rounded=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontSize=11;whiteSpace=wrap;" vertex="1" parent="main-header">
          <mxGeometry x="200" y="50" width="150" height="80" as="geometry" />
        </mxCell>
        <mxCell id="m3" value="Deploy to&lt;br/&gt;Staging ACA&lt;br/&gt;(fast rollout)" style="rounded=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontSize=11;whiteSpace=wrap;" vertex="1" parent="main-header">
          <mxGeometry x="380" y="50" width="150" height="80" as="geometry" />
        </mxCell>
        <mxCell id="m4" value="Playwright E2E&lt;br/&gt;full suite on&lt;br/&gt;staging URL" style="rounded=1;fillColor=#FFF3E0;strokeColor=#E65100;fontSize=11;whiteSpace=wrap;" vertex="1" parent="main-header">
          <mxGeometry x="560" y="50" width="150" height="80" as="geometry" />
        </mxCell>
        <mxCell id="m5" value="⏸ Manual&lt;br/&gt;Approval Gate&lt;br/&gt;(GitHub Env)" style="rounded=1;fillColor=#FFF9C4;strokeColor=#F57F17;fontSize=11;whiteSpace=wrap;fontStyle=1;" vertex="1" parent="main-header">
          <mxGeometry x="740" y="50" width="150" height="80" as="geometry" />
        </mxCell>
        <mxCell id="m6" value="🚀 Deploy to&lt;br/&gt;Production ACA&lt;br/&gt;Zero downtime" style="rounded=1;fillColor=#C8E6C9;strokeColor=#1B5E20;fontSize=11;whiteSpace=wrap;fontStyle=1;" vertex="1" parent="main-header">
          <mxGeometry x="920" y="50" width="180" height="80" as="geometry" />
        </mxCell>

        <mxCell id="m-arr1" edge="1" source="m1" target="m2" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="main-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="m-arr2" edge="1" source="m2" target="m3" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="main-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="m-arr3" edge="1" source="m3" target="m4" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="main-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="m-arr4" edge="1" source="m4" target="m5" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#666;strokeWidth=2;" parent="main-header"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="m-arr5" edge="1" source="m5" target="m6" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#1B5E20;strokeWidth=2;" parent="main-header"><mxGeometry relative="1" as="geometry"/></mxCell>

        <!-- Infra details row -->
        <mxCell id="infra-bg" value="Infrastructure" style="swimlane;startSize=30;fillColor=#f5f5f5;strokeColor=#666;fontSize=12;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="40" y="450" width="1130" height="110" as="geometry" />
        </mxCell>
        <mxCell id="i1" value="Nx affected&lt;br/&gt;— only changed libs run" style="rounded=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontSize=11;whiteSpace=wrap;" vertex="1" parent="infra-bg">
          <mxGeometry x="20" y="35" width="230" height="55" as="geometry" />
        </mxCell>
        <mxCell id="i2" value="Docker multi-stage builds&lt;br/&gt;Node:22-alpine · mcr.microsoft.com/dotnet/aspnet:10.0" style="rounded=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontSize=11;whiteSpace=wrap;" vertex="1" parent="infra-bg">
          <mxGeometry x="270" y="35" width="300" height="55" as="geometry" />
        </mxCell>
        <mxCell id="i3" value="Azure Container Apps&lt;br/&gt;Staging + Production environments" style="rounded=1;fillColor=#FFF9C4;strokeColor=#F57F17;fontSize=11;whiteSpace=wrap;" vertex="1" parent="infra-bg">
          <mxGeometry x="590" y="35" width="260" height="55" as="geometry" />
        </mxCell>
        <mxCell id="i4" value="Dependabot&lt;br/&gt;npm (weekly) · nuget (weekly) · docker (monthly)" style="rounded=1;fillColor=#FFEBEE;strokeColor=#C62828;fontSize=11;whiteSpace=wrap;" vertex="1" parent="infra-bg">
          <mxGeometry x="870" y="35" width="240" height="55" as="geometry" />
        </mxCell>

      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
