如何在完成一系列其他工作后触发Jenkins工作?

时间:2015-09-21 20:52:04

标签: jenkins jenkins-workflow jenkins-job-dsl jenkins-build-flow

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

4 个答案:

答案 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,然后在配置中添加任意数量的作业。您还需要为每个作业指定阶段。