在多个同时上游工作成功之后,如何让Jenkins工作开始?
为了获得尽可能快的反馈,我们偶尔需要Jenkins作业并行运行。 jenkins有能力在工作完成时启动多个下游工作(或“分叉”pipe道)。 然而,jenkins似乎没有办法做下游的工作,只有那个分支的所有分支开始成功(或“join”分叉)。
jenkins有一个“build立其他项目之后build立”button,但是我认为这是“当任何上游作业完成时开始这个工作”(而不是“当所有上游工作成功时开始这个工作”)。
这是我正在谈论的一个可视化。 有谁知道插件是否存在做我以后?
编辑:
当我最初在2012年发布这个问题的时候,Jason的回答(Join和Promoted Build插件)是最好的,也是我的解决scheme。
然而,在这个问题之后,dnozay的答案(Build Flow插件)在一年左右stream行,这是一个更好的答案。 如果今天有人问我这个问题,我现在就推荐这个问题。
过去我曾经用过两种解决scheme:
-
在“部署”作业上使用Join Plugin ,并将“promote”指定为目标作业。 您必须将“functiontesting”和“性能testing”指定为join的作业,并以构build后的某种方式启动它们。 参数化的触发器插件对此很有帮助 。
-
在“部署”作业上使用Promoted Builds Plugin ,指定在下游作业完成时起作用的升级,并指定Functional和Performancetesting作业。 作为促销活动的一部分,触发“促销”工作。 您仍然必须从“部署”开始两个testing工作
这两种解决scheme都有一个关键的方面:指纹必须正确使用。 这是我发现的:
- “构build”作业必须创build一个新的指纹文件。 换句话说,它必须指定一些Jenkins认为是由最初的工作产生的文件。 仔细检查作业的“查看指纹”链接,以validation这一点。
- 所有下游链接作业(在这种情况下,“部署”,“functiontesting”和“性能testing”)需要获取和指纹这个相同的文件。 复制文物插件是伟大的这种事情。
- 请记住,一些插件允许您更改指纹顺序和下游作业的开始; 在这种情况下,指纹必须发生在下游作业指纹同一文件之前,以确保正确设置指纹的起源。
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立上游
-
在上游(在这里
build
)创build一个独特的神器,例如:echo ${BUILD_TAG} > build.tag
-
归档
build.tag
工件。 - logging指纹来跟踪文件的使用情况; 如果任何作业复制相同的
build.tag
文件并logging指纹,您将能够跟踪父项。 - configuration
promotion
作业成功时promotion
。
设置下游工作
- 我使用了2个参数
PARENT_JOB_NAME
和PARENT_BUILD_NUMBER
-
使用“ 复制工件插件 ” 复制上游
build
作业中的工件- 项目名称=
${PARENT_JOB_NAME}
- 哪个build =
${PARENT_BUILD_NUMBER}
- 工件复制=
build.tag
- 项目名称=
-
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还有一个入门教程 。