如何使TeamCity构建等待直到其所有的构件依赖项被重新构建?

4
我有一个TeamCity项目,其中包含几种构建配置类型:
- 应用程序包:包含各种应用程序组件,从版本控制中的不同子树构建而成。 - 角色包:将应用程序包以不同的配置方式组合在一起(应用服务器角色具有共同代码+前端,Web服务角色具有共同代码+后端等)。 - 回归测试:一系列构建步骤,将角色包部署到相应的测试服务器上并运行漫长的Selenium测试套件。
目标是经常构建应用程序包,以便我们可以立即知道单元测试何时失败,按需构建角色包,并且只要有新的角色包需要测试,就尽可能频繁地运行回归测试。但由于回归测试需要很长时间,并且一次只能运行一个回归测试(它独占一组测试服务器),因此我们总是希望它在开始运行时选择最新可用的包。例如:
- 3:00 提交代码 - 3:01 构建应用程序包(A1) - 3:02 应用程序包A1完成 - 3:02 构建角色包(R1) - 3:03 角色包R1完成 - 3:04 开始运行R1的回归测试 - 3:10 提交代码 - 3:11 构建应用程序包(A2) - 3:12 应用程序包A2完成 - 3:12 构建角色包(R2) - 3:13 角色包R2完成 - 3:20 提交代码 - 3:21 构建应用程序包(A3) - 3:22 应用程序包A3完成 - 3:22 构建角色包(R3) - 3:23 角色包R3完成 - 3:30 R1的回归测试完成 - ** R2的回归测试从未运行 ** - 3:30 开始运行R3的回归测试
到目前为止,我使用构件依赖项和构建触发器来实现这一点:
- 应用程序包由计划触发器触发,受限于VCS触发规则中的相关源代码。它们没有TeamCity依赖项。 - 角色包由指向所有相关应用程序包的完成构建触发器触发。每个角色包对相关应用程序包(最后一个成功构建)具有构件依赖项。 - 回归测试由指向所有角色包的完成构建触发器触发,并且受限于单个代理上的运行。它对所有角色包具有构件依赖项。
当只有一个角色被重建时,这很有效。但是当多个角色同时更改时,回归测试会在第一个角色重建后立即开始运行,然后在该测试完成之前不会选择其余角色。我希望当最后一个更改的角色重建时,回归测试开始运行。(注意:角色比代理多,回归测试在与包构建不同的代理上运行。)
快照依赖关系听起来像是我需要的工具...但我的理解是它们强制所有依赖配置从相同的VCS修订版运行,而且我想避免强制重建包,如果它的代码没有改变。如果今天唯一的变化是影响角色R的包中的一个包,则不应重新构建角色S/T/U,其依赖项也不应该重新构建。这可能吗?

编辑:我正在运行TeamCity 7.1.1。


你最终解决了这个问题吗?我们有类似的情况,目前看来我的唯一选择是编写一些代码,将此逻辑内置其中(例如自定义触发器或使用 REST API 的 PowerShell 脚本)。 - Stephen Edmonds
1个回答

1
我认为,使用“快照依赖”配合“如果有适用版本则不运行新构建”和“仅使用适用版本中的成功版本”,再加上使用“从同一链中构建”的“制品依赖”,可以达到您想要的效果。这种配置应该意味着它会发现没有必要重新构建,因为没有任何变化,注意,它仍然触发构建,但它所做的只是评估是否有需要执行的操作,之后继续进行构建流程。
注:您没有提及您运行的版本,但我认为在6.5版本中,这个功能不能正常工作,在7.1版本中则可以(更优化)。

听起来我还需要为每个项目设置结帐规则(而不仅仅使用触发器规则),否则TeamCity将无法检测到没有更改。 - Tara McGrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接