原文地址: https://medium.com/@sanjayaben/how-to-build-an-efficient-ci-cd-pipeline-b5738ad567c8 我觉得这篇文章真的能学到很多理论知识,便于我们实施流水线。
在过去几年中,持续集成和持续交付一直是许多敏捷软件开发团队的首要任务。它被认为是建立DevOps实践的基础,大多数组织将其视为实现快速可靠的软件交付的关键推动力。
持续交付是敏捷软件开发中的核心思想。《敏捷宣言》中最早的一项原则可以追溯到2001年,内容如下:
“我们的首要任务是通过尽早并持续交付有价值的软件来满足客户。”
敏捷软件开发的成功在很大程度上取决于团队能否迅速向最终用户推出功能并结合最终用户的反馈不断改进软件。周期越短,用户满意度就越高。有效的CI / CD管道将是实现如此快速周转的关键。
基本原理
很少有驱动CI / CD管道的基本原理。
- 集成和验证 —在典型的软件开发设置中,您期望多个开发人员在自己的功能分支中进行开发,并将其定期集成到一个公共的开发分支中。集成(或甚至在集成之前)一段代码时,必须要有一个验证步骤,该步骤可以快速确保特定的集成不会破坏现有功能,不会降低性能甚至不会引入安全漏洞。
- 自动化 -为了提高速度,必须使验证自动化。即,它应该由一系列自动化测试组成,这些测试将覆盖软件的大多数关键方面,并且可以在合理的时间内执行。
- DevOps文化 -开发团队在确保管道的连续性方面可以发挥重要作用。例如,当构建失败或测试失败时会发生什么?解决此类问题应放在首位,否则将减少CI / CD流程的收益。
- 容器化 -不是强制性的,但是如果部署基于容器,则将降低复杂性。
我们的方法
设计用于交付企业应用程序的CI / CD管道不仅需要考虑基础知识,还需要考虑组织或软件特有的实际挑战。需要考虑的几点是
- 软件开发过程 -CI / CD将在敏捷环境中产生最佳的ROI。
- 单元测试覆盖率 —这是CI的关键部分,如果您的测试覆盖率很低,那么在实施CI / CD管道之前就应该先进行处理。
- 自动化程度 –这将决定您是否仅依赖自动化测试,还是要在流程中引入一些手动测试。
- 测试套件的性质-测试用例的数量或更重要的是,可能需要考虑执行测试所花费的时间。例如,如果测试需要很长时间才能运行,那么在每次代码提交时执行它们可能并不实际。
在我们的案例中,我们采用了以下四步方法。
持续交付和持续部署经常被混淆,但这是两回事。马丁·福勒(Martin Fowler)将差异描述如下,
“持续交付有时会与持续部署相混淆。持续部署意味着每项变更都将贯穿整个流程并自动投入生产,从而导致每天进行许多生产部署。连续交付只是意味着您能够进行频繁的部署,但可能会选择不进行部署,通常是由于企业偏向于降低部署速度。为了进行持续部署,您必须进行持续交付。”
全自动持续部署通常被认为是业务风险,尤其是在企业设置中。这就是为什么存在一个“发布过程”的原因,在该过程中,更改将被系统地,可预测地交付给最终用户。
持续集成
当开发人员将代码提交到其相关功能分支时,将触发我们的CI流程。现在,与Git存储库关联的Git挂钩将触发Jenkins集群中的构建过程。Jenkins管道用于驱动构建过程,并且存在与构建过程相关的质量关卡检查。质量门检查应基于对共同开发部门的最低要求。在我们的上下文中,质量门检查可以验证,
- 构建是否成功
- 单元测试已通过
- 没有违反代码风格的行为
- 新代码的代码覆盖率超过80%
- Sonar扫描未报告任何漏洞或代码气味。
持续交付
如果质量门已经通过,则开发人员可以提交其拉取请求。集成管理器会将代码合并到通用开发分支。这将启动通用开发分支上的构建过程,如果成功,将继续构建docker映像。
理想情况下,所有测试都应作为集成过程的一部分执行,但实际上由于测试执行时间的原因,这效率很低。因此,我们将其设计为一个称为“连续测试”的过夜时段。
持续测试
这是一个通宵的过程,其中会在软件的最新成功构建上执行功能测试,安全扫描和性能测试等测试。在执行测试之前,将根据最新的docker镜像将新容器部署在连续测试环境中。连接到Kubernetes集群的永久卷将作为测试的前提条件被还原。请注意,所有这些活动都是计划的并且是完全自动化的。
第二天早上在每日站立会议之前检查测试报告。任何脚本问题将由质量保证团队解决,而任何代码问题将由开发团队解决。CT故障被认为是优先考虑的问题,并将在最早的情况下得到解决。
受控部署
由于大多数艰苦的工作已经在前面的三个步骤中完成,因此简化了部署。成功的CT周期是唯一的资格标准,可以在任何时候进行发布。发行脚本将
- 用相关版本号标记Docker映像
- 用版本号标记源存储库
现在,可以将发布版本部署在发布管道中的其他环境中。最终,将发行版推广到生产将是业务决策。docker kubernetes设置将简化部署过程,并且结果在所有环境中都是可预测的。
可用技术
在我们的案例中,我们选择使用工具组合,因为它似乎可以为我们的复杂需求提供最佳解决方案。大多数开发企业产品的团队将从这种全新的方法中受益。我们的工具栈包括
- Jenkins以主从模式作为构建服务器
- Jenkins Pipelines推动CI流程
- Git Hooks通过代码提交触发构建
- SonarQube作为代码质量工具
- 用于自动化功能测试的机器人框架
- JMeter性能测试
- OWASP ZAP用于安全扫描
结论
高效的CI / CD管道可以大大缩短产品上市时间,并有助于保持所交付软件的稳定性和质量。但是,成功的实施不仅需要正确的技术,还需要关键利益相关者的承诺。项目发起人在投资时应具有长远眼光,技术领导者在推动转型中起着