我有一个包含几种构建配置的 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。