下一代持续集成

尚无读者喜欢这篇文章。
Open innovation

Opensource.com

传统的持续集成 (CI) 系统被设计为作业流水线。您需要进行同行评审,然后是构建作业,然后是单元测试作业,然后是集成测试作业,然后是性能测试作业,等等。

每个作业都由前一个作业成功完成触发,第一个作业由版本控制源代码文件的更改触发。当然,如果您要面向多个二进制平台,或者您正在构建一组组件以便能够测试完整的应用程序,则情况可能会更复杂。

Continuous Integration flowchart

但是,当作业失败时会发生什么?根据 Jez Humble 和 David Farley 在参考书 持续交付 中的说法,您首先必须遵循以下规则:“不要在构建失败时提交代码。” 换句话说,不要通过推送其他更改使情况变得更糟。如果您这样做,您将无法知道故障的原因。Humble 和 Farley 建议使用以下两种策略之一来处理故障

  1. “永远不要在构建失败时回家”,这意味着团队中的每个人都需要停止处理当前的任务,转而解决问题。
  2. “始终准备好恢复到之前的版本。” 回滚也可以是避免阻止整个团队的策略。

当然,也可以混合使用:限定修复尝试的时间,然后在超出允许时间时回滚。

另一种缓解此问题的方法是使用集成分支,仅在集成分支为绿色(所有测试都通过)时才合并修改。使用此策略,您在集成分支上遇到相同的问题,但是您的主分支始终处于可用状态。

这在小型团队中可能有效,当您可以阻止所有队友提交代码时,但即使在小型团队中,此过程通常也会导致 CI 长时间处于红色状态。您需要强制执行良好的纪律才能在这种 CI 中取得成功,或者您可以切换到新的 CI 方法。

下一代 CI

当前一代 CI 以 CI 服务器为中心。更改由 CI 服务器检测并触发作业。

在下一代 CI 中,系统以代码审查系统为中心,以便能够在修改合并到版本控制系统之前执行操作。

是否实施队友代码审查流程的决定取决于您。我真的建议这样做以提高代码质量,但这与 CI 系统是正交的。无论如何,重要的是要理解,构建和测试的触发是由向代码审查系统提交的新内容完成的。一旦所有测试都通过,代码就会合并到主分支。这样,您的主分支始终是绿色的,您的开发人员可以并行处理他们的修改。这种新的 CI 系统使您可以扩展自动化工作并保持流畅,因为不再存在阻塞问题。

OpenStack 工作流程

这种新的 CI 方法已在 OpenStack 项目中大规模实施,以管理所有不同子项目的 CI。为了让您了解规模,OpenStack 每天处理 1,000 个建议的补丁集,在 Gerrit 上发布 7,500 条评论和投票,生成 16,000 个测试环境,并合并 250 个更改 (来源)。

为了实施这种下一代 CI 系统,OpenStack 项目使用了以下组件

  • Gerrit,代码审查和 git 存储库管理器。
  • Zuul,git 源代码存储库门控系统。
  • Jenkins,持续集成服务器。
  • Nodepool,在 OpenStack 云上智能 Jenkins 从节点配置。

这些工具允许通过使用推测性合并策略对同一项目进行并行测试。如果同一项目的多个审查同时出现,Zuul 能够以推测性堆叠的方式并行测试它们。例如,如果审查被命名为 A、B 和 C,Zuul 将并行测试 A、A+B 和 A+B+C。如果它们都成功,则效果与先测试并合并 A,然后在分支 (A) 之上测试 B 并合并,以及在 A+B 之上测试 C 相同。当您有多个项目贡献者时,这会大大加快流程。

Zuul 还能够管理跨项目依赖项,从而允许在存储库之间合并审查。这在 git 世界中至关重要,在 git 世界中,您的组件位于不同的 git 存储库中。

亲自尝试

对于大型团队甚至小型团队,您可以通过配置前面描述的组件,从这种工作流程中受益于您的项目。可以使用 puppet 模块轻松配置这些服务。

另一种方法是使用我们自己集成的这些服务,称为 Software Factory。您将获得以下功能

  • 在一个 Web 菜单下的良好集成。
  • 所有服务之间的轻松单点登录以及 LDAP、GitHub 或 launchpad (cauth) 上的外部身份验证。
  • 一个错误跟踪系统 (Redmine)。
  • 协作工具
    • 粘贴以共享输出或代码摘录。
    • Etherpad 用于协作编辑。
  • 以简单的方式管理从以前版本的升级。

由于 Software Factory 是自托管的(我们使用 Software Factory 开发 Software Factory),您可以在 softwarefactory-project.io 上看到它的实际效果。

如果您想试用 Software Factory,只需按照 softwarefactory-project.io/docs/deploy.html 上的文档进行操作。

请随时告知我们您在使用这种新的 CI 方法后取得的成就!

User profile image.
Frédéric Lepied 是 Red Hat 的高级经理。自 1996 年以来,他一直参与开源运动。曾为 Debian 和 XFree86 做出贡献,后来成为 MandrakeSoft/Mandriva 的 CTO。他一直使用 Python (rpmlint, lads, msec, pxemngr, edeploy) 编写和协调项目。在 Red Hat,他的团队正在为 OpenStack 做出贡献,并构建高级 CI/CD 解决方案。

6 条评论

很棒的文章,Frédéric。传统方法实际上更像是一场持续的噩梦。最好在测试 *后* 将提交合并到 master,这样 master 始终是可部署的。

我对大多数 CI 方法的抱怨是缺乏包含任何手动 QA 流程、UAT 或其他人对变更的审查。大多数方法只关注自动化测试,您也可以像您所说的那样进行代码审查。但在现实世界中,您需要从利益相关者那里获得对工作的反馈,并且您不希望在合并到暂存分支或 master 之后才进行测试和反馈,原因与您不希望在进行自动化测试之前合并代码的原因相同。

为了支持该工作流程,我们构建了 http://probo.ci/,现在正处于 Beta 阶段。我们很乐意听取您的反馈。

我完全同意这里的观点。我们已经在创业社区中看到了所谓的“Github 工作流程”的大量采用。这种工作流程本质上是您提出的以代码审查为中心的方法,我之前也写过关于它的文章 https://badmonkeydev.wordpress.com/2015/05/23/code-review-best-practice… 虽然我从未遇到过像您描述的 Zuul 那样的推测性合并

感谢 Frederic 的文章。很少有文章能让我点击这么多链接。

Zuul 是真正引起我注意的工具。在使用此工具时,您是否遇到过很多误报?先谢谢了。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.