<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged cd</title>
<link>https://coderlegion.com/tag/cd</link>
<description>Powered by Question2Answer</description>
<item>
<title>What Is CI/CD? A Plain-English Guide for Teams Shipping Software Daily</title>
<link>https://coderlegion.com/32665/what-is-ci-cd-a-plain-english-guide-for-teams-shipping-software-daily</link>
<description>&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;If you have spent any time around software teams, you have probably heard someone say, “It’s already in the pipeline.” That pipeline is usually a CI/CD pipeline, and it quietly powers much of the modern internet. So, what is CI/CD, and why do developers talk about it so often?&lt;/p&gt;
&lt;p&gt;In simple terms, CI/CD is a set of practices that helps teams build, test, and release software in small, safe steps instead of one risky leap. I have watched teams go from stressful monthly releases to calm daily deployments once they adopted it. This guide explains the idea in plain language, so even a newcomer can follow along.&lt;/p&gt;
&lt;h3 id=&quot;what-is-ci-cd-in-simple-words-&quot;&gt;What Is CI/CD in Simple Words?&lt;/h3&gt;
&lt;p&gt;Let’s answer the core question directly. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.globallogic.com/glossary/continuous-integration-continuous-delivery-ci-cd/&quot;&gt;What is CI/CD?&lt;/a&gt; It stands for continuous integration and continuous delivery (or continuous deployment). Think of it as an assembly line for code. A developer writes a change, and the system automatically checks it, packages it, and prepares it for users.&lt;/p&gt;
&lt;p&gt;Before this approach became common, developers often worked alone for weeks. When they finally merged their work, everything clashed, and fixing it took days. CI/CD solves that by encouraging small, frequent updates that are verified automatically.&lt;/p&gt;
&lt;h3 id=&quot;understanding-continuous-integration&quot;&gt;Understanding Continuous Integration&lt;/h3&gt;
&lt;p&gt;Continuous integration, the “CI” part, is the habit of merging code into a shared repository often, sometimes several times a day. Each time someone pushes a change, an automated process builds the application and runs tests.&lt;/p&gt;
&lt;p&gt;If something breaks, the team knows within minutes rather than weeks. The developer who caused the problem still remembers what they changed, so the fix is quick. This is the first big reason people ask what is CI/CD and then decide to adopt it: it catches mistakes while they are still small and cheap to fix.&lt;/p&gt;
&lt;h3 id=&quot;understanding-continuous-delivery-and-deployment&quot;&gt;Understanding Continuous Delivery and Deployment&lt;/h3&gt;
&lt;p&gt;The “CD” has two common meanings, and they are easy to confuse.&lt;/p&gt;
&lt;p&gt;Continuous delivery means every change that passes testing is automatically prepared for release. A person still decides when to press the final button. Continuous deployment goes one step further, because passing code goes live without any manual approval.&lt;/p&gt;
&lt;p&gt;Which one is right depends on your team and your industry. A bank may prefer a human sign-off before each release, while a small content website might happily deploy automatically. Either way, the CI/CD idea is the same: remove slow, error-prone manual steps.&lt;/p&gt;
&lt;h3 id=&quot;how-a-ci-cd-pipeline-actually-works&quot;&gt;How a CI/CD Pipeline Actually Works&lt;/h3&gt;
&lt;p&gt;A pipeline is simply the sequence of automated steps that code travels through. While every company sets theirs up a little differently, the journey usually looks like this in practice.&lt;/p&gt;
&lt;p&gt;A developer commits code to a repository such as GitHub or GitLab. That commit triggers the pipeline, which first builds the application. Next, automated tests run, covering everything from tiny unit checks to broader integration tests. If the tests pass, the pipeline packages the software and sends it to a staging environment, where it can be reviewed in conditions close to the real thing. Finally, the release moves to production, either automatically or after approval.&lt;/p&gt;
&lt;p&gt;When someone asks me what is CI/CD in a practical sense, I describe it as a safety net. It does not stop you from making mistakes, but it makes sure mistakes are noticed early and do not reach customers.&lt;/p&gt;
&lt;h3 id=&quot;why-teams-rely-on-ci-cd&quot;&gt;Why Teams Rely on CI/CD&lt;/h3&gt;
&lt;p&gt;The benefits show up quickly once a pipeline is running smoothly. Releases become faster because machines handle repetitive work. Quality improves because every change faces the same tests, every time. Teams also gain confidence, since a deployment stops feeling like a high-stakes event.&lt;/p&gt;
&lt;p&gt;There is a human benefit too. Developers spend less time on tedious manual checks and more time on creative problem solving. Industry research, including the widely cited DORA reports from &lt;a rel=&quot;nofollow&quot; href=&quot;https://cloud.google.com/?utm_source=google&amp;amp;amp;utm_medium=cpc&amp;amp;amp;utm_campaign=Cloud-SS-DR-GCP-1713664-GCP-DR-APAC-IN-en-Google-BKWS-BRO-Infrastructure&amp;amp;amp;utm_content=c-Hybrid%20%7C%20BKWS%20-%20BRO%20%7C%20Txt%20-%20Infrastructure-Storage-Filestore-IN_en-&amp;amp;amp;utm_term=&amp;amp;amp;gclsrc=aw.ds&amp;amp;amp;gad_source=1&amp;amp;amp;gad_campaignid=8068803054&amp;amp;amp;gclid=EAIaIQobChMImLnd5oHNlwMV9xJECB0wTi-mEAAYASAAEgLNY_D_BwE&quot;&gt;Google Cloud&lt;/a&gt;, has consistently linked strong delivery practices with better team performance. That is a good reason to take what is CI/CD seriously rather than treating it as a passing trend.&lt;/p&gt;
&lt;h3 id=&quot;popular-tools-you-will-hear-about&quot;&gt;Popular Tools You Will Hear About&lt;/h3&gt;
&lt;p&gt;You do not need to master every tool, but a few names appear constantly. Jenkins is a long-standing open-source automation server. GitHub Actions and GitLab CI are built into popular code hosting platforms and are friendly for beginners. CircleCI and Azure DevOps are also widely used, and cloud providers offer their own pipeline services.&lt;/p&gt;
&lt;p&gt;The best choice is usually the one that fits where your code already lives. Start simple, and avoid overengineering your first setup.&lt;/p&gt;
&lt;h3 id=&quot;common-mistakes-beginners-make&quot;&gt;Common Mistakes Beginners Make&lt;/h3&gt;
&lt;p&gt;Many teams stumble in predictable ways. Some write too few tests, so the pipeline passes even when the software is broken. Others build pipelines so slow that developers stop waiting for them. A third common problem is ignoring failed builds, which defeats the entire purpose.&lt;/p&gt;
&lt;p&gt;A healthy pipeline should be fast, trustworthy, and treated as a shared responsibility. If a build fails, fixing it becomes the team’s top priority.&lt;/p&gt;
&lt;h3 id=&quot;how-to-get-started&quot;&gt;How to Get Started&lt;/h3&gt;
&lt;p&gt;If you are still wondering what is CI/CD and how to try it yourself, begin small. Pick a project, connect it to a free tool such as GitHub Actions, and automate just one thing, perhaps running your tests on every push. Once that works reliably, add packaging, then a staging deployment, and grow from there.&lt;/p&gt;
&lt;p&gt;Security matters as well. Keep passwords and API keys out of your code, store them in your tool’s secret manager, and review who can approve releases.&lt;/p&gt;
&lt;h3 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;So, what is CI/CD? It is a practical way of working that turns software delivery from a nerve-racking event into a routine, repeatable process. It rewards small changes, constant feedback, and automation of anything boring.&lt;/p&gt;
&lt;p&gt;You do not need a large team or an expensive setup to benefit. Start with a single automated test, learn from each failure, and improve step by step. Over time, you will wonder how you ever shipped software any other way.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32665/what-is-ci-cd-a-plain-english-guide-for-teams-shipping-software-daily</guid>
<pubDate>Tue, 27 Oct 2026 11:30:01 +0000</pubDate>
</item>
<item>
<title>The Night My Pipeline Rejected 43.8% of Everything — and Was Right</title>
<link>https://coderlegion.com/31505/the-night-my-pipeline-rejected-43-8-of-everything-and-was-right</link>
<description>&lt;p&gt;Last month, my automated software-ingestion pipeline did something terrifying: it rejected &lt;strong&gt;43.8% of all updates&lt;/strong&gt; in a single run. Forty-three point eight percent. My first instinct was that the pipeline was broken. It wasn't. It was the only thing in the room doing its job.&lt;/p&gt;
&lt;p&gt;I run an open software catalog. Every few days, an automated pipeline pulls new releases from vendors, GitHub, and F-Droid, verifies them, and publishes them. That night it pulled the fire alarm on nearly half the catalog &amp;mdash; two SHA-256 hash mismatches (Google Chrome and CCleaner, of all things) and twelve signature mismatches across apps like Obsidian, Tor, and Ventoy.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I learned fixing it, distilled into the checklist I now run before any binary goes live.&lt;/p&gt;
&lt;h2&gt;1. START WITH THE HASH &amp;mdash; BUT KNOW WHAT IT CAN&amp;rsquo;T TELL YOU&lt;/h2&gt;
&lt;p&gt;Every release I publish carries a SHA-256 checksum, recomputed at download time. It&amp;rsquo;s the cheapest integrity check in existence:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sha256sum installer.exe
# compare against the publisher's published value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the hash doesn&amp;rsquo;t match, stop. Don&amp;rsquo;t install it, don&amp;rsquo;t &amp;ldquo;try it anyway.&amp;rdquo; A mismatched hash means the file changed in transit &amp;mdash; or it isn&amp;rsquo;t the file the publisher shipped. That night, Chrome and CCleaner&amp;rsquo;s hashes didn&amp;rsquo;t match their expected values. The pipeline refused them, and rightly so: a hash mismatch is never a rounding error.&lt;/p&gt;
&lt;p&gt;But a hash answers only one question: &lt;em&gt;did this file change?&lt;/em&gt; It says nothing about &lt;em&gt;who made it&lt;/em&gt;. That&amp;rsquo;s what signatures are for.&lt;/p&gt;
&lt;h2&gt;2. VERIFY THE SIGNATURE, NOT JUST THE CHECKSUM&lt;/h2&gt;
&lt;p&gt;A checksum tells you the file is intact. A signature tells you it came from the right key. For Android packages, the tooling is free:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apksigner verify --print-certs app.apk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The critical step most people skip: check that the certificate &lt;strong&gt;fingerprint&lt;/strong&gt; matches the publisher&amp;rsquo;s known key. The first time you see a new fingerprint on a familiar app, treat it as suspicious until proven otherwise. For desktop software, GPG serves the same role:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --verify installer.exe.sig installer.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The pattern is identical everywhere: fetch the artifact, fetch the signature, verify against the publisher&amp;rsquo;s public key. And if a project ships binaries with no signatures at all? That&amp;rsquo;s a data point about the project &amp;mdash; not a reason to skip verification.&lt;/p&gt;
&lt;h2&gt;3. ENROLLMENT IS THE HALF OF VERIFICATION EVERYONE FORGETS&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the mistake that cost me a week. My pipeline verified every APK signature &lt;em&gt;correctly&lt;/em&gt; &amp;mdash; and still rejected twelve apps. The parser wasn&amp;rsquo;t broken. The cryptography was fine. The problem: &lt;strong&gt;I had never enrolled those signers in the first place.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Signature verification has two halves, and I was only doing one:&lt;/p&gt;
&lt;p&gt;1. Is this signature cryptographically valid? &lt;em&gt;(the tool answers this)&lt;/em&gt;&lt;br&gt;
2. Do I recognize this signer? &lt;em&gt;(only my allowlist answers this)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Twelve apps were signed by keys my system had simply never recorded &amp;mdash; new maintainers, rotated keys, corporate renames. My favorite: a publisher whose legal name changed by a single dot (&amp;ldquo;Dynalist Inc.&amp;rdquo; vs &amp;ldquo;Dynalist Inc&amp;rdquo;), which my strict string match treated as a stranger. The pipeline was doing its job; my trust store was incomplete.&lt;/p&gt;
&lt;p&gt;The fix is boring and essential. Keep an explicit registry of known-good signers per package, keyed by certificate fingerprint:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# trust_store.json &amp;mdash; enrolled signers, one entry per package
{
  &quot;com.example.app&quot;: {
    &quot;fingerprints&quot;: [&quot;AB:CD:EF:12:34...&quot;],
    &quot;enrolled_on&quot;: &quot;2026-10-13&quot;,
    &quot;note&quot;: &quot;Key rotation announced in v4.2 changelog&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When a new fingerprint appears, that&amp;rsquo;s an &lt;strong&gt;event&lt;/strong&gt;, not an error &amp;mdash; investigate it once, enroll it deliberately, and move on. Auto-trusting unknown signers defeats the entire purpose.&lt;/p&gt;
&lt;h2&gt;4. REJECT LOUDLY &amp;mdash; WITH A THRESHOLD YOU CHOSE IN ADVANCE&lt;/h2&gt;
&lt;p&gt;A verification system that silently accepts everything is decoration. Mine fails the entire ingestion run closed if more than 15% of updates get rejected. That number is deliberate: a sudden spike means either the upstream world changed (keys rotated, publishers restructured) or my pipeline broke. Either way, I want a human looking at it before anything ships.&lt;/p&gt;
&lt;p&gt;The exact threshold matters less than the principle: decide in advance what &amp;ldquo;too many failures&amp;rdquo; looks like, and make the pipeline &lt;strong&gt;stop&lt;/strong&gt; instead of shrugging. Quiet failures are how bad binaries reach users. My 43.8% night looked like a disaster and was actually the system working exactly as designed &amp;mdash; it just needed a human to enroll the new signers and re-run.&lt;/p&gt;
&lt;h2&gt;5. DECIDE IN ADVANCE WHAT TO DO WITH THE UNVERIFIABLE&lt;/h2&gt;
&lt;p&gt;Not everything is signable. Some legitimate tools ship unsigned binaries &amp;mdash; portable builds, indie utilities, projects too small for signing infrastructure. You have three honest options: reject them, allowlist them explicitly, or verify them another way (reproducible builds, publisher-published hashes fetched over HTTPS).&lt;/p&gt;
&lt;p&gt;I allowlist them &amp;mdash; explicitly, per binary, with a written reason. What I never do is let an unsigned binary through on a technicality. &amp;ldquo;The check didn&amp;rsquo;t apply&amp;rdquo; is not the same as &amp;ldquo;the check passed,&amp;rdquo; and conflating the two is how exceptions quietly become the rule. Ventoy&amp;rsquo;s unsigned binary, for example, sits in my allowlist with a note explaining why &amp;mdash; visible, reviewable, deliberate.&lt;/p&gt;
&lt;h2&gt;THE CHECKLIST&lt;/h2&gt;
&lt;p&gt;Before any binary goes live:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SHA-256 matches the publisher&amp;rsquo;s published value (recomputed at download, not trusted from a mirror)&lt;/li&gt;
&lt;li&gt;Signature verifies against the publisher&amp;rsquo;s known key&lt;/li&gt;
&lt;li&gt;Signer fingerprint is in the enrolled registry &amp;mdash; new fingerprints get investigated, never auto-trusted&lt;/li&gt;
&lt;li&gt;Rejection rate for the run is under threshold, or the whole run stops&lt;/li&gt;
&lt;li&gt;Unsigned artifacts are explicitly allowlisted with a written reason &amp;mdash; never silently passed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is exotic. It&amp;rsquo;s plumbing. But it&amp;rsquo;s the plumbing between a stranger&amp;rsquo;s server and your users&amp;rsquo; machines, and every piece of it earns its place the first time it catches something. Mine caught something on a random Tuesday night, rejected nearly half the catalog, and was right.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31505/the-night-my-pipeline-rejected-43-8-of-everything-and-was-right</guid>
<pubDate>Sat, 17 Oct 2026 09:46:03 +0000</pubDate>
</item>
<item>
<title>Internal Engineering Standard</title>
<link>https://coderlegion.com/11451/internal-engineering-standard</link>
<description>&lt;h2 id=&quot;dns-first-connectivity-for-distributed-systems&quot;&gt;DNS-First Connectivity for Distributed Systems&lt;/h2&gt;
&lt;h3 id=&quot;1-mandatory-rule&quot;&gt;1. Mandatory Rule&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;All services must be addressed by DNS/service name.
localhost, 127.0.0.1, or static IPs are forbidden outside single-process unit tests.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-scope&quot;&gt;2. Scope&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;Applies to:

Applications

ETL / MDM jobs

Kafka producers &amp;amp; consumers

Kafka Connect

CI/CD pipelines

Batch jobs, CronJobs, sidecars
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-environment-specific-naming-policy&quot;&gt;3. Environment-Specific Naming Policy&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;Local (Docker / Compose)

kafka:9092
zookeeper:2181
elasticsearch:9200
connect:8083
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;Kubernetes

kafka.&amp;lt;namespace&amp;gt;.svc.cluster.local:9092
elasticsearch.&amp;lt;namespace&amp;gt;.svc.cluster.local:9200
connect.&amp;lt;namespace&amp;gt;.svc.cluster.local:8083
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;rule-&quot;&gt;Rule:&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;Service name stays constant.
Only the DNS suffix changes per environment.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-prohibited-patterns&quot;&gt;4. Prohibited Patterns&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;The following are architecture violations:

localhost:*

127.0.0.1:*

Hard-coded pod IPs

Node IPs

Hostnames tied to machines
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-configuration-requirements&quot;&gt;5. Configuration Requirements&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;All endpoints must be externalized (env vars, config files, Helm values)

No environment-specific logic in code

No string replacement during deployment
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;6-ci-cd-enforcement&quot;&gt;6. CI/CD Enforcement&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;Pipelines must fail if:

localhost appears in configs

IP literals are detected

Environment-specific rewrites are required

Static scans are mandatory.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;7-kafka-specific-rules&quot;&gt;7. Kafka-Specific Rules&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;bootstrap.servers must use DNS

Kafka Connect REST must be addressed via service DNS

No broker IPs in configs

No advertised.listeners pointing to localhost
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;8-kubernetes-requirements&quot;&gt;8. Kubernetes Requirements&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;All services exposed via Service objects

Stateful systems use headless services when required

Pods may never reference other pods directly by IP
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;9-reliability-amp-audit-rationale&quot;&gt;9. Reliability &amp;amp; Audit Rationale&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;This standard ensures:

Zero config rewrites across environments

Predictable scaling

Restart tolerance

CI/CD portability

MDM lineage stability

Audit-safe deployments
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;10-non-compliance-impact&quot;&gt;10. Non-Compliance Impact&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;Violations will cause:

Deployment rejection

CI/CD failure

Architecture review

Mandatory refactor before promotion
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;final-principle&quot;&gt;Final Principle&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-code&quot;&gt;DNS is not networking detail — it is system architecture.
If a component is not reachable by DNS, it is not production-ready.
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/11451/internal-engineering-standard</guid>
<pubDate>Wed, 11 Feb 2026 12:27:38 +0000</pubDate>
</item>
</channel>
</rss>