continuous delivery
Continuous delivery, or CD, is a software development practice that keeps every change in a deployable state once it passes the automated build-and-test pipeline. The team can then release to production on demand, triggering a deploy whenever it wants instead of treating a release as a rare event.
Continuous delivery extends continuous integration by carrying each integrated change all the way to a release-ready artifact. It stops one step short of production, at a manual gate where a human decides when to push the button:
The pipeline does everything except that final deploy, so a typical run ends parked and waiting:
$ ci run --pipeline release
build packaged app-2.7.0
test 412 passed
staging deployed, smoke tests green
production waiting for approval
The artifact named in that output is releasable right now, and continuous delivery is the discipline of keeping it that way after every single commit.
How It Shows Up in Practice
A Python developer meets continuous delivery as the shape of the team’s pipeline rather than as a tool with that name. GitHub Actions, GitLab CI/CD, and Jenkins all express it the same way, as a sequence of stages that build the package, run the test suite, deploy to a staging environment, and then gate the production deploy behind a manual approval step.
The payoff is that releasing stops being a project of its own. Because the pipeline rebuilds and revalidates on every merge, the latest green commit is always shippable, so a release turns into one click rather than a week of integration and hand testing. Teams earn that confidence with a smoke test against staging, then watch the production rollout through their observability stack.
The defining trait is that manual gate at the end.
Once a human approves, the deploy itself still rides on a release strategy such as a blue-green deployment or a rolling deployment.
Continuous Delivery vs. Continuous Deployment
The two terms share an acronym and differ by one decision. Continuous delivery keeps every change ready to ship and leaves the production deploy as a human choice, often to line a release up with a launch, a definition of done sign-off, or a quiet traffic window.
Continuous deployment removes that final gate, so any change that clears the pipeline goes live with nobody pressing a button.
Teams reach for continuous delivery when they trust their automation but still want a person to own the timing of a release. They graduate to continuous deployment once the pipeline and monitoring are trusted enough to take that person out of the loop. To see what changes when the gate comes out, read continuous deployment.
Related Resources
Tutorial
Continuous Integration and Deployment for Python With GitHub Actions
With most software following agile methodologies, it's essential to have robust DevOps systems in place to manage, maintain, and automate common tasks with a continually changing codebase. By using GitHub Actions, you can automate your workflows efficiently, especially for Python projects.
For additional information on related topics, take a look at the following resources:
- Python Continuous Integration and Deployment Using GitHub Actions (Course)
- Continuous Integration With Python: An Introduction (Tutorial)
- Build Robust Continuous Integration With Docker and Friends (Tutorial)
- Securely Deploy a Django App With Gunicorn, Nginx, & HTTPS (Tutorial)
- Python Web Applications: Deploy Your Script as a Flask App (Tutorial)
- GitHub Actions for Python (Quiz)
- Continuous Integration With Python (Course)
- Deploy a Django App With Gunicorn and Nginx (Course)
- Deploy Your Python Script on the Web With Flask (Course)
By Martin Breuss • Updated June 22, 2026