〇、前言
CI/CD 是现代软件开发的核心实践,通过自动化和协作,显著提升交付效率和质量。
本文将对 CI 和 CD 这两个概念进行简要介绍,供参考。
一、CI/CD 的核心概念
CI/CD 是 DevOps 实践的核心组成部分,旨在通过自动化流程加速软件交付,提高质量和可靠性。
它的核心概念有三个:持续集成、持续交付和持续部署。下面将详细介绍。
另外,什么是 DevOps?
它是一种结合了 开发(Development) 和 运维(Operations) 的文化和实践,旨在通过协作和自动化工具,加速软件交付流程,同时提高质量、灵活性和可靠性。DevOps 的核心目标是打破开发团队和运维团队之间的壁垒,促进跨职能协作,从而实现更高效的软件生命周期管理。
1.1 持续集成(CI:Continuous Integration)
CI 就是在开发团队频繁(通常每天多次)将代码变更合并到共享主分支或开发分支时,通过自动化构建和测试,来验证代码的正确性。
CI 的目标是:
- 减少集成冲突:通过频繁合并代码,尽早发现和解决集成问题。
- 自动化验证:每次代码提交后自动执行编译、单元测试和集成测试,确保代码质量。
流程示意图如下:

关键节点如下详细介绍:
1.1.1 代码提交阶段
开发人员将本地代码推送到版本控制系统(如 Git)的远程仓库。
参与者:开发工程师,数据库管理员(DBA),基础架构团队。
技术:GitHub,GitLab,SVM,BitBucket。
代码提交阶段也可以叫做【版本控制】。简单来说,就是在一个版本的开发阶段完成后,将有变更的代码提交代码库中。
每个版本所修改的内容都会被无限期地存储,以供后续查找。管理编辑和提交变更的存储库称为源代码管理工具(配置管理工具)。
在开发人员提交代码(代码推送请求)后,代码更改被合并到主线代码分支中,这些主线代码分支存储在 GitHub 这样的中央存储库中。
1.1.2 静态代码检查阶段
开发人员将新版本代码提交到仓库后,就会触发下一阶段:静态代码检查。
参与者:开发工程师,数据库管理员(DBA),基础架构团队
技术:GitHub,GitLab,SVM,BitBucket
开发过程中存在这种情况:提交的代码可以构建成功,但在部署期间构建失败。无论从机器还是人力资源的利用率而言,这都是一个缓慢而昂贵的过程,因此必须检查代码中的静态策略。
SAST(Static Application Security Testing 静态应用程序安全性测试): SAST 是一种白盒测试方法,可以使用 SonarQube,Veracode,Appscan 等 SAST 工具从内部检查代码,以发现软件缺陷,漏洞和弱点(例如 SQL 注入等)。这是一个快速检查过程,其中检查代码是否存在语法错误。
将额外的策略检查加入自动化流水线中可以显著减少流程中稍后发现的错误数量。
1.1.3 构建
构建阶段就是编译应用程序的阶段。

参与者:开发工程师
技术:Jenkins,Bamboo CI,Circle CI,Travis CI,Maven,Azure DevOps
持续集成(CI)过程的目标是,提交的代码持续构建为二进制文件或构建产物。
通过持续集成,来检查添加的新模块是否与现有模块兼容,不仅有助于更快地发现 Bug,还有助于减少验证新代码更改的时间。
构建工具可以根据几乎所有编程语言的源代码创建可执行文件或包(.exe,.dll,.jar等)。在构建过程中,还可以生成 SQL 脚本,配合基础设施配置文件一起进行测试。
另外,Artifactory 存储、构建验证测试和单元测试也可以作为构建过程的一部分。
**Artifactory 存储:**它是由 JFrog 公司开发的一款二进制存储库管理软件,它提供了全面的解决方案来管理二进制文件(如 jar、war、zip、tar.gz 等),这些文件通常是在软件开发过程中生成的构建输出。Artifactory 支持广泛的技术栈和生态系统,包括但不限于 Maven、Gradle、Docker、npm、NuGet 等,为开发者提供了一个集中的平台来存储、管理和分发他们的制品。
构建验证测试(BVT)/冒烟测试/单元测试: 创建构建后立即执行冒烟测试 。BVT 将检查所有模块是否正确集成,以及程序的关键功能是否正常运行。 这样做的目的是拒绝严重损坏的应用程序,以使 QA 团队不会在安装和测试软件应用程序步骤浪费时间。在完成这些检查后,将向流水线中执行 UT(单元测试),以进一步减少生产中的故障。单元测试可验证开发人员编写的单个单元或组件是否按预期执行。
**构建产物存储:**一旦构建就绪,程序包就会存储在称为 Artifactory 或 Repository 工具的中央数据库。随着每天构建量的增加,跟踪所有构建产物也会变得愈加困难。因此,一旦生成并验证了构建产物,就将其发送到存储库进行存储管理。诸如 Jfrog Artifactory 之类的存储库工具可用于存储诸如 .rar,.war,.exe,Msi 等之类的二进制文件。测试人员可以从此处手动进行选择,并在测试环境中部署构建产物以进行测试。
1.1.4 测试
构建过程中进行的一系列自动测试验证的是代码的准确性,而此阶段主要验证业务逻辑的准确性,可帮助避免生产中的错误。

