根据一组其他工作的完成,你只有一个工作的简单情况很简单:要么使用多工作,要么使用带有parallel { ... }
的构建流程插件。我试图解决的案例更为笼统,例如:
JobA depends on JobX and JobZ
JobB depends on JobY and JobZ
SuperJob depends on JobA and JobB
我希望每个这些作业尽快触发,并且只有在其先决条件完成时才会触发。
看起来,构建流程插件,连接插件或作业DSL插件都没有良好的机制。当然,我可以开始我的所有工作并让他们对詹金斯进行民意调查,但那会非常难看。
另一个死胡同是"上游工作触发"。我想触发一个特定的工作构建,而不仅仅是上游工作的任何运行。
更新
一个答案提到了multijob插件。它确实可以用来解决这个问题,但是调度和总构建时间几乎总是最坏的情况。例如,假设此依赖关系图,其构建时间如下所示:
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
如果我有办法在完成所有先决条件后完全触发下一个工作,那么总构建时间将只有57米。
这里的答案应该解释我如何能够获得这种行为,最好不要编写自己的轮询机制。
更新1 1/2 在下面的评论中,有人建议我将左任务和正确的任务分组到一个子任务中。是的,这可以在这个例子中完成,但是通常很难做到这一点,而且是自动的。例如,假设有一个额外的依赖:right2取决于left1。在给定构建时间的情况下,最佳构建时间不应该改变,因为在启动right2之前left1已经完成了很长时间,但是如果没有这方面的知识,你就不能再将left1和left2集中在同一个组中,而不存在没有right1的风险可用。
更新2
看起来这里没有现成的答案。看来我将不得不自己编写一个系统groovy脚本。看看我自己对这个问题的回答。
更新3
我们最终分配了multijob插件并在其中编写新逻辑。我希望我们可以在一些清理之后将它作为一个新的插件发布......
答案 0 :(得分:3)
由于你添加了jenkins-workflow标签,我想使用Jenkins Workflow Plugin对你来说没问题,所以也许这个Workflow脚本可以满足你的需求:
node {
parallel left: {
build 'left1'
build 'left2'
}, right: {
build 'right1'
build 'right2'
},
failFast: true
build 'zip'
}
只要两个并行分支完成,此工作流程就会触发zip
。
答案 1 :(得分:1)
据我所知,我的问题没有公布解决方案,所以我必须自己动手。以下系统groovy脚本工作,但显然可以使用一些增强功能。具体来说,我真的很想念一个简单的单页构建状态概述...
这个要点实现了我的解决方案,包括正确处理取消工作:https://gist.github.com/cg-soft/0ac60a9720662a417cfa
答案 2 :(得分:0)
您可以在其中一个父作业的配置中使用Build other projects
作为Post Build Actions
,这会在成功构建作业时触发第二个父作业。当第二个父作业也完成后,通过相同的方法触发您的子作业。
答案 3 :(得分:0)
Multijob plugin可用于制作职位层次结构。
首先在新项目中选择Multijob Project,然后在配置中添加任意数量的作业。您还需要为每个作业指定阶段。