DevOps - 持续交付
持续交付 (CD) 是一种软件开发实践。它专注于自动化将代码更改交付到与生产环境类似的环境。主要目标是始终保持代码随时可以部署。这样可以更频繁地发布。CD 以持续集成 (CI) 为基础,通过自动化发布过程构建。但它在代码直接部署到生产环境之前就停止了。
在典型的 CD 管道中,自动化测试、构建过程和暂存环境可确保软件始终可以部署。CD 在 DevOps 中非常重要。它有助于快速、可靠且频繁地发布软件。它还改善了开发和运营团队的协作方式。
持续部署 (CI) 和持续交付 (CD) 之间的区别
持续集成 (CI) 和持续交付 (CD) 都有助于改进软件发布过程。但它们在某些方面有所不同 −
- 持续集成 (CI) − CI 是指经常将代码更改合并到主代码库中。它运行自动测试以确保软件始终处于工作状态。CI 不会自动将软件发布到生产环境中。
- 持续交付 (CD) − CD 以 CI 为基础。它将部署过程自动化到类似于生产的环境。CD 确保通过自动测试的每个更改都已准备好投入生产。但它不会自动部署。
主要区别在于最后一步。CI 专注于集成和测试。 CD 可自动执行发布流程,但仍可能需要人工批准才能部署到生产环境。
为什么我们需要在 DevOps 环境中进行持续交付?
出于多种原因,持续交付在 DevOps 中非常重要 −
- 更快的发布: − 自动化发布流程可加快代码从开发到生产的进程。这样可以更快、更频繁地发布。
- 提高质量 − 通过自动化测试和部署,CD 可确保只有经过测试的代码才能投入生产。这样可以减少错误和缺陷。
- 更好的协作 − CD 可帮助开发和运营团队更好地协作。它使从开发到部署的交接更加顺畅。
- 减少手动工作 − 自动化部署步骤可降低人为错误的可能性。这使流程更加可靠。
- 可扩展性 − CD 可帮助组织发展其交付流程。随着团队和应用程序的发展,CD 支持更快的变更和更多的创新。
简而言之,CD 可帮助 DevOps 团队以更高的质量和更低的风险更快地交付价值。它是现代软件开发的关键部分。
构建持续交付管道
持续交付 (CD) 管道可自动执行将代码从开发转移到生产的过程。管道有几个阶段,如构建、测试、部署和监控。
目标是确保代码始终以自动化和可靠的方式准备好投入生产。CD 管道包括版本控制、构建自动化、自动化测试、部署自动化和监控工具等重要部分。
关键阶段通常包括以下内容:
- 源代码 − 从版本控制系统 (VCS) 获取代码。
- 构建 − 编译代码、解决依赖关系并创建可部署工件。
- 测试 − 运行自动化测试以检查代码的质量和正确性。
- 部署 − 将应用程序部署到暂存或生产环境。
- 监控 − 确保应用程序在部署后运行良好。
设计和构建持续交付管道
良好的 CD 管道将流程分为几个阶段,每个阶段都有其工作。以下是典型管道的设置方式 −
源阶段 − 这是第一阶段。当更改被推送到版本控制系统(例如 Git)时,管道开始运行。它从存储库中获取最新代码。请查看以下示例 −
git: branch: master repository: https://github.com/your-repo.git
构建阶段 − 构建阶段编译代码、修复依赖项并生成工件(例如 JAR、WAR 文件)。这里使用 Maven、Gradle 或 npm 等工具。
示例(Maven 构建) −
$ mvn clean install
测试阶段 − 运行自动测试(单元测试、集成测试)以检查代码。此阶段确保新更改不会破坏任何内容。
示例(JUnit 测试命令) −
$ mvn test
部署阶段 −此阶段自动将应用程序部署到暂存或生产环境。通常使用 Docker、Kubernetes 或 Ansible。
示例(使用 Docker 部署)−
docker build -t myapp . docker run -d myapp
监控阶段 − 部署后,监控工具(例如 Prometheus、Grafana)会检查应用程序的运行状况和性能,以确保其正常运行。
集成版本控制、构建自动化和部署工具
CD 管道使用多种工具协同工作以自动化交付过程:
版本控制 − Git 通常用于源代码管理。每个更改都会在存储库中进行跟踪,从而启动管道。
Jenkins 中的 Git 配置示例 −
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'master', url: 'https://github.com/your-repo.git'
}
}
}
}
构建自动化 − Maven、Gradle 或 npm 等工具负责编译代码并将其打包成可部署的工件。
示例(Jenkins 中的 Gradle 构建) −
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
sh 'gradle build'
}
}
}
}
}
部署工具 − Docker、Kubernetes 或 AWS CodeDeploy 等工具可自动部署到不同的环境。Docker 可用于容器化应用程序,确保其在任何环境中都能正常工作。
示例(使用 Jenkins 进行 Docker 部署) −
pipeline {
agent any
stages {
stage('Deploy') {
steps {
script {
sh 'docker build -t myapp .'
sh 'docker run -d -p 8080:8080 myapp'
}
}
}
}
}
使用 Jenkins、GitLab CI 或 CircleCI 实现构建和测试阶段的自动化
自动化构建和测试阶段对于顺利的持续交付过程非常重要。Jenkins、GitLab CI 和 CircleCI 等工具可以自动执行这些步骤,减少手动工作并确保一致性。
Jenkins − Jenkins 是一种广泛使用的 CI/CD 工具。它可以自动化构建和测试过程,并与 Git、Maven、Docker 和 Kubernetes 等工具集成。
示例(用于构建和测试的 Jenkins 管道) −
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
sh 'mvn clean install'
}
}
}
stage('Test') {
steps {
script {
sh 'mvn test'
}
}
}
}
}
GitLab CI − GitLab CI 提供集成的 CI/CD 管道,可根据 Git 推送自动运行作业。它使用 .gitlab-ci.yml 文件进行配置。
示例(用于构建和测试的 GitLab CI 管道) −
stages:
- build
- test
build:
stage: build
script:
- mvn clean install
test:
stage: test
script:
- mvn test
CircleCI − CircleCI 是一种基于云的 CI/CD 服务,可与 GitHub 等版本控制系统集成。它使用 .circleci/config.yml 文件进行配置。
示例(用于构建和测试的 CircleCI 管道) −
version: 2.1
jobs:
build:
docker:
- image: circleci/python:3.8
steps:
- checkout
- run:
name: Install dependencies
command: pip install -r requirements.txt
- run:
name: Run tests
command: pytest
workflows:
version: 2
build_and_test:
jobs:
- build
这些工具可以顺利地融入到管道中。它们有助于自动化构建、测试和部署,从而降低错误风险并加快软件交付速度。
持续交付中需要记住的要点
下表重点介绍了持续交付中需要注意的要点 −
| 主题 | 需要记住的要点 | 说明 | 示例 |
|---|---|---|---|
| 自动化的重要性 |
|
|
|
| 持续交付中的自动化测试 |
|
|
|
| 容器化和 CD:Docker & Kubernetes |
|
|
|
| 使用 CD 部署到多个环境 |
|
|
用于配置和部署的 IaC 工具,如 Terraform 和 Ansible。 |
| 持续交付中的蓝绿和灰度部署(又名金丝雀部署) |
|
|
|
| CI/CD 工具链和集成 |
|
|
|
| 持续交付中的安全性 |
|
|
|
| CD 管道中的监控和可观察性 |
|
|
|
| 为大型团队和企业扩展持续交付 |
|
|
|
| CD 和功能切换:管理功能和发布 |
|
|
|
| 自动回滚和处理 CD 中的故障 |
|
|
|
| 高级持续交付:自我修复管道 |
|
|
|
结论
在本章中,我们研究了持续交付 (CD) 的主要部分。我们讨论了重要的主题,例如自动化测试、使用 Docker 和 Kubernetes 进行容器化、蓝绿和灰度部署(又名金丝雀部署)、安全实践以及大型团队的扩展。我们还讨论了如何集成 CI/CD 工具、管理功能切换、处理自动回滚以及探索诸如自修复管道之类的高级想法。
通过了解这些方法和工具,我们可以使我们的工作流程更顺畅,提高部署可靠性,创建更好的版本并减少手动工作。这有助于我们构建更强大、更高效的 DevOps 管道。

