4

根据一组其他作业的完成情况,您只有一个作业的简单情况很简单:使用多作业或使用带有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 插件并在其中编写了新的逻辑。我希望我们可以在一些清理之后将它作为一个新插件发布......

4

4 回答 4

3

由于您添加了 jenkins-workflow 标记,我想您可以使用 Jenkins Workflow 插件,所以这个 Workflow 脚本可能适合您的需求:

node {
    parallel left: {
        build 'left1'
        build 'left2'
    }, right: {
        build 'right1'
        build 'right2'
    },
    failFast: true

    build 'zip'
}

zip此工作流程将在两个并行分支完成后立即触发。

于 2015-09-25T08:57:53.977 回答
1

据我所知,我的问题没有公布的解决方案,所以我必须自己动手。以下系统常规脚本有效,但显然可以使用一些增强功能。具体来说,我真的很想念一个简单的一页构建状态概述......

这个要点实现了我的解决方案,包括正确处理工作取消:https ://gist.github.com/cg-soft/0ac60a9720662a417cfa

于 2015-09-25T20:33:18.727 回答
0

您可以在其中一个父作业的配置中使用Build other projectsas Post Build Actions,这将在成功构建作业时触发第二个父作业。当第二个父作业也完成时,以相同的方法触发您的子作业。

于 2015-09-21T21:45:11.603 回答
0

多作业插件可用于制作作业层次结构。

首先在新项目中选择多作业项目,然后在配置中您可以添加任意数量的作业。您还需要为每个作业指定阶段。

于 2015-09-22T09:49:19.620 回答