{"id":77511,"date":"2026-07-07T02:23:53","date_gmt":"2026-07-07T02:23:53","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77511"},"modified":"2026-07-07T02:23:54","modified_gmt":"2026-07-07T02:23:54","slug":"software-delivery-workflow-master-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/software-delivery-workflow-master-tutorial\/","title":{"rendered":"Software Delivery Workflow Master Tutorial"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">From Beginner to Advanced: A Complete One-Stop Guide to Delivering Software Safely, Fast, and Reliably<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What is software delivery workflow?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>software delivery workflow<\/strong> is the complete process used to move software from an idea to users.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>planning<\/li>\n\n\n\n<li>design<\/li>\n\n\n\n<li>coding<\/li>\n\n\n\n<li>source control<\/li>\n\n\n\n<li>branching<\/li>\n\n\n\n<li>review<\/li>\n\n\n\n<li>testing<\/li>\n\n\n\n<li>security<\/li>\n\n\n\n<li>build<\/li>\n\n\n\n<li>packaging<\/li>\n\n\n\n<li>artifact storage<\/li>\n\n\n\n<li>environment promotion<\/li>\n\n\n\n<li>deployment<\/li>\n\n\n\n<li>release<\/li>\n\n\n\n<li>monitoring<\/li>\n\n\n\n<li>rollback<\/li>\n\n\n\n<li>incident response<\/li>\n\n\n\n<li>continuous improvement<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Simple definition:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Software delivery workflow is the controlled path from idea to production.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">It is not only CI\/CD.<br>It is not only Git.<br>It is not only deployment.<br>It is not only DevOps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is the full operating system of engineering delivery.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. The software delivery journey<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Idea \/ Requirement \/ Bug]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Plan]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Design]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Code]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Test]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Build]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Secure]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Package]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Deploy]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;Release]<\/span>\n    <span class=\"hljs-selector-tag\">K<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;Observe]<\/span>\n    <span class=\"hljs-selector-tag\">L<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">M<\/span><span class=\"hljs-selector-attr\">&#91;Learn]<\/span>\n    <span class=\"hljs-selector-tag\">M<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A weak team thinks delivery means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Developer writes code \u2192 deploy to server\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A mature team thinks delivery means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Idea \u2192 code \u2192 review \u2192 test \u2192 secure \u2192 package \u2192 deploy \u2192 observe \u2192 recover \u2192 improve\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That mindset shift is the whole game.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Software delivery vs deployment vs release<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">These three are often confused.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Meaning<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><strong>Delivery<\/strong><\/td><td>Entire path from idea to user value<\/td><td>Requirement to production outcome<\/td><\/tr><tr><td><strong>Deployment<\/strong><\/td><td>Installing\/running a new version in an environment<\/td><td>New container image deployed to Kubernetes<\/td><\/tr><tr><td><strong>Release<\/strong><\/td><td>Making functionality available to users<\/td><td>Feature flag enabled for customers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Important:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Deployment does not always mean release.\nRelease does not always <span class=\"hljs-built_in\">require<\/span> <span class=\"hljs-keyword\">new<\/span> deployment.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">Monday<\/span>: deploy code with feature flag OFF.\n<span class=\"hljs-attribute\">Wednesday<\/span>: enable feature flag for internal users.\n<span class=\"hljs-attribute\">Friday<\/span>: enable feature flag for 100% customers.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That is excellent modern delivery because it separates technical deployment from business release.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. The big picture delivery model<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Business Need]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Product Backlog]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Engineering Planning]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Architecture \/ Design]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Development]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Source Control]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Pull Request \/ Merge Request]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;CI Pipeline]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Security and Quality Gates]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Build Artifact]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;Artifact Registry]<\/span>\n    <span class=\"hljs-selector-tag\">K<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;Deploy to Dev]<\/span>\n    <span class=\"hljs-selector-tag\">L<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">M<\/span><span class=\"hljs-selector-attr\">&#91;Deploy to Staging]<\/span>\n    <span class=\"hljs-selector-tag\">M<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">N<\/span><span class=\"hljs-selector-attr\">&#91;Production Approval or Auto Promotion]<\/span>\n    <span class=\"hljs-selector-tag\">N<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">O<\/span><span class=\"hljs-selector-attr\">&#91;Production Deployment]<\/span>\n    <span class=\"hljs-selector-tag\">O<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">P<\/span><span class=\"hljs-selector-attr\">&#91;Release Control]<\/span>\n    <span class=\"hljs-selector-tag\">P<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">Q<\/span><span class=\"hljs-selector-attr\">&#91;Observability]<\/span>\n    <span class=\"hljs-selector-tag\">Q<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">R<\/span><span class=\"hljs-selector-attr\">&#91;Rollback or Improve]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">AWS Well-Architected DevOps Guidance describes the development lifecycle as a way to improve an organization\u2019s ability to develop, review, build, and release workloads while improving delivery speed and deployment safety.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Why software delivery workflow matters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Poor delivery workflow creates:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>slow releases<\/li>\n\n\n\n<li>broken production<\/li>\n\n\n\n<li>painful rollbacks<\/li>\n\n\n\n<li>manual mistakes<\/li>\n\n\n\n<li>unreviewed changes<\/li>\n\n\n\n<li>security gaps<\/li>\n\n\n\n<li>unclear ownership<\/li>\n\n\n\n<li>environment drift<\/li>\n\n\n\n<li>failed deployments<\/li>\n\n\n\n<li>delayed customer value<\/li>\n\n\n\n<li>fear of release<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Good delivery workflow creates:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>faster release cycles<\/li>\n\n\n\n<li>safer production<\/li>\n\n\n\n<li>better code quality<\/li>\n\n\n\n<li>stronger auditability<\/li>\n\n\n\n<li>less manual work<\/li>\n\n\n\n<li>easier rollback<\/li>\n\n\n\n<li>better developer confidence<\/li>\n\n\n\n<li>clearer ownership<\/li>\n\n\n\n<li>repeatable delivery<\/li>\n\n\n\n<li>better customer outcomes<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The heart of software delivery is this:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Move faster by reducing risk, not by ignoring risk.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. The four pillars of software delivery<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Software Delivery]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Flow]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Quality]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Security]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Operability]<\/span>\n\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B1<\/span><span class=\"hljs-selector-attr\">&#91;Small batches, fast feedback, low waiting]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C1<\/span><span class=\"hljs-selector-attr\">&#91;Tests, reviews, standards, CI]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D1<\/span><span class=\"hljs-selector-attr\">&#91;Scanning, signing, provenance, policy]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E1<\/span><span class=\"hljs-selector-attr\">&#91;Monitoring, rollback, alerts, incident response]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Pillar<\/th><th>Question it answers<\/th><\/tr><\/thead><tbody><tr><td><strong>Flow<\/strong><\/td><td>How quickly can safe changes move?<\/td><\/tr><tr><td><strong>Quality<\/strong><\/td><td>How do we prevent defects?<\/td><\/tr><tr><td><strong>Security<\/strong><\/td><td>How do we prevent unsafe software from shipping?<\/td><\/tr><tr><td><strong>Operability<\/strong><\/td><td>How do we detect, recover, and learn?<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Software delivery workflow maturity model<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">L1<\/span><span class=\"hljs-selector-attr\">&#91;Level 1: Manual delivery]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L2<\/span><span class=\"hljs-selector-attr\">&#91;Level 2: Source control]<\/span>\n    <span class=\"hljs-selector-tag\">L2<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L3<\/span><span class=\"hljs-selector-attr\">&#91;Level 3: Pull requests]<\/span>\n    <span class=\"hljs-selector-tag\">L3<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L4<\/span><span class=\"hljs-selector-attr\">&#91;Level 4: CI checks]<\/span>\n    <span class=\"hljs-selector-tag\">L4<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L5<\/span><span class=\"hljs-selector-attr\">&#91;Level 5: Automated builds]<\/span>\n    <span class=\"hljs-selector-tag\">L5<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L6<\/span><span class=\"hljs-selector-attr\">&#91;Level 6: Automated deployments]<\/span>\n    <span class=\"hljs-selector-tag\">L6<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L7<\/span><span class=\"hljs-selector-attr\">&#91;Level 7: Security gates]<\/span>\n    <span class=\"hljs-selector-tag\">L7<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L8<\/span><span class=\"hljs-selector-attr\">&#91;Level 8: Progressive delivery]<\/span>\n    <span class=\"hljs-selector-tag\">L8<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L9<\/span><span class=\"hljs-selector-attr\">&#91;Level 9: Full observability and rollback]<\/span>\n    <span class=\"hljs-selector-tag\">L9<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L10<\/span><span class=\"hljs-selector-attr\">&#91;Level 10: Platform\/self-service delivery]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Level<\/th><th>Behavior<\/th><th>Risk<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Manual copy to server<\/td><td>Extreme<\/td><\/tr><tr><td>2<\/td><td>Code in Git\/SVN<\/td><td>High<\/td><\/tr><tr><td>3<\/td><td>PR review<\/td><td>Medium<\/td><\/tr><tr><td>4<\/td><td>Automated tests<\/td><td>Lower<\/td><\/tr><tr><td>5<\/td><td>Repeatable build<\/td><td>Lower<\/td><\/tr><tr><td>6<\/td><td>Automated deploy<\/td><td>Medium-low<\/td><\/tr><tr><td>7<\/td><td>Security and policy gates<\/td><td>Low<\/td><\/tr><tr><td>8<\/td><td>Canary\/blue-green\/feature flags<\/td><td>Low<\/td><\/tr><tr><td>9<\/td><td>Observability + rollback<\/td><td>Very low<\/td><\/tr><tr><td>10<\/td><td>Self-service platform delivery<\/td><td>Enterprise-grade<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitLab describes CI\/CD as a continuous method where teams build, test, deploy, and monitor iterative code changes, helping catch issues earlier and reduce the chance of building on failed previous versions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. The delivery workflow lifecycle<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A complete delivery workflow has 14 stages.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;1. Intake]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;2. Planning]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;3. Design]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;4. Development]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;5. Source Control]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;6. Review]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;7. CI Validation]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;8. Build]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;9. Security]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;10. Package]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;11. Deploy]<\/span>\n    <span class=\"hljs-selector-tag\">K<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;12. Release]<\/span>\n    <span class=\"hljs-selector-tag\">L<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">M<\/span><span class=\"hljs-selector-attr\">&#91;13. Observe]<\/span>\n    <span class=\"hljs-selector-tag\">M<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">N<\/span><span class=\"hljs-selector-attr\">&#91;14. Improve]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Each stage should have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>clear owner<\/li>\n\n\n\n<li>clear input<\/li>\n\n\n\n<li>clear output<\/li>\n\n\n\n<li>clear automation<\/li>\n\n\n\n<li>clear approval criteria<\/li>\n\n\n\n<li>clear failure handling<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Stage 1: Intake<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Intake is where work enters the system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sources of work:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>customer request<\/li>\n\n\n\n<li>product requirement<\/li>\n\n\n\n<li>bug report<\/li>\n\n\n\n<li>security vulnerability<\/li>\n\n\n\n<li>incident follow-up<\/li>\n\n\n\n<li>platform improvement<\/li>\n\n\n\n<li>technical debt<\/li>\n\n\n\n<li>compliance requirement<\/li>\n\n\n\n<li>performance issue<\/li>\n\n\n\n<li>dependency update<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Good intake captures<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Why it matters<\/th><\/tr><\/thead><tbody><tr><td>Problem statement<\/td><td>Prevents solution-first work<\/td><\/tr><tr><td>User\/customer impact<\/td><td>Clarifies priority<\/td><\/tr><tr><td>Business value<\/td><td>Explains why now<\/td><\/tr><tr><td>Risk<\/td><td>Helps decide review level<\/td><\/tr><tr><td>Acceptance criteria<\/td><td>Defines done<\/td><\/tr><tr><td>Owner<\/td><td>Prevents orphan work<\/td><\/tr><tr><td>Deadline<\/td><td>Reveals urgency<\/td><\/tr><tr><td>Dependencies<\/td><td>Avoids surprise blockers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Bad intake<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Fix login\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Good intake<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Users <span class=\"hljs-keyword\">with<\/span> expired sessions are redirected to a blank page.\nExpected behavior: redirect to login page <span class=\"hljs-keyword\">with<\/span> a clear message.\nImpact: affects around <span class=\"hljs-number\">8<\/span>% <span class=\"hljs-keyword\">of<\/span> login attempts.\nAcceptance criteria: expired sessions show login page; tests cover expired token flow.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Stage 2: Planning<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Planning converts raw work into deliverable slices.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Planning questions<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What is the smallest valuable change?<\/li>\n\n\n\n<li>Can this be split?<\/li>\n\n\n\n<li>What is risky?<\/li>\n\n\n\n<li>What needs design review?<\/li>\n\n\n\n<li>What needs security review?<\/li>\n\n\n\n<li>What needs database migration?<\/li>\n\n\n\n<li>What needs release coordination?<\/li>\n\n\n\n<li>What is the rollback path?<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Delivery slicing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build complete billing system\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">1. Add billing tables\n2. Add customer billing API\n3. Add invoice generation\n4. Add payment provider integration behind feature flag\n5. Add internal admin UI\n6. Enable for test users\n7. Enable for all users\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Big feature]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 1]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 2]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 3]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 4]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Deliver gradually]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Stage 3: Design<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Design prevents expensive mistakes before coding.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Not every change needs a large design document. But risky changes need design clarity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When design is needed<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Change type<\/th><th>Design needed?<\/th><\/tr><\/thead><tbody><tr><td>Typo fix<\/td><td>No<\/td><\/tr><tr><td>Small bug fix<\/td><td>Usually no<\/td><\/tr><tr><td>New API<\/td><td>Yes<\/td><\/tr><tr><td>Database migration<\/td><td>Yes<\/td><\/tr><tr><td>Authentication change<\/td><td>Yes<\/td><\/tr><tr><td>Payment flow<\/td><td>Yes<\/td><\/tr><tr><td>Infrastructure architecture<\/td><td>Yes<\/td><\/tr><tr><td>Production traffic routing<\/td><td>Yes<\/td><\/tr><tr><td>Breaking change<\/td><td>Yes<\/td><\/tr><tr><td>Multi-team dependency<\/td><td>Yes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Lightweight design document<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Design: Payment Retry Workflow<\/span>\n\n<span class=\"hljs-comment\">## Problem<\/span>\nPayment gateway calls sometimes time out <span class=\"hljs-keyword\">and<\/span> are not retried.\n\n<span class=\"hljs-comment\">## Goals<\/span>\n- Retry transient failures safely.\n- Avoid duplicate charges.\n- Add observability.\n\n<span class=\"hljs-comment\">## Non-goals<\/span>\n- Replace payment provider.\n- Redesign billing model.\n\n<span class=\"hljs-comment\">## Proposed solution<\/span>\n- Add idempotency key.\n- Retry timeout errors up to <span class=\"hljs-number\">3<\/span> times.\n- Send failed attempts to dead-letter queue.\n\n<span class=\"hljs-comment\">## Rollout<\/span>\n- Deploy behind feature flag.\n- Enable <span class=\"hljs-keyword\">for<\/span> internal users.\n- Enable <span class=\"hljs-number\">10<\/span>%, <span class=\"hljs-number\">50<\/span>%, <span class=\"hljs-number\">100<\/span>%.\n\n<span class=\"hljs-comment\">## Rollback<\/span>\n- Disable feature flag.\n- Revert retry configuration <span class=\"hljs-keyword\">if<\/span> needed.\n\n<span class=\"hljs-comment\">## Risks<\/span>\n- Duplicate payment risk.\n- Provider rate limit risk.\n\n<span class=\"hljs-comment\">## Monitoring<\/span>\n- Retry count\n- Payment success rate\n- Duplicate charge alerts\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Stage 4: Development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Development should optimize for small, reviewable, testable changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Developer local workflow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Pull latest main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Create branch]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Make small change]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Run local tests]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Commit]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Push]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Open PR\/MR]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Local quality checks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before pushing:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">format\nlint\nunit tests\ntype checks\nsecret scan\nbuild\nbasic smoke test\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example command sequence:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b feature\/payment-retry\n\nmake format\nmake lint\nmake test\nmake build\n\ngit add .\ngit commit -m <span class=\"hljs-string\">\"feat(payment): retry transient gateway timeouts\"<\/span>\ngit push -u origin feature\/payment-retry\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Stage 5: Source control<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Source control is the backbone of delivery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It provides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>history<\/li>\n\n\n\n<li>collaboration<\/li>\n\n\n\n<li>review<\/li>\n\n\n\n<li>traceability<\/li>\n\n\n\n<li>rollback<\/li>\n\n\n\n<li>branching<\/li>\n\n\n\n<li>tagging<\/li>\n\n\n\n<li>audit<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Source control rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Rule<\/th><th>Why<\/th><\/tr><\/thead><tbody><tr><td>Use protected main branch<\/td><td>Prevent unsafe changes<\/td><\/tr><tr><td>Require PR\/MR<\/td><td>Ensure review<\/td><\/tr><tr><td>Require CI<\/td><td>Ensure quality gate<\/td><\/tr><tr><td>Use meaningful commits<\/td><td>Improve traceability<\/td><\/tr><tr><td>Use tags for releases<\/td><td>Enable rollback and audit<\/td><\/tr><tr><td>Delete stale branches<\/td><td>Reduce confusion<\/td><\/tr><tr><td>Never commit secrets<\/td><td>Prevent security incidents<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended branch model<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\nrelease\/* when needed\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended commit style<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">feat(scope)<\/span>: add user login\n<span class=\"hljs-attribute\">fix(scope)<\/span>: handle payment timeout\n<span class=\"hljs-attribute\">chore(scope)<\/span>: upgrade dependency\n<span class=\"hljs-attribute\">docs(scope)<\/span>: update runbook\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Stage 6: Pull request \/ merge request<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A PR\/MR is not just a merge button. It is a quality gate.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Branch pushed] --&gt; B&#91;Open PR\/MR]\n    B --&gt; C&#91;Describe change]\n    C --&gt; D&#91;Automated checks]\n    C --&gt; E&#91;Human review]\n    D --&gt; F{Pass?}\n    E --&gt; G{Approved?}\n    F -- No --&gt; H&#91;Fix]\n    G -- No --&gt; H\n    H --&gt; B\n    F -- Yes --&gt; I&#91;Merge]\n    G -- Yes --&gt; I\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Good PR includes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>what changed<\/li>\n\n\n\n<li>why it changed<\/li>\n\n\n\n<li>how it was tested<\/li>\n\n\n\n<li>screenshots\/logs if useful<\/li>\n\n\n\n<li>risk level<\/li>\n\n\n\n<li>rollback plan<\/li>\n\n\n\n<li>related ticket<\/li>\n\n\n\n<li>migration notes<\/li>\n\n\n\n<li>monitoring notes<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">PR template<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Summary<\/span>\n\nExplain what changed.\n\n<span class=\"hljs-comment\">## Why<\/span>\n\nExplain the problem <span class=\"hljs-keyword\">or<\/span> goal.\n\n<span class=\"hljs-comment\">## Changes<\/span>\n\n- Added:\n- Changed:\n- Removed:\n- Fixed:\n\n<span class=\"hljs-comment\">## Testing<\/span>\n\n- &#91; ] Unit tests\n- &#91; ] Integration tests\n- &#91; ] Manual test\n- &#91; ] Staging validation\n\n<span class=\"hljs-comment\">## Risk<\/span>\n\nLow \/ Medium \/ High\n\n<span class=\"hljs-comment\">## Rollback<\/span>\n\nHow can this be reverted, disabled, <span class=\"hljs-keyword\">or<\/span> rolled back?\n\n<span class=\"hljs-comment\">## Monitoring<\/span>\n\nWhat metrics\/logs\/alerts should be checked?\n\n<span class=\"hljs-comment\">## Checklist<\/span>\n\n- &#91; ] CI passed\n- &#91; ] No secrets committed\n- &#91; ] Docs updated\n- &#91; ] Backward compatibility considered\n- &#91; ] Rollback path known\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Stage 7: Continuous integration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Continuous integration validates every change before it enters the shared codebase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A proper CI pipeline should answer:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Can <span class=\"hljs-keyword\">this<\/span> change safely join the main codebase?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;PR opened] --&gt; B&#91;Checkout code]\n    B --&gt; C&#91;Install dependencies]\n    C --&gt; D&#91;Format check]\n    D --&gt; E&#91;Lint]\n    E --&gt; F&#91;Unit tests]\n    F --&gt; G&#91;Build]\n    G --&gt; H&#91;Integration tests]\n    H --&gt; I&#91;Security checks]\n    I --&gt; J{Pass?}\n    J -- Yes --&gt; K&#91;Merge allowed]\n    J -- No --&gt; L&#91;Merge blocked]\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitLab documentation describes pipelines as containing jobs grouped into stages, where later stages such as deploy can run only after earlier jobs such as compile and test complete successfully.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. CI checks by repository type<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Application repository<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Format<\/td><td>Style consistency<\/td><\/tr><tr><td>Lint<\/td><td>Static mistakes<\/td><\/tr><tr><td>Type check<\/td><td>Type safety<\/td><\/tr><tr><td>Unit tests<\/td><td>Logic correctness<\/td><\/tr><tr><td>Integration tests<\/td><td>Component behavior<\/td><\/tr><tr><td>Build<\/td><td>Package validity<\/td><\/tr><tr><td>Secret scan<\/td><td>Prevent leaked credentials<\/td><\/tr><tr><td>Dependency scan<\/td><td>Detect vulnerable packages<\/td><\/tr><tr><td>SAST<\/td><td>Detect insecure code patterns<\/td><\/tr><tr><td>License scan<\/td><td>Avoid legal risk<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Terraform \/ IaC repository<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>terraform fmt<\/code><\/td><td>Formatting<\/td><\/tr><tr><td><code>terraform validate<\/code><\/td><td>Validate configuration<\/td><\/tr><tr><td><code>terraform plan<\/code><\/td><td>Preview infrastructure changes<\/td><\/tr><tr><td>TFLint<\/td><td>Best practices<\/td><\/tr><tr><td>Checkov\/tfsec<\/td><td>Security misconfiguration<\/td><\/tr><tr><td>Infracost<\/td><td>Cost estimate<\/td><\/tr><tr><td>OPA\/Conftest<\/td><td>Policy enforcement<\/td><\/tr><tr><td>Manual approval<\/td><td>Production safety<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Kubernetes repository<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>YAML lint<\/td><td>Syntax<\/td><\/tr><tr><td>Helm lint<\/td><td>Chart quality<\/td><\/tr><tr><td>Kustomize build<\/td><td>Render validation<\/td><\/tr><tr><td>kubeconform<\/td><td>Kubernetes schema validation<\/td><\/tr><tr><td>OPA\/Kyverno policy<\/td><td>Policy checks<\/td><\/tr><tr><td>Container scan<\/td><td>Image vulnerability<\/td><\/tr><tr><td>Deployment dry-run<\/td><td>API compatibility<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Stage 8: Build<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A build converts source code into a deployable artifact.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Artifacts include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>container image<\/li>\n\n\n\n<li>JAR\/WAR file<\/li>\n\n\n\n<li>binary executable<\/li>\n\n\n\n<li>npm package<\/li>\n\n\n\n<li>Python wheel<\/li>\n\n\n\n<li>mobile app package<\/li>\n\n\n\n<li>Helm chart<\/li>\n\n\n\n<li>Terraform module<\/li>\n\n\n\n<li>static website bundle<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Build rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build once. Promote the same artifact.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build separately for dev, staging, and production.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build one immutable artifact and promote it through environments.\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Source commit abc123]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build artifact]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Artifact registry]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Deploy dev]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Promote staging]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Promote production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Artifact metadata<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every artifact should know:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>source commit SHA<\/li>\n\n\n\n<li>branch<\/li>\n\n\n\n<li>build ID<\/li>\n\n\n\n<li>build timestamp<\/li>\n\n\n\n<li>dependency versions<\/li>\n\n\n\n<li>image digest<\/li>\n\n\n\n<li>test result<\/li>\n\n\n\n<li>security scan result<\/li>\n\n\n\n<li>provenance data<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Stage 9: Software supply-chain security<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Modern software delivery must protect the path from source code to production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Threats include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>malicious dependency<\/li>\n\n\n\n<li>compromised build runner<\/li>\n\n\n\n<li>leaked credentials<\/li>\n\n\n\n<li>tampered artifact<\/li>\n\n\n\n<li>unsafe CI\/CD permissions<\/li>\n\n\n\n<li>unreviewed workflow change<\/li>\n\n\n\n<li>poisoned container base image<\/li>\n\n\n\n<li>unsigned package<\/li>\n\n\n\n<li>insecure deployment credentials<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">SLSA, or Supply-chain Levels for Software Artifacts, is a security framework and checklist of standards\/controls designed to prevent tampering, improve integrity, and secure packages and infrastructure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Supply-chain security flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Source code]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Review]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Trusted CI runner]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Build artifact]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Sign artifact]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Generate provenance]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Scan artifact]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Store in registry]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Deploy with verification]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Security gates<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Gate<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Secret scanning<\/td><td>Stop leaked keys<\/td><\/tr><tr><td>SAST<\/td><td>Find insecure code<\/td><\/tr><tr><td>Dependency scanning<\/td><td>Find vulnerable libraries<\/td><\/tr><tr><td>Container scanning<\/td><td>Find image vulnerabilities<\/td><\/tr><tr><td>IaC scanning<\/td><td>Find cloud misconfigurations<\/td><\/tr><tr><td>SBOM<\/td><td>List software components<\/td><\/tr><tr><td>Artifact signing<\/td><td>Prove artifact integrity<\/td><\/tr><tr><td>Provenance<\/td><td>Prove where artifact came from<\/td><\/tr><tr><td>Policy-as-code<\/td><td>Enforce rules automatically<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSF Scorecard is used to assess open-source project security practices and helps users reason about the trust, risk, and security posture of dependencies.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Stage 10: Packaging and artifact registry<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After building, artifacts should be stored in a trusted registry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Artifact<\/th><th>Registry<\/th><\/tr><\/thead><tbody><tr><td>Container image<\/td><td>ECR, GCR, GHCR, Docker registry<\/td><\/tr><tr><td>Java package<\/td><td>Maven repository<\/td><\/tr><tr><td>JavaScript package<\/td><td>npm registry<\/td><\/tr><tr><td>Python package<\/td><td>PyPI\/private index<\/td><\/tr><tr><td>Helm chart<\/td><td>OCI registry\/chart repository<\/td><\/tr><tr><td>Binary<\/td><td>Artifactory\/Nexus\/S3<\/td><\/tr><tr><td>Mobile build<\/td><td>App Store\/TestFlight\/Play Console<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Artifact rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Artifacts are immutable.<\/li>\n\n\n\n<li>Production deploys use versioned artifacts.<\/li>\n\n\n\n<li>Never deploy from a developer laptop.<\/li>\n\n\n\n<li>Never rebuild differently per environment.<\/li>\n\n\n\n<li>Never use only <code>latest<\/code> for production.<\/li>\n\n\n\n<li>Store provenance and scan results.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Stage 11: Environments<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Environments are controlled places where software runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common environments:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">local\ndevelopment\ntest\nintegration\nstaging\npre-production\nproduction\ndisaster recovery\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Environment purpose<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Environment<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Local<\/td><td>Developer testing<\/td><\/tr><tr><td>Dev<\/td><td>Early integration<\/td><\/tr><tr><td>Test<\/td><td>Automated validation<\/td><\/tr><tr><td>Integration<\/td><td>Cross-service testing<\/td><\/tr><tr><td>Staging<\/td><td>Production-like validation<\/td><\/tr><tr><td>Pre-prod<\/td><td>Final release rehearsal<\/td><\/tr><tr><td>Production<\/td><td>Real users<\/td><\/tr><tr><td>DR<\/td><td>Disaster recovery readiness<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Environment principle<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">The closer an environment is to production, the stricter the rules.\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Local]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Dev]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Test]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Staging]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Environment drift<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Environment drift happens when environments are not equivalent enough.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>staging uses different database version<\/li>\n\n\n\n<li>production has manual config<\/li>\n\n\n\n<li>dev has missing feature flags<\/li>\n\n\n\n<li>staging uses fake IAM permissions<\/li>\n\n\n\n<li>production has different infrastructure<\/li>\n\n\n\n<li>manual hotfix exists only in prod<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Drift prevention<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Practice<\/th><th>Benefit<\/th><\/tr><\/thead><tbody><tr><td>Infrastructure as Code<\/td><td>Repeatable infra<\/td><\/tr><tr><td>Configuration as Code<\/td><td>Track config changes<\/td><\/tr><tr><td>GitOps<\/td><td>Git as desired state<\/td><\/tr><tr><td>Immutable artifacts<\/td><td>Same build everywhere<\/td><\/tr><tr><td>Automated deployment<\/td><td>Reduce manual changes<\/td><\/tr><tr><td>Environment parity checks<\/td><td>Detect drift<\/td><\/tr><tr><td>Policy-as-code<\/td><td>Enforce consistency<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Stage 12: Deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Deployment means placing a version into an environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deployment can be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>manual<\/li>\n\n\n\n<li>scripted<\/li>\n\n\n\n<li>CI\/CD automated<\/li>\n\n\n\n<li>GitOps pull-based<\/li>\n\n\n\n<li>platform self-service<\/li>\n\n\n\n<li>progressive\/canary<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Deployment pipeline<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Artifact selected] --&gt; B&#91;Pre-deploy checks]\n    B --&gt; C&#91;Deploy]\n    C --&gt; D&#91;Health checks]\n    D --&gt; E&#91;Smoke tests]\n    E --&gt; F{Healthy?}\n    F -- Yes --&gt; G&#91;<span class=\"hljs-keyword\">Continue<\/span> \/ promote]\n    F -- No --&gt; H&#91;Rollback \/ halt]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Deployment must include<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>artifact version<\/li>\n\n\n\n<li>target environment<\/li>\n\n\n\n<li>configuration<\/li>\n\n\n\n<li>secrets reference<\/li>\n\n\n\n<li>migration plan<\/li>\n\n\n\n<li>health check<\/li>\n\n\n\n<li>rollback plan<\/li>\n\n\n\n<li>monitoring window<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Deployment strategies<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Different deployment strategies handle risk differently.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strategy<\/th><th>How it works<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Recreate<\/td><td>Stop old, start new<\/td><td>Non-critical apps<\/td><\/tr><tr><td>Rolling<\/td><td>Replace instances gradually<\/td><td>Standard services<\/td><\/tr><tr><td>Blue-green<\/td><td>Two environments; switch traffic<\/td><td>Fast rollback<\/td><\/tr><tr><td>Canary<\/td><td>Small traffic first, then expand<\/td><td>Risky changes<\/td><\/tr><tr><td>Shadow<\/td><td>Mirror traffic without user impact<\/td><td>Validation<\/td><\/tr><tr><td>A\/B<\/td><td>Route users by experiment group<\/td><td>Product experiments<\/td><\/tr><tr><td>Feature flag<\/td><td>Deploy hidden, release later<\/td><td>Decoupled release<\/td><\/tr><tr><td>Progressive delivery<\/td><td>Automated gradual rollout<\/td><td>Mature teams<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">AWS describes advanced deployment strategies as ways to deploy and release features gradually, providing fast feedback that helps detect and resolve issues earlier during deployment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Rolling deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Rolling deployment gradually replaces old instances with new ones.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Old v1: 100%]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;v1 75% \/ v2 25%]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;v1 50% \/ v2 50%]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;v1 25% \/ v2 75%]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;New v2: 100%]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes documentation describes rolling updates as gradually replacing old Pods with new Pods, keeping the application available by sending traffic only to Pods that can handle requests.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pros<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>simple<\/li>\n\n\n\n<li>common default<\/li>\n\n\n\n<li>less infrastructure needed<\/li>\n\n\n\n<li>no full downtime if configured well<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Cons<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>rollback can take time<\/li>\n\n\n\n<li>old and new versions coexist<\/li>\n\n\n\n<li>database compatibility matters<\/li>\n\n\n\n<li>not ideal for highly risky changes<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Blue-green deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Blue-green uses two production-like environments.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Users]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Blue: current production]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Green: new version]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Validation]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Switch traffic to Green]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Pros<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>fast rollback by switching traffic back<\/li>\n\n\n\n<li>production-like validation<\/li>\n\n\n\n<li>clean separation<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Cons<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>more infrastructure cost<\/li>\n\n\n\n<li>database compatibility still hard<\/li>\n\n\n\n<li>stateful services need care<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>critical services<\/li>\n\n\n\n<li>major releases<\/li>\n\n\n\n<li>high rollback requirement<\/li>\n\n\n\n<li>low tolerance for downtime<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Canary deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Canary releases new software to a small percentage of users first.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;1% traffic]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;5% traffic]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;25% traffic]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;50% traffic]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;100% traffic]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Canary checks<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>error rate<\/li>\n\n\n\n<li>latency<\/li>\n\n\n\n<li>saturation<\/li>\n\n\n\n<li>business metrics<\/li>\n\n\n\n<li>logs<\/li>\n\n\n\n<li>traces<\/li>\n\n\n\n<li>user complaints<\/li>\n\n\n\n<li>payment success<\/li>\n\n\n\n<li>login success<\/li>\n\n\n\n<li>crash rate<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Canary rule<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">If metrics <span class=\"hljs-keyword\">get<\/span> worse, stop rollout automatically.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Feature flag release<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags separate deployment from release.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Deploy code]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Feature flag OFF]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Internal users]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Beta users]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;10% users]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;100% users]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Remove old flag]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Feature flag types<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Release flag<\/td><td>Hide incomplete feature<\/td><\/tr><tr><td>Experiment flag<\/td><td>A\/B testing<\/td><\/tr><tr><td>Ops flag<\/td><td>Kill switch<\/td><\/tr><tr><td>Permission flag<\/td><td>Customer-specific access<\/td><\/tr><tr><td>Migration flag<\/td><td>Gradual backend switch<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Feature flag rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Every flag has an owner.<\/li>\n\n\n\n<li>Every flag has an expiry date.<\/li>\n\n\n\n<li>Critical flags are monitored.<\/li>\n\n\n\n<li>Old flags are deleted.<\/li>\n\n\n\n<li>Flag changes are auditable.<\/li>\n\n\n\n<li>Flags should not become permanent chaos.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Stage 13: Release<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Release is the moment software becomes available to users.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Release can happen through:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>production deployment<\/li>\n\n\n\n<li>feature flag enablement<\/li>\n\n\n\n<li>config change<\/li>\n\n\n\n<li>traffic shift<\/li>\n\n\n\n<li>app store publication<\/li>\n\n\n\n<li>package publishing<\/li>\n\n\n\n<li>customer enablement<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Release record<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A release record should include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Release version: v2.4.1\nCommit SHA: abc1234\nArtifact: payment-service@sha256:...\nBuild ID: build-9981\nEnvironment: production\nDeployed by: pipeline\nApproved by: release manager\nTime: 2026-07-07 14:30 JST\nRollback: deploy v2.4.0 or disable payment_retry flag\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Release checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>artifact built once<\/li>\n\n\n\n<li>tests passed<\/li>\n\n\n\n<li>security scans passed<\/li>\n\n\n\n<li>migration plan ready<\/li>\n\n\n\n<li>rollback plan ready<\/li>\n\n\n\n<li>monitoring dashboard ready<\/li>\n\n\n\n<li>alerts enabled<\/li>\n\n\n\n<li>support team informed<\/li>\n\n\n\n<li>release notes prepared<\/li>\n\n\n\n<li>business owner approved, if needed<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Release notes and changelog<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Good release notes explain value and risk.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Internal release notes<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Release v2.4.1<\/span>\n\n<span class=\"hljs-comment\">## Summary<\/span>\nAdds retry handling <span class=\"hljs-keyword\">for<\/span> transient payment gateway timeouts.\n\n<span class=\"hljs-comment\">## Changes<\/span>\n- Added idempotency key support.\n- Added retry <span class=\"hljs-keyword\">for<\/span> timeout errors.\n- Added payment retry metrics.\n\n<span class=\"hljs-comment\">## Risk<\/span>\nMedium. Payment provider integration touched.\n\n<span class=\"hljs-comment\">## Rollout<\/span>\n- Internal users first\n- <span class=\"hljs-number\">10<\/span>% customers\n- <span class=\"hljs-number\">100<\/span>% after <span class=\"hljs-number\">2<\/span> hours <span class=\"hljs-keyword\">if<\/span> metrics healthy\n\n<span class=\"hljs-comment\">## Rollback<\/span>\nDisable `payment_retry_enabled` flag.\n\n<span class=\"hljs-comment\">## Monitoring<\/span>\n- payment_success_rate\n- payment_duplicate_count\n- payment_gateway_timeout_count\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Customer-facing release notes<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">We improved payment reliability by adding safer retry handling for temporary gateway timeouts.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Stage 14: Observability<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Observability answers:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Is the software working correctly for users right now?\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Observability includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>metrics<\/li>\n\n\n\n<li>logs<\/li>\n\n\n\n<li>traces<\/li>\n\n\n\n<li>events<\/li>\n\n\n\n<li>alerts<\/li>\n\n\n\n<li>dashboards<\/li>\n\n\n\n<li>synthetic checks<\/li>\n\n\n\n<li>real-user monitoring<\/li>\n\n\n\n<li>business KPIs<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Delivery observability flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Deploy] --&gt; B&#91;Health checks]\n    B --&gt; C&#91;Metrics]\n    B --&gt; D&#91;Logs]\n    B --&gt; E&#91;Traces]\n    C --&gt; F&#91;Dashboard]\n    D --&gt; F\n    E --&gt; F\n    F --&gt; G{Healthy?}\n    G -- Yes --&gt; H&#91;<span class=\"hljs-keyword\">Continue<\/span> rollout]\n    G -- No --&gt; I&#91;Rollback <span class=\"hljs-keyword\">or<\/span> pause]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Golden signals<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Signal<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Latency<\/td><td>Is it slow?<\/td><\/tr><tr><td>Traffic<\/td><td>Is demand normal?<\/td><\/tr><tr><td>Errors<\/td><td>Is it failing?<\/td><\/tr><tr><td>Saturation<\/td><td>Is capacity exhausted?<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Business signals<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>System<\/th><th>Business metric<\/th><\/tr><\/thead><tbody><tr><td>Login<\/td><td>login success rate<\/td><\/tr><tr><td>Payment<\/td><td>payment success rate<\/td><\/tr><tr><td>Search<\/td><td>result success rate<\/td><\/tr><tr><td>Messaging<\/td><td>delivery success<\/td><\/tr><tr><td>Ecommerce<\/td><td>checkout conversion<\/td><\/tr><tr><td>API<\/td><td>successful requests<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Rollback and recovery<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Every delivery workflow must know how to recover.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rollback options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Disable feature flag<\/td><td>Bad feature behavior<\/td><\/tr><tr><td>Redeploy previous artifact<\/td><td>Bad deployment<\/td><\/tr><tr><td>Revert commit<\/td><td>Bad code change<\/td><\/tr><tr><td>Roll back config<\/td><td>Bad configuration<\/td><\/tr><tr><td>Roll forward<\/td><td>Small fix safer than rollback<\/td><\/tr><tr><td>Restore backup<\/td><td>Data loss or corruption<\/td><\/tr><tr><td>Traffic shift back<\/td><td>Blue-green\/canary failure<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Production issue detected] --&gt; B{Feature flag?}\n    B -- Yes --&gt; C&#91;Disable flag]\n    B -- No --&gt; D{Bad artifact?}\n    D -- Yes --&gt; E&#91;Redeploy previous artifact]\n    D -- No --&gt; F{Bad commit?}\n    F -- Yes --&gt; G&#91;Revert commit]\n    F -- No --&gt; H{Database issue?}\n    H -- Yes --&gt; I&#91;Fix forward \/ restore \/ migration rollback]\n    H -- No --&gt; J&#91;Incident response]\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rollback rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A deployment is not ready if rollback is unknown.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Database delivery workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Databases make delivery harder because data changes are not always reversible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Safe database pattern<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Expand \u2192 Migrate \u2192 Contract\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Expand schema]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Deploy backward-compatible code]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Backfill data]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Switch reads\/writes]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Contract old schema]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Bad migration<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ALTER TABLE users DROP COLUMN name;\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Safer phased migration<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add new column.<\/li>\n\n\n\n<li>Deploy app that writes old and new.<\/li>\n\n\n\n<li>Backfill existing data.<\/li>\n\n\n\n<li>Switch reads to new column.<\/li>\n\n\n\n<li>Wait and monitor.<\/li>\n\n\n\n<li>Remove old column later.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Database delivery checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Is it backward compatible?<\/li>\n\n\n\n<li>Can old code still run?<\/li>\n\n\n\n<li>Can new code run with old schema?<\/li>\n\n\n\n<li>Is rollback possible?<\/li>\n\n\n\n<li>Will it lock large tables?<\/li>\n\n\n\n<li>Is backfill required?<\/li>\n\n\n\n<li>Is data validation ready?<\/li>\n\n\n\n<li>Are metrics and alerts ready?<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Configuration and secrets workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Configuration should be controlled. Secrets should be protected.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration examples<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>feature flags<\/li>\n\n\n\n<li>timeout values<\/li>\n\n\n\n<li>endpoint URLs<\/li>\n\n\n\n<li>resource limits<\/li>\n\n\n\n<li>scaling settings<\/li>\n\n\n\n<li>logging levels<\/li>\n\n\n\n<li>environment variables<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Secret examples<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>passwords<\/li>\n\n\n\n<li>API keys<\/li>\n\n\n\n<li>certificates<\/li>\n\n\n\n<li>private keys<\/li>\n\n\n\n<li>database credentials<\/li>\n\n\n\n<li>OAuth client secrets<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Item<\/th><th>Store where?<\/th><\/tr><\/thead><tbody><tr><td>Non-sensitive config<\/td><td>Git, config repo, config service<\/td><\/tr><tr><td>Secret values<\/td><td>Secret manager<\/td><\/tr><tr><td>Secret references<\/td><td>Git allowed<\/td><\/tr><tr><td>Production credentials<\/td><td>Secret manager only<\/td><\/tr><tr><td><code>.env<\/code> templates<\/td><td>Git allowed<\/td><\/tr><tr><td>Real <code>.env<\/code> files<\/td><td>Do not commit<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Delivery workflow for microservices<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Microservices multiply delivery complexity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problems:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>service dependency mismatch<\/li>\n\n\n\n<li>API compatibility<\/li>\n\n\n\n<li>deployment ordering<\/li>\n\n\n\n<li>shared database coupling<\/li>\n\n\n\n<li>version drift<\/li>\n\n\n\n<li>distributed tracing gaps<\/li>\n\n\n\n<li>rollback complexity<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Microservice delivery principles<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Principle<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Backward compatibility<\/td><td>New service version should not break consumers<\/td><\/tr><tr><td>Contract testing<\/td><td>APIs must match expectations<\/td><\/tr><tr><td>Independent deployability<\/td><td>One service can deploy without full system deploy<\/td><\/tr><tr><td>Observability<\/td><td>Trace requests across services<\/td><\/tr><tr><td>Versioned APIs<\/td><td>Breaking changes need controlled migration<\/td><\/tr><tr><td>Feature flags<\/td><td>Avoid synchronized big-bang release<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Service A change] --&gt; B&#91;Contract tests]\n    B --&gt; C&#91;Deploy Service A]\n    C --&gt; D&#91;Monitor downstream errors]\n    D --&gt; E{Healthy?}\n    E -- Yes --&gt; F&#91;<span class=\"hljs-keyword\">Continue<\/span>]\n    E -- No --&gt; G&#91;Rollback \/ disable flag]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Delivery workflow for monorepos<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A monorepo has many projects in one repository.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo\/\n  apps\/\n  services\/\n  packages\/\n  infra\/\n  docs\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Monorepo delivery needs<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>path-based CI<\/li>\n\n\n\n<li>affected-project detection<\/li>\n\n\n\n<li>CODEOWNERS<\/li>\n\n\n\n<li>dependency graph<\/li>\n\n\n\n<li>selective builds<\/li>\n\n\n\n<li>test impact analysis<\/li>\n\n\n\n<li>ownership rules<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Commit in monorepo]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Detect changed paths]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Find affected projects]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Run targeted tests]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Require owners]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Build affected artifacts]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Deploy only changed services]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Monorepo anti-pattern<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Every change runs every test and deploys every service.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That becomes slow and expensive fast.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Delivery workflow for Infrastructure as Code<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Infrastructure delivery must be stricter than application delivery.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Infra change branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Format and validate]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Plan]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Security scan]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Cost review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Human approval]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Apply via pipeline]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Post-change validation]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">IaC delivery checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What resources change?<\/li>\n\n\n\n<li>What resources are replaced?<\/li>\n\n\n\n<li>Is anything destroyed?<\/li>\n\n\n\n<li>What is the blast radius?<\/li>\n\n\n\n<li>What is the cost impact?<\/li>\n\n\n\n<li>What is the rollback?<\/li>\n\n\n\n<li>Is production affected?<\/li>\n\n\n\n<li>Is state safe?<\/li>\n\n\n\n<li>Are secrets exposed?<\/li>\n\n\n\n<li>Are security groups\/IAM policies safe?<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Dangerous plan keywords<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">destroy\nforces replacement\npublic access\n<span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">0<\/span>\n<span class=\"hljs-keyword\">delete<\/span> database\ndisable encryption\nremove backup\nreplace cluster\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. Delivery workflow for Kubernetes and GitOps<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GitOps uses Git as the desired state.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;App source repo]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build image]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Push image digest]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Update GitOps repo]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Argo CD \/ Flux sync]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Kubernetes cluster]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">GitOps rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Git is the source of truth.<\/li>\n\n\n\n<li>Cluster drift is corrected.<\/li>\n\n\n\n<li>Changes go through PR.<\/li>\n\n\n\n<li>Deployments are reproducible.<\/li>\n\n\n\n<li>Rollback is Git revert or artifact rollback.<\/li>\n\n\n\n<li>Images should be immutable.<\/li>\n\n\n\n<li>Production changes must be reviewed.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended GitOps layout<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">gitops\/\n  apps\/\n    auth\/\n    payment\/\n    notification\/\n  environments\/\n    dev\/\n    staging\/\n    production\/\n  platform\/\n    ingress\/\n    monitoring\/\n    security\/\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Delivery workflow for mobile apps<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Mobile delivery has special constraints:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>app store approval<\/li>\n\n\n\n<li>staged rollout<\/li>\n\n\n\n<li>device fragmentation<\/li>\n\n\n\n<li>signing certificates<\/li>\n\n\n\n<li>platform-specific builds<\/li>\n\n\n\n<li>rollback is hard after users update<\/li>\n\n\n\n<li>old versions remain in the wild<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Mobile delivery flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Feature branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;PR + CI]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Build signed app]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Internal testing]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;TestFlight \/ Internal track]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;App store review]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Staged rollout]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Crash monitoring]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Full rollout]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Mobile delivery rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use release branches.<\/li>\n\n\n\n<li>Tag shipped versions.<\/li>\n\n\n\n<li>Keep crash monitoring strong.<\/li>\n\n\n\n<li>Use remote config carefully.<\/li>\n\n\n\n<li>Keep backward-compatible APIs.<\/li>\n\n\n\n<li>Maintain old API support.<\/li>\n\n\n\n<li>Treat signing keys as critical secrets.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Delivery workflow for libraries and SDKs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Libraries need version discipline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Library delivery flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Code change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Tests]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Compatibility check]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Version bump]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Changelog]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Tag release]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Publish package]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Semantic Versioning.<\/li>\n\n\n\n<li>Document breaking changes.<\/li>\n\n\n\n<li>Maintain changelog.<\/li>\n\n\n\n<li>Tag releases.<\/li>\n\n\n\n<li>Run compatibility tests.<\/li>\n\n\n\n<li>Publish signed packages if possible.<\/li>\n\n\n\n<li>Support old major versions if needed.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. DevSecOps workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">DevSecOps means security is built into delivery, not bolted on at the end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OWASP\u2019s DevSecOps Maturity Model is a project focused on improving security in software development using DevOps strategies.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Code]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Secret scan]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;SAST]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Dependency scan]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Container scan]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;IaC scan]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Policy check]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Signed artifact]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Deploy]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Security shift-left and shift-right<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Approach<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Shift-left<\/td><td>Find issues earlier in development<\/td><\/tr><tr><td>Shift-right<\/td><td>Detect issues in runtime\/production<\/td><\/tr><tr><td>Best approach<\/td><td>Do both<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Security controls by stage<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Stage<\/th><th>Security control<\/th><\/tr><\/thead><tbody><tr><td>Planning<\/td><td>threat modeling<\/td><\/tr><tr><td>Code<\/td><td>secure coding<\/td><\/tr><tr><td>PR<\/td><td>security review<\/td><\/tr><tr><td>CI<\/td><td>SAST, dependency scan<\/td><\/tr><tr><td>Build<\/td><td>trusted builder<\/td><\/tr><tr><td>Artifact<\/td><td>signing, SBOM<\/td><\/tr><tr><td>Deploy<\/td><td>policy enforcement<\/td><\/tr><tr><td>Runtime<\/td><td>monitoring, detection<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Approval workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Not every change needs the same approval.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Risk-based approval<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Change type<\/th><th>Approval<\/th><\/tr><\/thead><tbody><tr><td>Documentation typo<\/td><td>normal review<\/td><\/tr><tr><td>Small bug fix<\/td><td>one reviewer<\/td><\/tr><tr><td>Feature change<\/td><td>service owner<\/td><\/tr><tr><td>Database migration<\/td><td>backend\/platform owner<\/td><\/tr><tr><td>Infrastructure change<\/td><td>platform owner<\/td><\/tr><tr><td>Security-sensitive change<\/td><td>security owner<\/td><\/tr><tr><td>Production deployment<\/td><td>release owner or automation<\/td><\/tr><tr><td>Emergency hotfix<\/td><td>incident commander\/service owner<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Change] --&gt; B{Risk level?}\n    B -- Low --&gt; C&#91;1 reviewer + CI]\n    B -- Medium --&gt; D&#91;Owner review + CI]\n    B -- High --&gt; E&#91;Owner + security\/platform + approval]\n    B -- Emergency --&gt; F&#91;Fast-track hotfix + post-review]\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Manual vs automated gates<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A mature workflow uses automation for repeatable checks and humans for judgment.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Gate type<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Automated gate<\/td><td>tests, scans, formatting, policy<\/td><\/tr><tr><td>Human gate<\/td><td>design judgment, product risk, operational impact<\/td><\/tr><tr><td>Approval gate<\/td><td>production release, compliance<\/td><\/tr><tr><td>Observability gate<\/td><td>canary promotion, rollback decision<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Bad workflow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Humans manually check everything.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good workflow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Automation checks everything predictable.\nHumans review what requires judgment.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Delivery metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">DORA identifies five software delivery performance metrics: deployment frequency, lead time for changes, change failure rate, failed deployment recovery time, and reliability; DORA describes these metrics as indicators of software delivery performance and organizational outcomes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Key metrics<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Deployment frequency<\/td><td>How often production deployments happen<\/td><\/tr><tr><td>Lead time for changes<\/td><td>Time from code committed to production<\/td><\/tr><tr><td>Change failure rate<\/td><td>Percentage of changes causing failure<\/td><\/tr><tr><td>Failed deployment recovery time<\/td><td>Time to recover from failed deployment<\/td><\/tr><tr><td>Reliability<\/td><td>Ability to meet availability\/performance goals<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Supporting metrics<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Why it matters<\/th><\/tr><\/thead><tbody><tr><td>PR cycle time<\/td><td>Review speed<\/td><\/tr><tr><td>Build duration<\/td><td>CI feedback speed<\/td><\/tr><tr><td>Test flakiness<\/td><td>Pipeline trust<\/td><\/tr><tr><td>Rollback time<\/td><td>Recovery readiness<\/td><\/tr><tr><td>Defect escape rate<\/td><td>Quality<\/td><\/tr><tr><td>Mean time to detect<\/td><td>Observability strength<\/td><\/tr><tr><td>Incident count<\/td><td>Stability<\/td><\/tr><tr><td>Deployment success rate<\/td><td>Pipeline reliability<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Delivery dashboards<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A delivery dashboard should show:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Engineering flow<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PRs open<\/li>\n\n\n\n<li>PR age<\/li>\n\n\n\n<li>build status<\/li>\n\n\n\n<li>deployment frequency<\/li>\n\n\n\n<li>lead time<\/li>\n\n\n\n<li>release calendar<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Quality<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>test pass rate<\/li>\n\n\n\n<li>flaky tests<\/li>\n\n\n\n<li>escaped defects<\/li>\n\n\n\n<li>code coverage trend<\/li>\n\n\n\n<li>failed deployments<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Security<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>open critical vulnerabilities<\/li>\n\n\n\n<li>secret scan failures<\/li>\n\n\n\n<li>unsigned artifacts<\/li>\n\n\n\n<li>dependency age<\/li>\n\n\n\n<li>SBOM status<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Operations<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>error rate<\/li>\n\n\n\n<li>latency<\/li>\n\n\n\n<li>saturation<\/li>\n\n\n\n<li>availability<\/li>\n\n\n\n<li>rollback events<\/li>\n\n\n\n<li>incidents<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. Incident response in delivery workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Incidents are part of delivery. A mature workflow expects them.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Alert]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Triage]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Incident declared]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Mitigate]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Rollback \/ hotfix \/ disable flag]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Monitor recovery]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Postmortem]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Action items]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Improve delivery workflow]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Incident hotfix flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sequenceDiagram\n    participant Dev <span class=\"hljs-keyword\">as<\/span> Engineer\n    participant Repo <span class=\"hljs-keyword\">as<\/span> Source Control\n    participant CI <span class=\"hljs-keyword\">as<\/span> CI Pipeline\n    participant Prod <span class=\"hljs-keyword\">as<\/span> Production\n\n    Dev-&gt;&gt;Repo: Create hotfix branch\n    Dev-&gt;&gt;Repo: Commit minimal fix\n    Dev-&gt;&gt;Repo: Open emergency PR\n    CI-&gt;&gt;Repo: Run critical checks\n    Repo-&gt;&gt;Prod: Deploy hotfix\n    Prod-&gt;&gt;Dev: Validate recovery\n    Dev-&gt;&gt;Repo: Tag patch release\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Incident rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Hotfixes can be fast, but they must still be traceable.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Postmortem workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A postmortem should improve the system, not blame people.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Postmortem template<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Incident Postmortem<\/span>\n\n<span class=\"hljs-comment\">## Summary<\/span>\nWhat happened?\n\n<span class=\"hljs-comment\">## Impact<\/span>\nWho was affected <span class=\"hljs-keyword\">and<\/span> how?\n\n<span class=\"hljs-comment\">## Timeline<\/span>\n- Detection:\n- Mitigation:\n- Recovery:\n\n<span class=\"hljs-comment\">## Root Cause<\/span>\nTechnical <span class=\"hljs-keyword\">and<\/span> process causes.\n\n<span class=\"hljs-comment\">## What went well<\/span>\n<span class=\"hljs-keyword\">List<\/span> positives.\n\n<span class=\"hljs-comment\">## What went poorly<\/span>\n<span class=\"hljs-keyword\">List<\/span> gaps.\n\n<span class=\"hljs-comment\">## Action items<\/span>\n| Action | Owner | Due date |\n|---|---|---|\n\n<span class=\"hljs-comment\">## Delivery workflow improvements<\/span>\nWhat should change in CI\/CD, testing, rollout, monitoring, <span class=\"hljs-keyword\">or<\/span> rollback?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. The role of platform engineering<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Platform engineering improves delivery by giving teams paved roads.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A paved road is a standard, supported way to deliver software safely.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Platform capabilities<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Capability<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Service template<\/td><td>Standard repo scaffold<\/td><\/tr><tr><td>CI\/CD template<\/td><td>Reusable pipeline<\/td><\/tr><tr><td>Deployment template<\/td><td>Helm\/Kustomize\/Terraform module<\/td><\/tr><tr><td>Observability template<\/td><td>Dashboards and alerts<\/td><\/tr><tr><td>Security baseline<\/td><td>Scans and policies<\/td><\/tr><tr><td>Secret management<\/td><td>Standard integration<\/td><\/tr><tr><td>Runtime platform<\/td><td>Kubernetes\/serverless<\/td><\/tr><tr><td>Developer portal<\/td><td>Self-service ownership and docs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Developer]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Service template]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Standard CI]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Standard deployment]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Standard monitoring]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Platform principle<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Make the secure, reliable path the easiest path.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">48. Software delivery workflow by team maturity<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Beginner team<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Git<\/li>\n\n\n\n<li>feature branches<\/li>\n\n\n\n<li>PR reviews<\/li>\n\n\n\n<li>basic CI<\/li>\n\n\n\n<li>manual staging deploy<\/li>\n\n\n\n<li>manual production approval<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>complex Gitflow<\/li>\n\n\n\n<li>too many environments<\/li>\n\n\n\n<li>fragile automation<\/li>\n\n\n\n<li>big-bang releases<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Intermediate team<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>protected main<\/li>\n\n\n\n<li>CI gates<\/li>\n\n\n\n<li>automated builds<\/li>\n\n\n\n<li>staging deployment<\/li>\n\n\n\n<li>release tags<\/li>\n\n\n\n<li>security scans<\/li>\n\n\n\n<li>basic observability<\/li>\n\n\n\n<li>rollback playbook<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Advanced team<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>trunk-based development<\/li>\n\n\n\n<li>feature flags<\/li>\n\n\n\n<li>progressive delivery<\/li>\n\n\n\n<li>GitOps<\/li>\n\n\n\n<li>artifact signing<\/li>\n\n\n\n<li>SBOM<\/li>\n\n\n\n<li>canary analysis<\/li>\n\n\n\n<li>automated rollback<\/li>\n\n\n\n<li>platform templates<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Enterprise team<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>risk-based approvals<\/li>\n\n\n\n<li>policy-as-code<\/li>\n\n\n\n<li>audit-ready release records<\/li>\n\n\n\n<li>environment governance<\/li>\n\n\n\n<li>developer portal<\/li>\n\n\n\n<li>compliance evidence<\/li>\n\n\n\n<li>DORA metrics<\/li>\n\n\n\n<li>SLO-based release gates<\/li>\n\n\n\n<li>supply-chain security<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">49. End-to-end workflow example: SaaS backend<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Product ticket]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Design if needed]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Feature branch]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Code + tests]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;PR]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;CI + security]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Build container]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Push image]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Deploy staging]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;Smoke test]<\/span>\n    <span class=\"hljs-selector-tag\">K<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;Canary production]<\/span>\n    <span class=\"hljs-selector-tag\">L<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">M<\/span><span class=\"hljs-selector-attr\">&#91;Monitor]<\/span>\n    <span class=\"hljs-selector-tag\">M<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">N<\/span><span class=\"hljs-selector-attr\">&#91;100% rollout]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended rules<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main is always deployable\nall changes via PR\nCI required\nimage digest deployed\nfeature flags for risky features\ncanary for production\nrollback plan required\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">50. End-to-end workflow example: Terraform infrastructure<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Infra request]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Design \/ architecture review]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Terraform branch]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;fmt + validate]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Plan]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Security scan]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Cost review]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;PR approval]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Merge]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Apply lower env]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;Apply production with approval]<\/span>\n    <span class=\"hljs-selector-tag\">K<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;Validate infra]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Required PR fields<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">plan summary\nblast radius\nsecurity impact\ncost impact\nrollback plan\naffected environments\nexpected downtime\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">51. End-to-end workflow example: Kubernetes GitOps<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;App PR merged]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build image]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Scan and sign image]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Update GitOps dev manifest]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Argo CD sync dev]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Promote same image to staging]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Promote same image to prod]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Observe rollout]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Rollback by Git revert if needed]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitOps repo changes require PR.<\/li>\n\n\n\n<li>Use image digests, not mutable tags.<\/li>\n\n\n\n<li>Environments are folders.<\/li>\n\n\n\n<li>Production promotion requires approval or policy.<\/li>\n\n\n\n<li>Argo\/Flux reconciles desired state.<\/li>\n\n\n\n<li>Rollback is revert or previous artifact.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">52. End-to-end workflow example: enterprise release<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Approved requirement]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Design review]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Implementation]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;PR + CI]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Security review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Release branch]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;QA validation]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Change approval]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Production deployment]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Release evidence archived]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;Monitoring window]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Required evidence<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Evidence<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>ticket<\/td><td>business reason<\/td><\/tr><tr><td>PR approval<\/td><td>peer review<\/td><\/tr><tr><td>CI logs<\/td><td>quality proof<\/td><\/tr><tr><td>scan results<\/td><td>security proof<\/td><\/tr><tr><td>release tag<\/td><td>traceability<\/td><\/tr><tr><td>approval<\/td><td>governance<\/td><\/tr><tr><td>deployment log<\/td><td>operational record<\/td><\/tr><tr><td>rollback plan<\/td><td>resilience<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">53. Common software delivery anti-patterns<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 1: Manual production deployment<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">SSH to server \u2192 copy file \u2192 restart service\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Why it is bad:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>no traceability<\/li>\n\n\n\n<li>manual mistakes<\/li>\n\n\n\n<li>hard rollback<\/li>\n\n\n\n<li>no repeatability<\/li>\n\n\n\n<li>no audit<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">pipeline deployment <span class=\"hljs-keyword\">with<\/span> artifact version and rollback\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 2: Rebuilding per environment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">build for dev\nbuild again for staging\nbuild again for prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">build once, promote same artifact\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 3: Testing only after merge<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">merge first, discover failure later\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CI before merge\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 4: Big-bang release<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">3 months of work released all at once\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">small batches, feature flags, progressive delivery\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 5: No rollback plan<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">we will figure it out if production breaks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">rollback plan before deployment\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 6: Security at the end<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">build everything, then ask security to approve\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">security checks in every stage\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 7: Staging is not production-like<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">staging passes, production fails because config\/infrastructure differs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">environment parity and IaC\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 8: Ignoring flaky tests<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">rerun until green\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">fix or quarantine flaky tests <span class=\"hljs-keyword\">with<\/span> owner and deadline\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">54. Delivery workflow checklists<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Developer checklist<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- Branch is up to date.\n- Change is small.\n- Tests added or updated.\n- Local checks pass.\n- Commit message is clear.\n- PR explains why and risk.\n- Rollback is known.\n- No secrets committed.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Reviewer checklist<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- Change solves the right problem.\n- Code is simple and maintainable.\n- Tests cover important behavior.\n- Security impact considered.\n- Backward compatibility considered.\n- Observability considered.\n- Rollback plan is reasonable.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Release checklist<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- Correct artifact selected.\n- Version\/tag created.\n- Tests passed.\n- Scans passed.\n- Migration plan ready.\n- Rollback plan ready.\n- Monitoring dashboard ready.\n- On-call\/support informed.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Production deployment checklist<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">- Deployment <span class=\"hljs-built_in\">window<\/span> confirmed <span class=\"hljs-keyword\">if<\/span> needed.\n- Current production health is good.\n- Rollout strategy selected.\n- Alerts enabled.\n- Smoke tests ready.\n- Rollback command known.\n- Owner watching deployment.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">55. Software delivery policy template<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as company policy.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Software Delivery Policy\n\n<span class=\"hljs-number\">1.<\/span> All production software must be stored in source control.\n<span class=\"hljs-number\">2.<\/span> All code changes must go through pull request <span class=\"hljs-keyword\">or<\/span> merge request review.\n<span class=\"hljs-number\">3.<\/span> Main branch must be <span class=\"hljs-keyword\">protected<\/span>.\n<span class=\"hljs-number\">4.<\/span> CI checks must pass before merge.\n<span class=\"hljs-number\">5.<\/span> Build artifacts must be created by trusted CI\/CD pipelines.\n<span class=\"hljs-number\">6.<\/span> Artifacts must be versioned <span class=\"hljs-keyword\">and<\/span> traceable to source commits.\n<span class=\"hljs-number\">7.<\/span> Security scans must run before production deployment.\n<span class=\"hljs-number\">8.<\/span> Production deployments must <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">approved<\/span> <span class=\"hljs-title\">artifacts<\/span>.\n9. <span class=\"hljs-title\">Secrets<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">never<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">stored<\/span> <span class=\"hljs-title\">in<\/span> <span class=\"hljs-title\">source<\/span> <span class=\"hljs-title\">control<\/span>.\n10. <span class=\"hljs-title\">Database<\/span> <span class=\"hljs-title\">migrations<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">backward<\/span>-<span class=\"hljs-title\">compatible<\/span> <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">explicitly<\/span> <span class=\"hljs-title\">approved<\/span>.\n11. <span class=\"hljs-title\">Production<\/span> <span class=\"hljs-title\">releases<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">have<\/span> <span class=\"hljs-title\">rollback<\/span> <span class=\"hljs-title\">plans<\/span>.\n12. <span class=\"hljs-title\">Critical<\/span> <span class=\"hljs-title\">services<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">have<\/span> <span class=\"hljs-title\">monitoring<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">alerts<\/span>.\n13. <span class=\"hljs-title\">Hotfixes<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">traceable<\/span>, <span class=\"hljs-title\">even<\/span> <span class=\"hljs-title\">when<\/span> <span class=\"hljs-title\">expedited<\/span>.\n14. <span class=\"hljs-title\">Release<\/span> <span class=\"hljs-title\">evidence<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">retained<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">audit<\/span>-<span class=\"hljs-title\">critical<\/span> <span class=\"hljs-title\">systems<\/span>.\n15. <span class=\"hljs-title\">Delivery<\/span> <span class=\"hljs-title\">metrics<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">reviewed<\/span> <span class=\"hljs-title\">regularly<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">56. The ideal modern software delivery workflow<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Idea \/ Ticket] --&gt; B&#91;Small delivery slice]\n    B --&gt; C&#91;Design <span class=\"hljs-keyword\">if<\/span> risky]\n    C --&gt; D&#91;Short-lived branch]\n    D --&gt; E&#91;Code + tests]\n    E --&gt; F&#91;Pull request]\n    F --&gt; G&#91;CI: test, build, scan]\n    G --&gt; H{Pass + approved?}\n    H -- No --&gt; E\n    H -- Yes --&gt; I&#91;Merge to <span class=\"hljs-keyword\">protected<\/span> main]\n    I --&gt; J&#91;Build immutable artifact]\n    J --&gt; K&#91;Sign + scan + store artifact]\n    K --&gt; L&#91;Deploy to lower environment]\n    L --&gt; M&#91;Automated validation]\n    M --&gt; N&#91;Progressive production rollout]\n    N --&gt; O&#91;Observe metrics]\n    O --&gt; P{Healthy?}\n    P -- Yes --&gt; Q&#91;Complete release]\n    P -- No --&gt; R&#91;Rollback \/ disable flag \/ fix forward]\n    Q --&gt; S&#91;Measure <span class=\"hljs-keyword\">and<\/span> improve]\n    R --&gt; S\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">57. The final one-page delivery model<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Slice work small.\n<span class=\"hljs-number\">2.<\/span> Design risky changes.\n<span class=\"hljs-number\">3.<\/span> Use short-lived branches.\n<span class=\"hljs-number\">4.<\/span> Require pull request review.\n<span class=\"hljs-number\">5.<\/span> Run CI before merge.\n<span class=\"hljs-number\">6.<\/span> Build once <span class=\"hljs-keyword\">in<\/span> trusted CI.\n<span class=\"hljs-number\">7.<\/span> Scan and sign artifacts.\n<span class=\"hljs-number\">8.<\/span> Store artifacts immutably.\n<span class=\"hljs-number\">9.<\/span> Promote the same artifact.\n<span class=\"hljs-number\">10.<\/span> Separate deployment <span class=\"hljs-keyword\">from<\/span> release.\n<span class=\"hljs-number\">11.<\/span> Use feature flags <span class=\"hljs-keyword\">for<\/span> risk.\n<span class=\"hljs-number\">12.<\/span> Use progressive rollout <span class=\"hljs-keyword\">for<\/span> production.\n<span class=\"hljs-number\">13.<\/span> Observe every deployment.\n<span class=\"hljs-number\">14.<\/span> Roll back quickly when needed.\n<span class=\"hljs-number\">15.<\/span> Learn <span class=\"hljs-keyword\">from<\/span> every incident.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">58. Final wisdom<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A beginner thinks software delivery is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">write code and deploy\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A developer thinks software delivery is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">branch, PR, test, merge\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A DevOps engineer thinks software delivery is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pipeline, artifact, environment, deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A senior engineer thinks software delivery is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">safe, repeatable flow <span class=\"hljs-keyword\">from<\/span> idea to production\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">An architect thinks software delivery is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">a socio-technical system that balances speed, quality, security, reliability, governance, and learning\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best software delivery workflow is not the one with the most tools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The best workflow is the one where:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>small changes move quickly<\/li>\n\n\n\n<li>risky changes are controlled<\/li>\n\n\n\n<li>quality is automated<\/li>\n\n\n\n<li>security is built in<\/li>\n\n\n\n<li>releases are traceable<\/li>\n\n\n\n<li>rollback is boring<\/li>\n\n\n\n<li>production is observable<\/li>\n\n\n\n<li>teams learn continuously<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Final principle:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Great software delivery is not about deploying faster.\nIt is about making safe delivery fast.\n<\/code><\/span><\/pre>","protected":false},"excerpt":{"rendered":"<p>From Beginner to Advanced: A Complete One-Stop Guide to Delivering Software Safely, Fast, and Reliably 1. What is software delivery workflow? A software delivery workflow is the&#8230; <\/p>\n","protected":false},"author":1,"featured_media":77512,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77511","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=77511"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77511\/revisions"}],"predecessor-version":[{"id":77513,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77511\/revisions\/77513"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/77512"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}