Short answer: CI/CD is the pipeline in which every change to your software is automatically built, tested and, if it passes the rules, released. CI (continuous integration) asks a machine "did this change break anything?" on every commit; CD (continuous delivery/deployment) moves the passing version to the server through the same steps every time, with no manual file copying. The result: fewer "it broke in production" days, and a system you can roll back within minutes when it does.
What is CI/CD, and how do CI and CD differ?
The two terms usually travel together but answer different questions. Continuous Integration means developers merge code into a shared repository often, and automated checks run on every merge. Continuous Delivery means every version that passes the tests becomes a release-ready package; a human still presses the release button. Continuous Deployment removes that button too: every change that passes the checks goes live on its own.
- CI: build, type check, lint and automated tests run on every commit; a red result blocks the merge.
- Continuous Delivery: the green version is packaged and deployed to a test environment; going live is one click, but approved.
- Continuous Deployment: no approval step; strong test coverage and monitoring are mandatory.
For most business projects, the right starting point is CI plus Continuous Delivery. Fully automatic deployment is a step to consider once test coverage and monitoring have matured.
What happens in a project without CI/CD?
Without CI/CD, releases usually happen on one person's laptop: the code is built, files are pushed to the server over FTP or SSH, and if a step is forgotten the site ends up half-updated. The process seems to work until that person goes on holiday or skips a step. The problems follow the same pattern:
- Releases depend on one person; the knowledge lives in a head, not in a written, repeatable process.
- The "it worked on my machine" problem: the developer's environment differs from the server.
- Tests, if they exist, are run by hand and get skipped on busy days.
- Nobody knows exactly what the previous version was, so rolling back is guesswork.
- Because releases are scary, they become rare; large batched changes then cause more bugs.
The real gain of CI/CD is predictability, not speed: every release goes through the same steps and the same checks, and who shipped what, and when, is on record.
The steps of a typical CI/CD pipeline
Whatever the tool (GitHub Actions, GitLab CI, Azure DevOps, Jenkins), a good pipeline follows roughly the same order. If a step fails, the pipeline stops, and nobody can ship broken code to production with a "we will fix it later".
- Install dependencies exactly from the lock file (for example npm ci), so versions are identical every time.
- Static checks: type checking, linting, formatting.
- Automated tests: unit tests, plus integration and end-to-end tests where needed.
- Build and package: often a Docker image tagged with a version number or commit.
- Deploy to a staging environment and run a short smoke test.
- Approved production release followed by a health check; roll back automatically if it fails.
What the tests should cover is a separate topic; we explain which kind of test helps when in our post on the software testing and QA process. CI/CD is the mechanism that runs those tests on every change without anyone having to remember.
Example: a simple CI pipeline with GitHub Actions
The file below runs type checking, linting, tests and a build on every pull request and every merge to the main branch of a Node.js / Next.js project. If any step goes red, the merge is blocked (once "require status checks" is enabled in the repository settings).
# .github/workflows/ci.yml
name: CI
on:
pull_request:
push:
branches: [main]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run typecheck
- run: npm run lint
- run: npm test --if-present
- run: npm run buildThe deployment (CD) step is added on top as a separate job: it runs only on the main branch, only when CI is green, builds the image and ships it to the server. Server credentials are not placed in the code; they live in the CI tool's secret variables and are exposed only to the deployment job.
The rollback plan: the most forgotten part of the pipeline
Every pipeline will ship a broken version one day; what matters is how fast you get back. The rollback plan must be written before the release, not during the incident.
- Every version is stored under an immutable tag; rolling back means redeploying the previous tag.
- Database migrations are backward compatible: add the new column first, remove the old one only in the next release.
- If the post-release health check (for example a /health endpoint) fails, traffic returns to the old version.
- Large features ship behind a feature flag, so they can be switched off without reverting code.
Code can be rolled back; deleted data cannot. That is why CI/CD does not replace a backup strategy; the two work together. We cover the backup side in our post on data backup and disaster recovery.
5 questions to ask your software vendor
CI/CD looks technical, but for the client it is plain risk management. When starting a custom software or web development project, these questions should have clear answers:
- How are releases done, manually or automatically? Are the steps written down?
- Which checks run on every change, and does a red test stop the release?
- Is there a staging environment separate from production?
- If a broken version ships, how long does rolling back take, and who does it?
- At handover, are the CI/CD definitions and repository access transferred to us?
The last question matters most: when pipeline definitions live in the repository as files, the release process stays with you even if you change vendors. How this infrastructure is run during maintenance is covered in our post on website maintenance costs.
Conclusion
CI/CD is worth setting up even for a small team: the initial setup is a handful of files in most projects, and it pays back on every release. Start with CI, add a staging environment and approved releases, and put the rollback plan in writing. If you want an automated test and release pipeline for your project, or a review of your current process, get a quote and we will work out the right setup together.