如果工件是相同的,如何停止构建 - 但不是构建链

时间:2015-09-29 14:33:48

标签: teamcity teamcity-9.0

构建链中的构建计划存在问题,这让我很困扰。

我有一个简单的构建链A -> B,其中

  • A非常快(不到一分钟) - 它基本上是从生产系统中检索数据库。在处理完成之前,无法判断生成的工件是否与先前的结果相同。目前正在构建计划的时间。
  • B非常慢(5-6小时) - 它将A的输出加上许多其他来源组合成大量的工件。目前,它具有对A的快照依赖性以及对其他源的依赖性。

除非需要,否则我想避免运行B​​ - 即如果B的任何输入发生了变化 - 但我该怎么做?

如果检测到结果未更改,我可能会失败/取消A,但这会导致"快照依赖性失败"对于B,所以如果任何其他B的其他输入源确实改变了它将不会重建结果......

有没有办法停止或中止A的构建,以便不会触发B的构建?

编辑 :我(可能)有一个想法:我可以在SCM中检查生成的工件 - 如果它与以前的版本不同 - 并且让这推动了B的触发 - 它已经在SCM中拥有许多其他来源。它不会是同一个构建链的一部分 - 据我所知 - 但它是次佳的......

2 个答案:

答案 0 :(得分:1)

我不这么认为。 TeamCity中的构建链是静态的。

有两种可能的解决方法

  1. 编写一个插件来处理这种情况。当B排队时,它将是一个服务器端插件,可以启动buildTypeAddedToQueue(SQueuedBuild queuedBuild)事件。它会做一些环顾(比较工件)并立即从队列中删除B.
    • 我相信这会像B排队然后由用户排队一样。即它并不像看起来那么笨拙 - 从队列中删除构建是一种支持的TC操作。
    • 这可能比你想要的更费力......
  2. 在B.处理
    • 这可能要简单得多,但我假设你想避免这种情况。
  3. 我认为你理想的想要在A中处理这个问题,所以#2不是一个选择。 #1虽然接近但当然还有更多的参与。

答案 1 :(得分:0)

我想它应该跳过A重建并使用最近的一个,如果A的新潜在构建与一些最近的构建相同。例如,请求具有相同VCS版本且具有相同设置的依赖构建A不应再次触发构建。