What is CI/CD?
2026-03-19
If you've been around software development for more than five minutes, you've heard someone say "we need CI/CD." It gets thrown around like everyone already knows what it means. A lot of people nod along without a clear picture of what's actually happening.
Let's break it down.
CI and CD Are Two Different Things
CI stands for Continuous Integration. It's the practice of automatically building and testing your code every time someone pushes a change. The idea is simple: integrate early, integrate often, and catch problems before they compound.
CD stands for Continuous Delivery (or sometimes Continuous Deployment, depending on who you ask). Continuous Delivery means your code is always in a deployable state — every change that passes tests is ready to go to production. Continuous Deployment takes it one step further: every passing change is automatically deployed without human intervention.
Most teams start with CI and Continuous Delivery. Full Continuous Deployment is the goal, but it requires a mature test suite and a lot of trust in your pipeline.
Why It Matters
Without CI/CD, here's what happens: a developer writes code for a week, creates a pull request, and merges it. Then someone manually builds the application, manually runs tests (maybe), and manually deploys it to a server. Every step is a chance for human error.
With CI/CD, every code change triggers an automated pipeline. Tests run immediately. Builds happen automatically. Deployments are consistent and repeatable. The feedback loop shrinks from days to minutes.
The result: fewer bugs in production, faster releases, and developers who spend their time writing code instead of babysitting deployments.
The Basic Pipeline Stages
A typical CI/CD pipeline has four stages:
1. Source
Everything starts with a code change. A developer pushes to a branch or opens a pull request. This triggers the pipeline.
If you're using Git (and you should be), this is where your branching strategy matters. A clean branching model makes CI/CD much easier to implement.
2. Build
The pipeline compiles your code, resolves dependencies, and produces an artifact — a Docker image, a compiled binary, a bundled application. If the build fails, the pipeline stops and the developer gets notified immediately.
3. Test
Automated tests run against the build artifact. This typically includes unit tests, integration tests, and sometimes end-to-end tests. The key word is "automated." If your tests require someone to click through the app manually, you don't have CI — you have a build server.
4. Deploy
If the build and tests pass, the pipeline deploys the artifact to an environment. This might be a staging environment for review, or straight to production if you're doing continuous deployment.
Tools Overview
There are dozens of CI/CD tools. Here are the ones I see most often:
GitHub Actions — If your code is on GitHub, this is the easiest place to start. It's built into the platform, has a huge marketplace of pre-built actions, and the YAML-based configuration is straightforward. I wrote a detailed walkthrough on automating AWS deployments with GitHub Actions.
Jenkins — The granddaddy of CI/CD tools. It's open source, infinitely configurable, and runs anywhere. The downside: it requires maintenance. Someone has to manage the Jenkins server, update plugins, and keep it healthy. For teams with dedicated DevOps engineers, it's still a solid choice.
AWS CodePipeline / CodeBuild — If you're all-in on AWS, their native CI/CD tools integrate tightly with the rest of the ecosystem. I covered CodeBuild specifically and how it fits into the AWS DevOps picture. For source control, AWS also offers CodeCommit, though most teams I work with stick with GitHub.
GitLab CI/CD — Similar to GitHub Actions but built into GitLab. If your team uses GitLab for source control, this is the natural choice.
CircleCI, Travis CI, Azure DevOps — All solid options with different strengths. The best tool is the one your team will actually use and maintain.
How to Get Started
If you're starting from zero, here's my recommended path:
Start with CI only. Get automated tests running on every pull request. This alone will catch a huge percentage of bugs before they hit production. Don't worry about deployment automation yet.
Pick one tool and commit. Don't spend weeks evaluating every CI/CD platform. If you use GitHub, start with GitHub Actions. If you use AWS, start with CodePipeline. Get something working, then iterate.
Automate the easy deployments first. Pick your least critical environment — staging, QA, a dev sandbox — and automate deployments there. Once the team trusts the pipeline, extend it to production.
Write tests. CI is only as good as your test suite. If you have zero tests, your pipeline is just an expensive build server. Start with unit tests for your most critical paths and grow from there.
Version your pipeline configuration. Your CI/CD config should live in your repository alongside your code. This is infrastructure as code applied to your build process. It should be reviewed, versioned, and treated with the same care as application code.
The Bottom Line
CI/CD isn't a tool — it's a practice. The tools automate it, but the real value comes from the discipline of integrating frequently, testing automatically, and deploying consistently.
If your team is still deploying manually, start small. Get CI running on your next pull request. Build from there. Every step toward automation is a step away from "it works on my machine" and toward reliable, repeatable delivery.