Continuous Delivery (CD) is a software engineering approach where teams produce software in short cycles, ensuring that the software can be reliably released at any time. It extends Continuous Integration (CI) by automatically building, testing, and preparing code changes for a release to production.
- Automate the Deployment Pipeline: The entire process from code commit to a deployable artifact is fully automated.
- Keep the Software in a Deployable State: At any point in time, the software should be ready for release to production.
- Build Quality In: Quality is integrated into every step of the development process.
- Fast and Frequent Feedback: The pipeline provides rapid feedback on the quality and deployability of changes.
A typical CD pipeline includes:
- Commit Stage (CI): Build, unit tests, static analysis.
- Acceptance Test Stage: Integration tests, system tests, performance tests.
- User Acceptance Testing (UAT) / Staging Stage: Deployment to a staging environment for manual testing.
- Release/Deployment Stage: Automated deployment to production, often with a manual trigger.
- Continuous Delivery: Every change is ready for production, but deployment to production is a manual decision.
- Continuous Deployment: Every change that passes all automated tests is automatically deployed to production.
This example shows a conceptual CD pipeline for a Rust project using GitHub Actions.
.github/workflows/rust_cd.yml
name: Rust Continuous Delivery
on:
push:
branches: [ "main" ]
jobs:
build_and_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
deploy_staging:
needs: build_and_test
runs-on: ubuntu-latest
environment:
name: staging
url: http://staging.example.com
steps:
- name: Deploy to staging
run: echo "Deploying to staging..."
deploy_production:
needs: deploy_staging
runs-on: ubuntu-latest
environment:
name: production
url: http://example.com
steps:
- name: Deploy to production
run: echo "Deploying to production..."This workflow will automatically build and test the code, then deploy to a staging environment. The deployment to production is a manual step that can be triggered from the GitHub Actions UI.
- Blue-Green Deployment: Two identical production environments, only one of which is live at any time. Deploy to the inactive environment, then switch traffic over.
- Canary Release: Gradually roll out the change to a small subset of users before rolling it out to the entire user base.
- Rolling Deployment: Slowly replace instances of the old version of the application with the new version.
IaC is the practice of managing and provisioning infrastructure through code and automation. Tools like Terraform and Pulumi can be used to define and manage the infrastructure required for a CD pipeline.
Continuous Delivery is a transformative practice that enables organizations to release software reliably and frequently. By automating the entire deployment pipeline and building quality into every step, CD reduces risk, accelerates time to market, and improves software quality. Rust's reliability, performance, and tooling make it an excellent choice for building applications that are well-suited for Continuous Delivery.