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

这些工具可以顺利地融入到管道中。它们有助于自动化构建、测试和部署,从而降低错误风险并加快软件交付速度。

持续交付中需要记住的要点

下表重点介绍了持续交付中需要注意的要点 −

主题 需要记住的要点 说明 示例
自动化的重要性
  • 自动化
  • 一致性
  • 快速反馈
  • 减少错误
  • 自动化对于减少人为错误非常重要。
  • 跨环境的一致性有助于避免部署问题。
  • 尽早获得反馈有助于提高质量。
  • 使用 Jenkins 和 GitLab CI 进行自动化测试和部署。
  • 使用相同的构建和部署环境。
持续交付中的自动化测试
  • 单元测试
  • 集成测试
  • 端到端测试
  • 负载测试
  • 自动化测试可更早发现问题。
  • 我们针对不同级别实现自动化测试,从单个部件到整个系统。
  • 单元测试:JUnit、NUnit
  • 集成测试:API 使用 Postman,UI 使用 Selenium
  • 负载测试:Apache JMeter。
容器化和 CD:Docker & Kubernetes
  • Docker 确保一致性
  • Kubernetes 确保可扩展性
  • 使用容器的微服务
  • Docker 帮助将应用程序打包到容器中,确保它们在任何地方都能正常工作。
  • Kubernetes 管理应用程序的部署和扩展方式。
  • Docker − 为应用程序创建 Dockerfile
  • Kubernetes − 使用 Kubernetes YAML 配置部署应用程序。
使用 CD 部署到多个环境
  • 环境奇偶校验
  • 配置管理
  • 自动化部署
  • 我们必须确保所有环境(开发、准备、生产)都相同,以避免出现问题。
  • 我们自动化部署过程。
用于配置和部署的 IaC 工具,如 Terraform 和 Ansible。
持续交付中的蓝绿和灰度部署(又名金丝雀部署)
  • 蓝绿部署
  • 灰度发布(又名金丝雀发布)
  • 回滚策略
  • 蓝绿部署可确保在部署期间零停机时间发布。
  • 灰度发布(又名金丝雀发布)允许逐步推出功能和 A/B 测试。
  • 蓝绿:在蓝色和绿色环境之间切换流量。
  • 灰度(又名金丝雀):向一小部分用户发布新功能。
CI/CD 工具链和集成
  • 流行的 CI/CD 工具
  • 自定义管道
  • 工件存储库集成
  • 我们集成了 Jenkins、GitLab CI、Bamboo 等 CI/CD 工具。
  • 管道是定制的,以适应我们特定的需求。
  • Jenkinsfile 用于 Jenkins 管道。
  • 集成 Nexus 或 Artifactory 用于工件存储。
持续交付中的安全性
  • 静态应用程序安全测试 (SAST)
  • 动态应用程序安全测试 (DAST)
  • 机密管理
  • 安全性必须是 CI/CD 管道的一部分,以便尽早发现问题。
  • 安全地管理密码和 API 密钥等机密非常重要。
  • 使用 SonarQube 等工具的 SAST
  • 使用 OWASP 的 DAST ZAP
  • 使用 Vault 或 Kubernetes Secrets 管理机密。
CD 管道中的监控和可观察性
  • 持续监控
  • 实时反馈
  • 可观察性工具
  • 持续监控有助于检查部署是否运行良好。
  • 实时指标可帮助我们快速发现故障和问题。
  • Prometheus 用于收集指标
  • Grafana 用于显示 CD 管道性能
为大型团队和企业扩展持续交付
  • 扩展管道
  • 速度和可靠性
  • 高可用性
  • 我们需要能够处理大规模工作、许多团队和微服务的 CI/CD 管道。
  • 在管道增长时保持其可靠性非常重要。
  • 用于扩展的分布式 Jenkins 代理
  • 通过并行作业改进管道和缓存。
CD 和功能切换:管理功能和发布
  • 功能切换
  • 长期功能切换
  • 减少技术债务
  • 功能切换可帮助我们仔细推出和测试新功能。
  • 管理长期切换以保持代码清洁非常重要。
  • 使用 LaunchDarkly 等功能标志库
  • 在 GitHub 或 GitLab 中管理切换分支。
自动回滚和处理 CD 中的故障
  • 自动回滚
  • 安全部署机制
  • 弹性和容错能力
  • 如果部署失败,我们应该自动回滚。
  • 我们通过使用健康检查和故障转移策略来确保系统强大。
  • 使用 Helm 在 Kubernetes 中自动回滚
  • 在 Docker 或 Kubernetes 中使用健康检查。
高级持续交付:自我修复管道
  • 自我修复管道
  • 预测故障管理
  • 持续交付中的机器学习
  • 自我修复管道可以自行查找和修复问题。
  • AI/ML 模型可以预测问题并在问题发生之前解决它们。
  • 使用 Jenkins 插件或自定义脚本重新触发失败步骤。
  • 机器学习模型预测管道问题。

结论

在本章中,我们研究了持续交付 (CD) 的主要部分。我们讨论了重要的主题,例如自动化测试、使用 Docker 和 Kubernetes 进行容器化、蓝绿和灰度部署(又名金丝雀部署)、安全实践以及大型团队的扩展。我们还讨论了如何集成 CI/CD 工具、管理功能切换、处理自动回滚以及探索诸如自修复管道之类的高级想法。

通过了解这些方法和工具,我们可以使我们的工作流程更顺畅,提高部署可靠性,创建更好的版本并减少手动工作。这有助于我们构建更强大、更高效的 DevOps 管道。