<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Cloud & DevOps Notes]]></title><description><![CDATA[Notes on Cloud and DevOps for product teams.
Azure, AWS, and GCP. Azure DevOps and GitHub Actions. Terraform. Kubernetes / AKS. CI/CD. Pipelines that look green]]></description><link>https://itsmuthu.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Cloud &amp; DevOps Notes</title><link>https://itsmuthu.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 07:24:29 GMT</lastBuildDate><atom:link href="https://itsmuthu.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[A green pipeline is not a successful release]]></title><description><![CDATA[Your pipeline can be green and still be unsafe to ship.
I have opened a succeeded run, then opened the live site, more times than I want to count. The board is green. Release notes already went out. S]]></description><link>https://itsmuthu.hashnode.dev/a-green-pipeline-is-not-a-successful-release</link><guid isPermaLink="true">https://itsmuthu.hashnode.dev/a-green-pipeline-is-not-a-successful-release</guid><category><![CDATA[azure-devops]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Terraform]]></category><category><![CDATA[ci-cd]]></category><dc:creator><![CDATA[Muthu Kumar Murugaiyan]]></dc:creator><pubDate>Mon, 21 Sep 2026 21:28:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ab19736568a7f75c2e6e6f5/912012bc-a12f-4e6f-9075-c0b2fffaf234.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Your pipeline can be green and still be unsafe to ship.</p>
<p>I have opened a succeeded run, then opened the live site, more times than I want to count. The board is green. Release notes already went out. Support is already in a ticket. The pipeline did what we asked: it finished jobs. It did not prove the product.</p>
<p>That gap is not a YAML typo. The badge answered a different question than the one the user is asking.</p>
<h2>What “Succeeded” actually means</h2>
<p>A green job means the delivery system completed the steps you wrote. It does not mean:</p>
<ul>
<li>the same bits that passed staging are what production is running</li>
<li>the process stayed up</li>
<li>a customer can complete a request</li>
<li>yesterday’s revision can be put back without a rebuild</li>
</ul>
<p>Treat “Succeeded” as “the script finished.” Product health is a separate fact. If you debug YAML first, you often spend an hour on the wrong file.</p>
<h2>Three identities that must match</h2>
<p>Before anyone rewrites a pipeline, write one sentence:</p>
<blockquote>
<p>This artifact is on this target, the process is running, this user path fails at this hop.</p>
</blockquote>
<p>If you cannot write that sentence, you are still locating the release.</p>
<h3>1. The artifact</h3>
<p>Staging built once. Production rebuilt from the same commit. Restore, package feeds, base images, and even the agent image can differ between those two compiles. You did not promote a revision. You compiled a cousin and called it a release.</p>
<p>Name the artifact ID or image digest that went out — not “the latest run.” Compare it to what staging ran. If they differ, stop talking about “the same release.”</p>
<h3>2. The target</h3>
<p>Slot, namespace, App Service, VM, traffic manager, ingress host. Staging success plus production traffic on the old bits is a common mystery. Swap skipped. Hostname still on the previous slot. Environment name in YAML is a label, not a control.</p>
<p>If production is only a stage display name — no Azure DevOps Environment, no approval, no lock, no check on the service connection — anyone who can queue the pipeline can reach production.</p>
<h3>3. The user path</h3>
<p>A <code>/health</code> 200 from inside the job is not a customer completing a request. After deploy, hit a real URL with the same kind of identity a user would use: login, one write, one read. If that job is not allowed to fail the release, you will keep shipping green badges onto broken apps.</p>
<p>Dependencies sit here too: database firewall, Key Vault, DNS, private endpoint, an API you do not own. The pipeline cannot see those unless you added a smoke check that can.</p>
<h2>What I change first</h2>
<p>The rest can wait a week. These four changes stop the most common green-but-broken night:</p>
<ol>
<li><strong>Build once.</strong> Store the artifact. Every later stage consumes that revision.</li>
<li><strong>Put production behind an Environment</strong> with an approval and a lock.</li>
<li><strong>Add one smoke job</strong> against a real URL, allowed to fail the release.</li>
<li><strong>Add a rollback job</strong> that redeploys the previous artifact without rebuilding.</li>
</ol>
<p>If rollback needs a person who is asleep, you do not have rollback. You have hope.</p>
<p>Secrets belong in a store with a trail, not in YAML, chat, or a variable group that everyone on the project can read. Rotation that is painful is rotation that does not happen. That is a separate week of work. Do not let it block the four items above.</p>
<h2>Terraform is the same pattern</h2>
<p>People argue about HCL when the argument is in the wrong file. The <code>.tf</code> files are intent. State is what Terraform believes exists. A plan that looks clean on a laptop can still be a bad night in CI if the backend key is shared across environments or state lived on one machine.</p>
<p>Same rule as artifacts: one identity, one place, promote it. Do not rebuild a cousin and call it the same environment.</p>
<h2>A Monday check</h2>
<p>Pick the last production run. Ask, in order:</p>
<ol>
<li>What artifact ID or image digest went out?</li>
<li>Which Environment and service connection deployed it?</li>
<li>What smoke ran against a real URL?</li>
<li>How would we put yesterday’s artifact back, using this same pipeline, without rebuilding?</li>
</ol>
<p>If any answer is “we think so,” stop treating the pipeline as a release system. It is a script with a green badge.</p>
<p>If you only fix one thing this week: build once, store the artifact, promote that same revision. Everything else in CI/CD gets easier after that identity exists.</p>
<hr />
<p>I write about production delivery problems at <a href="https://www.itscloudhub.com">ItsCloudHub</a>.</p>
]]></content:encoded></item></channel></rss>