在多个同时的上游作业成功后,如何使Jenkins作业开始?


70

为了获得最快的反馈,我们有时希望Jenkins作业并行运行。作业完成后,詹金斯(Jenkins)可以启动多个下游作业(或“分叉”管道)。但是,Jenkins似乎没有任何办法仅使该分支的所有分支的开始成功(或将该分支“重新结合”在一起)来完成下游作业。

Jenkins有一个“在构建完其他项目后再构建”按钮,但是我将其解释为“在任何上游作业完成时启动此作业”(不是“在所有上游作业成功后启动此作业”)。

这是我在说什么的可视化。有谁知道插件是否存在以执行我的工作? 建立管道


编辑:

当我最初在2012年发布此问题时,Jason的答案(Join和Promoted Build插件)是最好的,也是我所选择的解决方案。

但是,dnozay的答案(“构建流”插件)在此问题问世大约一年后变得很流行,这是一个更好的答案。对于什么值,如果今天有人问我这个问题,我现在建议您这样做。


引用安德鲁的答案...。“詹金斯最近宣布了对工作流的一流支持。” jenkins-ci.org/content/workflow-plugin-10
Clintm

1
如果您认为较新的答案现在更合适,则可以更改所选答案。
naught101 '16

Answers:


27

过去,我针对此方案使用了两种解决方案:

  1. 在“部署”作业上使用Join Plugin,并将“ promote”指定为目标作业。您必须将“功能测试”和“性能测试”指定为已合并的作业,并以某种方式在构建后通过它们启动。该参数触发插件好这一点。

  2. 在“部署”作业上使用Promoted Builds插件,指定在下游作业完成时可以使用的升级,并指定功能和性能测试作业。作为升级操作的一部分,触发“升级”工作。您仍然必须从“部署”开始两个测试作业

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

  1. “构建”作业必须原始一个新的指纹文件。换句话说,它必须对Jenkins认为是最初工作起源的某些文件进行指纹识别。仔细检查作业的“查看指纹”链接以进行验证。
  2. 所有下游链接的作业(在这种情况下为“部署”,“功能测试”和“性能测试”)都需要获取并指纹化该文件。Copy Artifacts插件非常适合这种事情。
  3. 请记住,某些插件可让您更改指纹识别和下游作业开始的顺序。在这种情况下,必须在下游作业对同一文件进行指纹识别之前进行指纹识别,以确保正确设置了指纹的来源。

3
我尝试了Join和Promoted Builds插件,但是我认为它们的局限性是我第一次输入问题时没有考虑的。基本上,它们仅在拆分的每个“分支”恰好完成一项工作时才起作用。这些插件都可以按我上图中的预期工作,但是我们的真实管道看起来更像这样:dl.dropbox.com/u/74726/pipeline.png-注意拆分的一个“分支”仅是一个深度(代码覆盖),但另一个分支有两个工作(部署然后测试),当覆盖,部署和测试全部通过时,任何一个都不会启动“升级”工作!
杰伊·斯潘

2
当路径深度较深时,我使用了此解决方案。CRITICAL键是指纹文件。我将更新我的答案以反映这一点。
杰森·斯瓦格

1
谢谢。指纹确实是答案!
杰伊·斯潘

我面临的问题是分支机构只有一项工作。不知道如何使用指纹文件。在哪里可以找到更多具体信息?
aleung 2012年

我在安装连接插件后没有看到“后生成操作”下的“连接触发器”选项,而是通过手动上传.hpi文件来安装该插件的。
viveksinghggits

31

管道插件

您可以使用管道插件(以前称为workflow-plugin)。

它附带许多示例,您可以按照本教程进行操作

例如

// build
stage 'build'
...

// deploy
stage 'deploy'
...

// run tests in parallel
stage 'test'
parallel 'functional': {
  ...
}, 'performance': {
  ...
}

// promote artifacts
stage 'promote'
...

构建流程插件

您还可以使用Build Flow插件。简直太棒了-但已弃用(开发冻结)。

设置工作

创建以下工作:

  • 建立
  • 部署
  • 性能测试
  • 功能测试
  • 晋升

设置上游

  1. 在上游(在此处build)创建一个唯一的工件,例如:

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

  3. 记录指纹以跟踪文件使用情况;如果有任何作业复制了相同的build.tag文件并记录了指纹,则您将能够跟踪父级。
  4. 配置为在promotion工作成功时得到提升。

设置下游作业

  1. 我用2个参数PARENT_JOB_NAMEPARENT_BUILD_NUMBER
  2. build使用复制工件插件从上游作业复制工件

    • 项目名称= ${PARENT_JOB_NAME}
    • 哪个版本= ${PARENT_BUILD_NUMBER}
    • 要复制的工件= build.tag
  3. 记录指纹;这很关键。

设置下游推广工作

与上述步骤相同,建立上下游关系。它不需要任何构建步骤。您可以执行其他构建后操作,例如“嘿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)

祝好运。


我自己更喜欢这个答案-这是非常简单和灵活的恕我直言。
metaforge 2015年


9

多椎插件精美的作品为场景。如果您希望单个“父级”作业启动多个“子级”作业,但仍然能够自己手动执行每个子级,则它也很方便。这可以通过创建“阶段”来实现,将1到n个作业添加到其中。该构建仅在整个阶段完成后才继续进行,因此,如果一个阶段包含多个作业,则它们必须全部完成才能执行其余的作业。自然地,如果阶段中发生故障,则是否继续构建是可配置的。



2

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


嗨,瑜伽士,有没有办法将参数传递给合并作业?我正在使用参数触发触发器
Prasaanth Neelakandan

1
需要将其添加为插件的增强功能。目前,此插件无法执行此操作
Yogesh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.