Lesson 1 of 30
Three words that get used as one. Continuous Integration, Continuous Delivery, and Continuous Deployment are different promises, and mixing them up is the single most common CI/CD mistake in interviews.
12 min read
Every option explains itself — why the right one is right, and why each wrong one is wrong. Miss one and it comes back later on a spaced-repetition schedule.
This topic is about judgment and practical tradeoffs more than a single right answer — a mock interview is the better way to test yourself on it.
Be interviewed on this →Hints without spoilers, and a plain explanation of why a wrong answer was wrong — answered only from this lesson. Free account, no card.
Sign up freeWhat interviewers actually ask about this, and what a strong answer has to cover.
A strong answer covers
Likely follow-ups
"CI/CD" gets said as one word, but it's actually up to three separate practices, and they answer three different questions:
The three build on each other in order: you can't have reliable Continuous Delivery without Continuous Integration underneath it, and you can't have Continuous Deployment without Continuous Delivery underneath that. But most real teams stop at Continuous Delivery on purpose — automatic production releases are a deliberate, sometimes risky choice, not the "more mature" default.
Same trigger — a pull request merges to main — three different endings:
# Team A: Continuous Integration only
on:
push:
branches: [main]
jobs:
verify:
steps:
- run: pnpm install --frozen-lockfile
- run: pnpm test
- run: pnpm build
# ...and that's it. Nothing gets deployed. A green check just means
# "this is safe to merge," full stop.
# Team B: Continuous Delivery
on:
push:
branches: [main]
jobs:
verify:
steps: [ ...same as Team A... ]
package-release:
needs: verify
steps:
- run: pnpm build
- run: docker build -t app:${{ github.sha }} .
- run: docker push registry.example.com/app:${{ github.sha }}
# A deployable, tagged artifact now exists and is sitting in the
# registry. Someone still has to click "deploy" to ship it.
# Team C: Continuous Deployment
on:
push:
branches: [main]
jobs:
verify:
steps: [ ...same as Team A... ]
deploy:
needs: verify
steps:
- run: docker build -t app:${{ github.sha }} .
- run: docker push registry.example.com/app:${{ github.sha }}
- run: kubectl set image deployment/app app=registry.example.com/app:${{ github.sha }}
# Merged to main at 2:14pm, live in production at 2:17pm.
# No human clicked anything.
All three teams can honestly say "we do CI/CD." They mean three different things by it.
None of these three practices mean anything without a pipeline that actually enforces them — stages of work that run automatically on a trigger and block progress when something fails. That structural idea, of a pipeline built from ordered jobs and steps, is the next lesson, and it's what turns "we do CI" from a claim into something a team can actually prove.