在多个同时上游工作成功之后,如何让Jenkins工作开始?

为了获得尽可能快的反馈,我们偶尔需要Jenkins作业并行运行。 jenkins有能力在工作完成时启动多个下游工作(或“分叉”pipe道)。 然而,jenkins似乎没有办法做下游的工作,只有那个分支的所有分支开始成功(或“join”分叉)。

jenkins有一个“build立其他项目之后build立”button,但是我认为这是“当任何上游作业完成时开始这个工作”(而不是“当所有上游工作成功时开始这个工作”)。

这是我正在谈论的一个可视化。 有谁知道插件是否存在做我以后? 建立管道


编辑:

当我最初在2012年发布这个问题的时候,Jason的回答(Join和Promoted Build插件)是最好的,也是我的解决scheme。

然而,在这个问题之后,dnozay的答案(Build Flow插件)在一年左右stream行,这是一个更好的答案。 如果今天有人问我这个问题,我现在就推荐这个问题。

过去我曾经用过两种解决scheme:

  1. 在“部署”作业上使用Join Plugin ,并将“promote”指定为目标作业。 您必须将“functiontesting”和“性能testing”指定为join的作业,并以构build后的某种方式启动它们。 参数化的触发器插件对此很有帮助 。

  2. 在“部署”作业上使用Promoted Builds Plugin ,指定在下游作业完成时起作用的升级,并指定Functional和Performancetesting作业。 作为促销活动的一部分,触发“促销”工作。 您仍然必须从“部署”开始两个testing工作

这两种解决scheme都有一个关键的方面:指纹必须正确使用。 这是我发现的:

  1. “构build”作业必须创build一个新的指纹文件。 换句话说,它必须指定一些Jenkins认为是由最初的工作产生的文件。 仔细检查作业的“查看指纹”链接,以validation这一点。
  2. 所有下游链接作业(在这种情况下,“部署”,“functiontesting”和“性能testing”)需要获取和指纹这个相同的文件。 复制文物插件是伟大的这种事情。
  3. 请记住,一些插件允许您更改指纹顺序和下游作业的开始; 在这种情况下,指纹必须发生在下游作业指纹同一文件之前,以确保正确设置指纹的起源。

pipe道插件

您可以使用pipe道插件 (以前的workflow-plugin )。

它带有很多例子 ,你可以按照这个教程 。

例如

 // build stage 'build' ... // deploy stage 'deploy' ... // run tests in parallel stage 'test' parallel 'functional': { ... }, 'performance': { ... } // promote artifacts stage 'promote' ... 

build立stream程插件

您也可以使用Build Flow插件 。 这简直棒极了 – 但它被弃用(发展冻结)。

设置工作

创build工作:

  • build立
  • 部署
  • 性能testing
  • functiontesting
  • 提升

build立上游

  1. 在上游(在这里build )创build一个独特的神器,例如:

     echo ${BUILD_TAG} > build.tag 
  2. 归档build.tag工件。

  3. logging指纹来跟踪文件的使用情况; 如果任何作业复制相同的build.tag文件并logging指纹,您将能够跟踪父项。
  4. configurationpromotion作业成功时promotion

设置下游工作

  1. 我使用了2个参数PARENT_JOB_NAMEPARENT_BUILD_NUMBER
  2. 使用“ 复制工件插件 ” 复制上游build作业中的工件

    • 项目名称= ${PARENT_JOB_NAME}
    • 哪个build = ${PARENT_BUILD_NUMBER}
    • 工件复制= build.tag
  3. logging指纹; 这是至关重要的。

设置下游推广工作

像上面一样做,build立上下游关系。 它不需要任何构build步骤。 您可以执行额外的构build后操作,如“嗨QA,轮到你了”。

创build一个构buildstream程作业

 // start with the build parent = build("build") parent_job_name = parent.environment["JOB_NAME"] parent_build_number = parent.environment["BUILD_NUMBER"] // then deploy build("deploy") // then your qualifying tests parallel ( { build("functional tests", PARENT_BUILD_NUMBER: parent_build_number, PARENT_JOB_NAME: parent_job_name) }, { build("performance tests", PARENT_BUILD_NUMBER: parent_build_number, PARENT_JOB_NAME: parent_job_name) } ) // if nothing failed till now... build("promotion", PARENT_BUILD_NUMBER: parent_build_number, PARENT_JOB_NAME: parent_job_name) // knock yourself out... build("more expensive QA tests", PARENT_BUILD_NUMBER: parent_build_number, PARENT_JOB_NAME: parent_job_name) 

祝你好运。

jenkins最近宣布了对工作stream程的一stream支持。

Multijob插件适用于这种情况。 如果您希望单个“父母”作业启动多个“孩子”作业,但仍然能够自行手动执行每个孩子,那么它也派上用场。 这可以通过创build“阶段”来实现,您可以在其中添加1到n个作业。 构build只在整个阶段完成时继续,所以如果一个阶段是多个工作,那么在执行其余部分之前,它们都必须完成。 当然,如果在阶段内发生故障,构build是否继续是可configuration的。

杰森&dnozay的答案是够好的。 但是,如果有人正在寻找简单的方法只使用JobFanIn插件 。

我相信Workflow Plugin现在被称为Pipeline插件,并且是受Build Flow Plugin启发的原始问题的(当前)首选解决scheme。 GitHub还有一个入门教程 。