参与者:测试人员、QA。
技术:Selenium,Appium,Jmeter,SOAP UI,Tarantula。
根据构建结果的大小,此检查可能持续数秒至数小时。 对于由多个团队提交和构建代码的大型组织,这些检查在并行环境中运行,以节省宝贵的时间并尽早将错误通知开发人员。
测试人员(或称为QA工程师)基于需求所描述的测试用例和场景,设置自动化测试用例。他们执行回归分析、压力测试来检查与预期输出的偏差。
测试类型有完整性测试、集成测试、压力测试等等。这些都是更高层次测试方法,在这个阶段,可以发现开发人员忽视的某些代码问题。
**完整性测试(Integrity Testing):**是一种确保数据、系统或软件在其整个生命周期中保持一致性和准确性的测试方法。它关注的是验证数据是否完整无缺,没有丢失或损坏,并且系统能够正确地处理和维护这些数据。完整性测试对于保证系统的可靠性、安全性和功能性至关重要。
**集成测试(Integration Testing):**也称为组装测试或联合测试,是软件测试的一个阶段,在单元测试之后进行。它的主要目的是验证各个模块之间的接口是否正常工作,确保不同部分能够正确地协同运作。集成测试关注的是模块间的交互,而不是单个模块的功能,后者通常由单元测试负责。集成测试是使用 Cucumber、Selenium 等工具执行的。
**性能测试(Performance Testing):**旨在验证系统的响应速度、吞吐量、资源利用率等关键性能指标是否符合预期要求。它通常是在受控环境下模拟用户活动来测量应用程序的表现,以确定其能否满足性能目标。
**压力测试(Stress Testing):**是一种特殊的性能测试形式,目的是了解系统在极端条件下(如超出正常操作范围的高负载)的行为。通过故意使系统过载,可以揭示系统在极限情况下的稳定性及恢复能力。
最后经过开发人员将全部 Bug 修改完成,QA 进行全部回归后,整个 CI 阶段就算完成了。
1.2 持续部署(CD:Continuous Deployment)(Bake and Deploy)
持续部署就是,经过一系列测试后的程序,自动被部署到生产环境,无需任何人工干预。

