詹金斯对3个上游工作的钻石依赖仅触发2次

时间:2016-09-16 08:16:54

标签: jenkins dependencies

我们有一个jenkins工作(A)触发其他3个工作(B1,B2,B3)。 这3个工作都触发了相同的工作(C)。 当触发作业A时,作业C执行两次(我预期3次)。

问题:有人可以解释为什么C被触发两次而不是三次?

依赖关系概述:

  -> B1 ->
A -> B2 -> C
  -> B3 -> 

下游构建视图显示其中两个作业(例如B2,B3)仅触发一次C的执行。请注意,这两个作业并不总是相同。

执行概述(A的下游构建视图)

  -> B1 -> C (build number 1)
A -> B2 -> C (build number 2) 
  -> B3 -> C (build number 2)  <<< same as for B2

有关工作配置的更多详细信息:

作业A具有构建后动作/构建其他项目:B1,B2,B3

在构建其他项目后,作业C具有构建触发器/构建/要观察的项目:B1,B2,B3

Jenkins版本:1.583

1 个答案:

答案 0 :(得分:1)

这就是Jenkins如何触发工作的方式。如果C中不允许并发构建(我认为它们不是),则会发生以下情况:

  1. A完成并触发B1,B2,B3
  2. B1(例如,也可以是B2或B3)完成并触发C,构建#1(C#1)。
  3. B2完成并触发C.由于C#1仍在运行,因此构建堆叠。
  4. B3完成并触发C.只要C#1构建正在运行,其他构建就会堆叠,如果它们以相同方式触发(即C不是参数化构建或参数相同),则堆叠构建将合并合而为一。因此,只有一个C(C#2)版本保持堆叠。
  5. C#1完成,队列中的下一个构建(C#2)启动。当C#2被合并时(来自触发器B2,B3),构建队列现在是空的。
  6. C完成C#2。
  7. 如您所见,C只运行了两次。

    但是有一个解决方法。使C参数化并提供不同的值(例如触发器的作业名称)。或者允许并发构建C - 但您必须确保它不会访问相同的共享资源(例如,通过关键部分排除)。