What Is CI/CD? Continuous Integration and Delivery Explained
CI/CD automates building, testing, and shipping code on every change. How continuous integration and continuous delivery/deployment fit together.
CI/CD refers to a pair of related practices — continuous integration and continuous delivery (or deployment) — that automate the path from a code change to a running production system. Continuous integration automatically builds and tests every change as it’s merged; continuous delivery or deployment automatically pushes changes that pass those checks toward, or all the way into, production.
Continuous integration: catch problems early
Continuous integration (CI) means merging code changes into a shared branch frequently — often multiple times a day — with an automated pipeline running on every push. That pipeline typically:
- Builds the project from source.
- Runs the test suite (unit, integration, sometimes end-to-end).
- Runs static checks — linting, type checking, formatting verification.
- Reports pass/fail back to the pull request before it can be merged.
The point is to surface integration problems — a broken build, a failing test, a type error — within minutes of a change being made, rather than days later when several people’s changes have piled on top of each other and the source of a regression is much harder to isolate.
Continuous delivery vs continuous deployment
The second “CD” is ambiguous on purpose, because it names two different levels of automation. Continuous delivery and continuous deployment both mean every change that passes CI is automatically packaged and made ready to release — the difference is what happens next. Continuous delivery stops just short of production, leaving a human to click a button and approve the actual release. Continuous deployment removes that manual gate entirely: a change that passes every automated check ships to production without anyone pressing a button.
Continuous deployment demands much more confidence in the test suite, since there’s no human in the loop to catch a subtle bug before customers see it. Most teams start with continuous delivery and only move to full deployment once their automated checks — and their rollback strategy — have proven reliable enough to trust.
A typical pipeline, end to end
A CI/CD pipeline for a web application commonly looks like this:
- A developer pushes a commit or opens a pull request.
- CI builds the project and runs tests, linting, and type checks.
- On merge to the main branch, the pipeline builds a deployable artifact — a container image via a Dockerfile, a compiled binary, a static site bundle.
- The artifact deploys to a staging environment for further automated or manual checks.
- It’s promoted to production, often using a canary or blue-green rollout that shifts traffic gradually rather than all at once.
- Monitoring watches error rates and key metrics after the release, ready to trigger an automatic rollback if something looks wrong.
Why it matters
Before CI/CD became standard, teams often merged large batches of work infrequently and shipped through a manual, error-prone release process — sometimes called “integration hell,” where reconciling weeks of divergent changes at once produced far more conflicts and bugs than reconciling them incrementally. Automating the build-test-release loop turns deployment from a rare, risky event into a routine one, which in turn makes it safe to ship smaller changes more often — each individual release carries less risk simply because it contains less change.
CI/CD and infrastructure
Modern CI/CD pipelines increasingly manage infrastructure the same way they manage application code. Infrastructure as code means the servers, networking, and configuration a deployment depends on are defined in version-controlled files and applied through the same pipeline, rather than configured by hand. Taken further, GitOps treats a Git repository as the single source of truth for both application and infrastructure state, with automation continuously reconciling the live system to match whatever’s committed.
Feature flags often pair with continuous deployment specifically, letting a team ship code to production behind a flag that’s initially off — decoupling the act of deploying from the act of releasing a feature to users, and giving continuous deployment an extra layer of safety even without a manual approval gate.
The takeaway
CI/CD automates the two halves of getting code from a developer’s machine into production: continuous integration builds and tests every change immediately, and continuous delivery or deployment automatically pushes what passes toward release — with a human approval gate for delivery, or none at all for full deployment. The payoff is smaller, lower-risk releases shipped far more often than a manual process could sustain, provided the automated test suite is trustworthy enough to catch what a human reviewer would have caught anyway.
Tagged
Keep reading
Chisato · · 5 min read What Are Reproducible Builds? Verifiable Software, Explained
Reproducible builds produce bit-for-bit identical output from the same source, so anyone can verify a binary. Why they matter and how to achieve them.
Chisato · · 5 min read Pulumi vs Terraform: Code vs Declarative Config for IaC
Pulumi defines infrastructure in general-purpose languages like TypeScript and Python; Terraform uses its own declarative HCL. Here's how they differ.
The Lycoris Team · · 4 min read Deployment Rollback Strategies: Roll Back vs Forward
Rolling back reverts to the last known-good deploy; rolling forward ships a fix on top of the bad one. How to choose, and why database changes complicate both.