参与者:基础架构工程师,SRE,运维工程师。
技术:Spinnaker,Argo CD,Tekton CD
在部署到生产环境之前,新版本的程序被部署到产品团队内部使用的测试环境。但在这之前,构建必须经过 Bake 和 Deploy 的子阶段,这两个阶段都是 Spinnaker 所支持的。
**关于 Spinnaker,它是一个多云持续交付平台,它可以帮助开发者和运维团队快速、可靠地部署应用程序到云端。**由 Netflix 开源,旨在解决现代云计算环境中的复杂部署挑战。Spinnaker 支持多种云服务提供商,如 AWS、Google Cloud Platform、Microsoft Azure、Kubernetes 等,这使得它成为一个非常灵活的选择,适用于希望避免被特定云供应商锁定的组织。
1.2.1 Bake:准备【一致且可预配置】的操作环境
Bake 指的是创建或生成一个虚拟机镜像(如Amazon Machine Image (AMI) 或 Google Compute Engine image)的过程。这个步骤是为后续的部署活动准备一致且预配置的操作环境。
主要目的:
- 一致性:确保所有部署的实例基于相同的初始状态启动,减少由于环境差异导致的问题。
- 效率:通过预先安装和配置必要的软件和服务,减少了新实例启动时间,并加速了应用的部署过程。
- 安全性:可以在bake阶段集成安全补丁和策略,增强基础架构的安全性。
在 Spinnaker 中,Bake 过程主要由 Rosco 服务处理。用户可以通过定义一个"Bake Stage"来指定希望生成的镜像类型(例如,AMI for AWS, GCE image for Google Cloud),并可以指定所需的软件包或其他自定义脚本以包含在最终镜像中。这使得开发者能够自动化地创建标准化、可复用的基础架构组件,简化了部署流程,并有助于实现更加可靠的持续交付实践。
1.2.2 Deploy:部署到目标环境并验证
Deploy 阶段是将构建好的软件版本,部署到目标环境中的一系列操作。这个过程是确保应用程序能够顺利地从开发环境转移到测试、预生产甚至生产环境的关键步骤。通过自动化部署流程,团队可以快速且可靠地发布新功能或修复问题。
优势:
- 自动化部署:通过使用CI/CD工具自动执行部署流程,减少人工干预,降低错误率。
- 快速反馈:使新代码能迅速部署至各个环境(如测试、预生产),以便及时获取反馈并进行必要的调整。
- 一致性:确保应用在不同环境之间保持一致的配置和行为,避免由于环境差异引起的问题。
- 回滚机制:当部署出现问题时,能够快速回退到之前的稳定版本,减少对用户的影响。
有三种部署策略:
- 蓝绿部署: 维护两套相同的生产环境,一套为当前生产环境(蓝色),另一套为待切换的新环境(绿色)。新版本发布时先部署到绿色环境,并进行最终验证,确认无误后将流量切换到绿色环境。
- 金丝雀发布:逐步将新版本发布给少量用户,观察其表现是否符合预期,然后再决定是否完全替换旧版本。
- 滚动更新: 逐步更新服务实例,每次仅更新部分实例,直到所有实例都完成更新。这种方式可以在不中断服务的情况下进行更新。
Deploy 阶段是确保软件产品能够以高质量、高效率的方式交付给用户的重要一步。
1.2.3 监控
参与者:站点可靠性工程师(SRE)、运营团队
技术:Zabbix、Nagios、Prometheus、Elastic Search、Splunk、Appdynamics、Tivoli
为了使软件发行版具有故障安全性和健壮性,在生产环境中跟踪发行版的运行状况至关重要。
应用程序监视工具将跟踪性能指标,例如 CPU 利用率和发行版延迟。发行版延迟指的是从软件开发完成到实际对外发布的这段时间间隔。这包括了从代码冻结、构建、测试、审批到最后部署上线的整个过程。发行版延迟可能由多种因素造成,例如:功能复杂性增加、需求变更管理不善、自动化发布不足、沟通不畅问题等等,都可能导致延误。减少发行版延迟的关键在于优化软件开发生命周期中的各个环节,比如加强自动化测试、改进项目管理和沟通机制等。通过实施敏捷开发方法论和CI/CD实践,可以帮助组织更快地将产品推向市场,并减少发行版延迟。
日志分析器将扫描由底层中间件和操作系统产生的大量日志,以识别行为并跟踪问题的根源。如果生产中出现任何问题,将通知利益相关者以确保生产环境的安全性和可靠性。
1.3 持续交付(CD:Continuous Delivery)(反馈和协作工具:Feedback and Collaboration)
持续交付旨在确保软件可以随时可靠地发布到生产环境中。它建立在持续集成(Continuous Integration, CI)的基础上,但更进一步,不仅要求代码变更能够自动集成和测试,还要求这些变更能够方便、快速地部署到一个或多个环境,直至生产环境。

参与者:站点可靠性工程师(SRE)、运营和维护团队。
技术:JIRA、ServiceNow、Slack、电子邮件、Hipchat。
DevOps 团队的目标是更快地持续发布,然后不断减少错误和性能问题。这是通过不时地通过发送电子邮件向开发人员、项目经理提供有关新版本的质量和性能的反馈。
通常情况下,反馈系统是整个软件交付过程的一部分。因此,交付中的任何更改都会频繁地录入系统,以便交付团队可以对它采取行动。