根据一组其他作业的完成情况,您只有一个作业的简单情况很简单:使用多作业或使用带有parallel { ... }
. 我试图解决的情况更普遍,例如:
JobA depends on JobX and JobZ
JobB depends on JobY and JobZ
SuperJob depends on JobA and JobB
我希望这些作业中的每一个都尽快触发,并且仅在其先决条件完成时触发。
看起来构建流程插件、连接插件或作业 DSL 插件都没有一个好的机制。当然,我可以开始我所有的工作并让他们投票给詹金斯,但这会很丑陋。
另一个死胡同是“上游作业触发器”。我想触发特定的作业构建,而不仅仅是上游作业的任何运行。
更新
一个答案提到了多任务插件。它确实可以用来解决这个问题,但调度和总构建时间几乎总是最坏的情况。例如,假设这个依赖图,构建时间如下所示:
left1 (1m) right1 (55m)
| |
left2 (50m) right2 (2m)
|____________|
|
zip
使用 multijob 插件,您可以获得:
Phase 1:
left1, right1 // done in 55m
Phase 2:
left2, right2 // done in 50m
Phase 3:
zip // total time 105m
如果我有办法在所有先决条件都完成后准确地触发下一个工作,那么总构建时间将只有 57m。
这里的答案应该解释我如何获得这种行为,最好不要编写我自己的轮询机制。
更新 1 1/2 在下面的评论中,建议我将左侧任务和右侧任务组合成一个子任务。是的,这可以在这个例子中完成,但通常很难自动完成。例如,假设有一个额外的依赖关系:right2 依赖于 left1。在给定构建时间的情况下,最佳构建时间不应该改变,因为 left1 在启动 right2 之前很久就完成了,但是如果没有这些知识,您就不能再将 left1 和 left2 放在同一组中,而不会冒没有 right1 的风险可用的。
更新 2
看起来这里没有现成的答案。看来我将不得不自己编写一个系统 groovy 脚本。请参阅我自己对这个问题的回答。
更新 3
我们最终分叉了 multijob 插件并在其中编写了新的逻辑。我希望我们可以在一些清理之后将它作为一个新插件发布......