为了尽可能获得最快的反馈,我们偶尔会希望Jenkins作业以并行方式运行。 Jenkins能够在作业完成时启动多个下游作业(或“分叉”管道)。但是,Jenkins似乎没有任何方法可以使下游作业只启动该fork的所有分支成功(或者将fork连接在一起)。
Jenkins有一个“构建其他项目后构建”按钮,但我将其解释为“当任何上游作业完成时开始这项工作”(不是“当所有<时开始这项工作” / strong>上游工作成功“)。
这是我正在谈论的内容的可视化。有谁知道一个插件是否存在我做的事情?
当我最初在2012年发布这个问题时,杰森的回答(加入和推广构建插件)是最好的,也是我选择的解决方案。
然而,dnozay的回答(The Build Flow插件)在这个问题之后大约一年左右流行,这是一个更好的答案。对于它的价值,如果人们今天问我这个问题,我现在建议改为。
答案 0 :(得分:30)
您可以使用Pipeline Plugin(以前为workflow-plugin
)。
它附带many examples,您可以按照此tutorial。
e.g。
// build
stage 'build'
...
// deploy
stage 'deploy'
...
// run tests in parallel
stage 'test'
parallel 'functional': {
...
}, 'performance': {
...
}
// promote artifacts
stage 'promote'
...
您也可以使用Build Flow Plugin。它简直太棒了 - 但它已被弃用(开发冻结)。
为:创建工作:
build
)中的创建一个独特的工件,例如:
echo ${BUILD_TAG} > build.tag
归档build.tag
工件。
build.tag
文件并记录指纹,您将能够跟踪父母。promotion
作业成功时升级。PARENT_JOB_NAME
和PARENT_BUILD_NUMBER
build
作业复制工件
${PARENT_JOB_NAME}
${PARENT_BUILD_NUMBER}
build.tag
记录指纹;这是至关重要的。
与上述相同,建立上下游关系。 它不需要任何构建步骤。您可以执行其他的构建后操作,例如“嘿QA,轮到你了”。
// 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)
祝你好运。
答案 1 :(得分:27)
我过去曾使用过两种解决方案:
使用“部署”作业中的Join Plugin并指定“提升”作为目标作业。您必须将“功能测试”和“性能测试”指定为已加入的作业,并以某种方式通过构建后启动它们。 Parameterized Trigger Plugin对此有好处。
在“部署”作业中使用Promoted Builds Plugin,指定在下游作业完成时有效的促销,并指定功能和性能测试作业。作为促销活动的一部分,触发“推广”工作。您仍然需要从“deploy”
这两种解决方案都有一个重要方面:必须正确使用指纹。这是我发现的:
答案 2 :(得分:11)
Jenkins最近announced对工作流程的一流支持。
答案 3 :(得分:8)
Multijob plugin可以很好地适应这种情况。如果您希望单个“父”作业启动多个“子”作业但仍能够自己手动执行每个子项,它也会派上用场。这可以通过创建“阶段”来实现,您可以向其中添加1到n个作业。构建仅在整个阶段完成后才会继续,因此如果一个阶段作为多个作业,则必须在执行其余任务之前完成。当然,如果阶段内出现故障,构建是否会继续进行配置。
答案 4 :(得分:3)
jason&amp;的回答dnozay足够好了。但是,如果有人正在寻找简单的方法,只需使用JobFanIn plugin。
答案 5 :(得分:2)
我相信Workflow Plugin现在被称为Pipeline Plugin,并且是原始问题的(当前)首选解决方案,受Build Flow Plugin的启发。 GitHub中还有一个Getting Started Tutorial。
答案 6 :(得分:1)
这个钻石依赖构建管道可以配置为 DepBuilder plugin。 DepBuilder 正在使用自己的域 特定语言,在这种情况下看起来像:
_BUILD {
// define the maximum duration of the build (4 hours)
maxDuration: 04:00
}
// define the build order of the existing Jenkins jobs
Build -> Deploy
Deploy -> "Functional Tests" -> Promote
Deploy -> "Performance Tests" -> Promote
构建项目后,构建可视化将显示在项目仪表板页面上:
如果任何上游作业没有成功,构建将自动中止。可以针对每个作业调整中止行为,有关详细信息,请参阅 DepBuilder documentation。