GoCD 扇入依赖管理
GoCD 支持自动触发的管道的扇入依赖解析。扇入材料解析将确保一个管道仅在所有其上游管道都基于同一版本的祖先管道或材料触发时才触发。当你有多个分别在不同管道中构建的组件,并且这些组件都具有相同的祖先时,希望下游管道使用来自祖先管道的相同版本的工件,就会出现这种情况。
当你的管道依赖图不简单、管道执行时间差异显著并且有自动构建/部署时,你可能会遇到以下问题
- 浪费的构建: 由于其中一个依赖管道比其他管道更快完成而导致的过早运行,无法获得正确的依赖组件版本。
- 不一致的结果: 因为这些组件的构建时间不同,你的部署可能依赖于不兼容的组件版本。
- 错误的反馈: 你的生产环境部署应该只在成功通过 UAT、Staging 和 Pre-Prod 环境后才进行,但由于 UAT 完成得太快而过早触发。
- 使用错误的测试运行代码: 您的提交包含代码和为该代码编写的测试。您的流水线设计为验收或测试流水线在构建流水线之后运行。验收应使用与代码匹配的正确测试,但实际却使用提交时可用的上一个测试版本。
GoCD 帮助解决上述所有问题。
如何使用扇入:
- 在整个过程中使用 SCM 材料的情况下,需要在整个过程定义相同的 URL。这将让 GoCD 知道这是一个共享材料,并且 GoCD 将强制实施适用的扇入。例如:代码、测试、环境配置分别位于不同的仓库中。在这种情况下,请确保对于需要这些材料的管道,URL 设置为相同的值。例如,Build、Acceptance 和 Deploy 管道的材料 URL。
http://svn.company.com/code
,http://svn.company.com/tests
和http://svn.company.com/config
分别位于不同的存储库中。在这种情况下,请确保对于需要这些材料的管道,URL 设置为相同的值。例如,Build、Acceptance 和 Deploy 管道的材料 URL。http://svn.company.com
- 需要扇入依赖解析的管道需要将触发类型设置为自动。
扇入解析的示例用例
创建通往生产的门控
我希望将构建并行推送到多个环境中(手动 QA、业务签核的 UAT 和性能测试),以便所有这些活动同时发生。因此,我们有一个如下面显示的管道依赖模型。
对于下一步,当部署到生产环境时,我们有一个依赖于上述三个管道的管道,以便在所有三个环境中成功的构建会自动推送至生产环境。如下所示。
事件顺序和解决方案
- 新的构建生成。
- 该构建被推送到 QA、UAT 和性能管道。
- 无论每个管道花费多长时间,GoCD 将确保只有在所有三个管道都通过绿色状态且使用相同版本的构建后,生产才会被触发。生产将使用您构建工件的正确版本。
如何配置:
- 生产必须将触发类型设置为自动。
- QA、UAT 和性能必须将 Build 作为材料。这些管道的触发类型可以是手动或自动。
选择依赖组件的正确版本
我有三个组件管道(C1、C2、C3)和一个获取它们工件并创建部署包的包管道。组件 C2 和 C3 依赖于管道 C1 并将其作为材料。C2 管道构建速度较快,但 C3 花费较长时间。所以我们的管道依赖模型如下面显示。
包管道不应该在 C2 完成后立即触发。它应在 C2 和 C3 都变绿时才触发。此外,Package 应使用与 C2 和 C3 使用的相同版本的 C1。
事件顺序和解决方案
- C1 在更改后被触发。
- C1 成功后,C2 和 C3 被触发。
- C2 构建速度很快,但 C3 仍在进行中。
- Go 解析出 C3 和 C2 依赖于共同的祖先 C1。因此 GoCD 将等待 C3 完成。
- 如果 C3 变绿,Package 管道将被触发。它将使用 C1、C2 和 C3 的正确版本。
如何配置:
- 将 C1 添加为 C2 和 C3 管道的材料
- 将 C2 和 C3 添加为 Package 管道的材料。
- Package 的触发类型应为自动
使用测试的正确版本测试源代码
你在同一次提交中检查代码和测试。构建管道编译代码并创建工件。验收管道获取构建工件并运行为已编译代码编写的测试。验收必须使用与代码一起提交的相同测试。所以我们的管道依赖模型如下所示
事件顺序和解决方案
- 在提交更改时,构建管道将使用最新修订版触发。
- 尽管验收管道也有相同的材料依赖,GoCD 不会立即触发它。
- 构建管道成功执行。
- 验收现在将使用同一版本的SCM触发,并从构建管道中获取正确的构建工件。
如何配置:
- 为构建和验收管道添加相同的SCM材料,即相同的URL。
- 构建和验收管道的触发类型设置为自动。
局限性
-
扇入和材料过滤器如果对扇入有贡献的管道在其材料定义中有过滤器,则目标管道不会遵循扇入行为。
例如,参考上述场景。P1 和 P2 是两个使用相同 Mercurial (hg) 仓库的管道,包含两个文件夹,比如“p1”和“p2”。P1 配置了拒绝“p2”文件夹的过滤器。类似地,P2 配置了拒绝“p1”文件夹的过滤器。
当“p1”文件夹有签入时,P1 的首次运行发生。当“p2”文件夹有签入时,P2 的首次运行发生。
在这种情况下,依赖于 P1 和 P2 的 P3 不会触发。
注意事项
-
扇入功能默认启用。如果您需要管道在每个版本上触发,无论祖先版本如何,您可以禁用扇入。要禁用扇入,您需要设置系统属性
resolve.fanin.revisions
为false
并重启 GoCD 服务器。要配置系统属性,请编辑文件
wrapper-properties.conf
以添加上述系统属性。有关文件位置,请参阅安装文档。wrapper-properties.conf
参考资料: -
GoCD 仅对具有自动触发类型的管道应用扇入依赖解析。