团队城市中快照依赖和完成构建触发器有什么区别?

15

在TeamCity中,快照依赖的功能似乎完全取代了已完成构建触发器的功能。如果它们导致不同的链式行为,有人可以解释一下这些方法的影响吗?例如,如果我有一个A->B的构建链:

在这三个设置中,实际上是否存在任何不同的链式行为?

  • 设置1:在B中对A进行单一的已完成构建触发。
  • 设置2:在B中对A进行单一的快照依赖。
  • 设置3:在B中定义A的已完成构建触发和快照依赖。

我知道可以将快照依赖看作所有被依赖项的“AND”操作,而已完成构建触发器则在所依赖项之间起到“OR”的作用。但在顺序链的情况下,有什么不同吗?

谢谢, Scott

2个回答

18
“快照依赖”和“完成构建”触发器非常不同。一个基本上是“推”的操作,而另一个则是“拉”的操作。
设置1:如果我有构建配置A和B,其中B在A上有一个“完成构建”触发器,那么相反的行为就成立了。触发B将不会对A产生任何影响,但是触发A将在B完成后有效地触发B。
设置2:如果我有完全相同的设置,但是B代替A具有快照依赖关系,则每当触发B时,A将首先运行,或者至少在运行B之前检查是否需要运行。如果只触发A,则不会触发B。
设置3:设置3略有不同,因为它不仅取决于“完成构建”触发器或快照依赖关系。它还取决于初始触发器(VCS、定时或其他)。例如,如果A上有VCS触发器,并且B既具有“完成构建”触发器又具有“快照依赖”关系,则您实际上获得了设置1的行为。A将在VCS更改时被触发,并且B将在A之后触发(使用相同的快照)。实际上,如果没有快照设置,不能保证B将使用与A相同的快照,这可能是您想要的也可能不是。
因此,一般来说,当您需要进行“从左到右”的触发过程时,您可以同时使用完成构建触发器和快照依赖关系来保证构建成果的完整性。如果您的初始触发器(版本控制系统或计划等)设置在B上,那么拥有“完成构建”触发器就有些无效了,因为B将始终首先被触发(但不运行),然后它将触发所有依赖项并在它们完成后自动运行。希望这能帮到您。谢谢!

4
正如你所说,如果一个配置快照依赖于多个其他配置(Z快照同时依赖于X和Y),那么就存在很大的差异。但是你对此不感兴趣...
可以肯定的是,在A->B简单的情况下,设置1到3几乎等效。当然,只有在触发A和B的事件是一对一的情况下才成立(例如,A和B都在同一个VCS根上触发;或者它们使用不同的VCS根,但仅手动触发)。如果是这样的话,那么您的A->B链就非常简单,可能可以在单个构建配置中实现。
其他微妙的差异也会出现:
1. 将参数传递下来。 - 假设A和B共享一些用户定义的参数“foo”。 A->B快照依赖关系使您可以在A中定义%foo%,并通过在B中使用%dep.A.foo%重用它。这非常方便,因为您不需要担心在A和B之间保持%foo%的值同步。 - 现在假设您想要使用自定义的%foo%手动触发A->B链(您将在“运行...”对话框中指定该值)。 - 由于TC无法向上(从B到A)传递值,因此您必须真正触发A并在那里指定自定义值。当A完成后,它将触发B,B将接管自定义值。那就是设置3。 - 您无法使用设置2实现相同的功能,即使用自定义值触发B。自定义值将无法到达A。
2. 调度。 - 假设您有一个稀缺的资源,B不能为每个提交运行。您最终会得到每个B运行“包含”(覆盖)多个VCS提交。同时,A每次提交都没有问题。 - 在设置1和3中,如果您在A上有一个VCS触发器,那么您最终会得到 - 为每个提交运行A - 执行“聚合”提交的B运行(每次运行涵盖多个更改) - 在设置2中,如果您只在B上有一个VCS触发器,那么您最终会在A和B中都有聚合提交。这可能是您想要的,也可能不是。
3. 不同的VCS根。 - 如果A和B具有不同的VCS根,则设置1(A只有VCS触发器)和设置2(B只有VCS触发器)的行为会有很大的不同。
总的来说,我同意快照依赖项(设置2)的“拉取”特性更加吸引人。如有需要,可以与触发器组合使用(设置3)。

感谢详细的解释。 在我的情况下,共享参数和稀缺资源非常罕见,因此我可能会默认仅使用快照依赖(设置2),如果需要不同的VCS根目录具有特定行为,则使用组合(设置3)。 - Scott Chang
在设置3中,如果快照依赖项的选项“如果有合适的构建,则不运行新构建”未选中,那么请问A会被运行两次吗?也就是说,某些东西会触发A,当A完成后,“完成构建”会启动并尝试将B放入队列,然后“快照依赖项”会再次启动并在B排队之前再次将A排队。在我测试这个设置时,它没有将另一个A放入队列,但理论上应该会。TeamCity是否有内部逻辑来忽略快照依赖项的排队步骤,如果存在完成构建触发器? - Scott Chang
即使未选中此选项,我认为不应重新排队A。那将非常不切实际,我想不出谁可能需要这种行为。(我猜您也不希望有这种行为,您只是想知道如果不是那个选项,这个选项的作用是什么。) 我相信这个选项的作用是:踢A,让B触发。两者都已运行一次。现在仅手动触发B,自上次B构建以来没有代码更改。这是否会再次触发A?这就是这个选项的作用所在。 - sferencik
是的,我只是想了解这个选项。我不想要那种行为,所以我知道我可以安全地使用设置3,而不会引起重新排队 - 即使TeamCity自己的描述在这一部分并不清楚。感谢您的帮助。很抱歉我不能给答案点赞。 - Scott Chang

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