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

Jay*_*ang 70 plugins continuous-integration pipeline build jenkins

为了尽可能快地获得反馈,我们偶尔会希望Jenkins的作业能够并行运行.Jenkins能够在作业完成时启动多个下游作业(或"分叉"管道).但是,Jenkins似乎没有任何方法可以使下游作业只启动该fork的所有分支成功(或者将fork连接在一起).

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

这是我正在谈论的内容的可视化.有谁知道一个插件是否存在我做的事情? 构建管道


编辑:

当我最初在2012年发布这个问题时,Jason的答案(Join和Promoted Build插件)是最好的,而且我选择了解决方案.

然而,dnozay的回答(The Build Flow插件)在这个问题之后大约一年左右流行,这是一个更好的答案.对于它的价值,如果人们今天问我这个问题,我现在建议改为.

dno*_*zay 31

管道插件

您可以使用Pipeline Plugin(以前workflow-plugin).

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

例如

// build
stage 'build'
...

// deploy
stage 'deploy'
...

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

// promote artifacts
stage 'promote'
...
Run Code Online (Sandbox Code Playgroud)

构建流程插件

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

设置工作

创建工作:

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

设置上游

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

    echo ${BUILD_TAG} > build.tag
    
    Run Code Online (Sandbox Code Playgroud)
  2. 存档build.tag工件.

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

设置下游作业

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

    • 项目名称= ${PARENT_JOB_NAME}
    • 哪个build = ${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)
Run Code Online (Sandbox Code Playgroud)

祝好运.


Jas*_*ger 27

我过去使用过两种解决方案:

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

  2. 在"部署"作业上使用" 推荐的构建"插件,指定在下游作业完成时有效的促销,并指定"功能"和"性能"测试作业.作为促销活动的一部分,触发"推广"工作.您仍然必须从"部署"启动两个测试作业

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

  1. "构建"作业必须创建一个新的指纹文件.换句话说,它必须指出Jenkins认为是由初始作业发起的一些文件.仔细检查作业的"查看指纹"链接以验证这一点.
  2. 所有下游链接作业(在本例中为"部署","功能测试"和"性能测试")都需要获取并指纹同一文件.Copy Artifacts插件非常适合这类事情.
  3. 请记住,某些插件允许您更改指纹识别和下游作业启动的顺序; 在这种情况下,指纹必须在下游作业指纹同一文件之前发生,以确保正确设置指纹的ORIGIN.

  • 我尝试了Join和Promoted Builds插件,但我认为他们遇到了我在第一次输入问题时没有考虑的限制.基本上,当分裂的每个"分支"恰好是一个工作深度时,它们似乎只能起作用.这些插件在我上面的图片中都按预期工作,但我们真正的管道看起来更像是这样:http://dl.dropbox.com/u/74726/pipeline.png - 注意分割的一个"分支"是如何只有一个深度(代码覆盖率),但另一个分支是两个深度的工作(部署然后测试)当覆盖,部署和测试都通过时,任何一个都不会启动"提升"工作! (3认同)
  • 詹金斯指纹:https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint (3认同)
  • 当路径是多个工作深度时,我已经使用过这个解决方案.CRITICAL键是指纹文件.我会更新我的答案以反映这一点. (2认同)

And*_*ray 11

Jenkins最近宣布了对工作流程的一流支持.


tbr*_*adt 8

多椎插件精美的作品为场景.如果您希望单个"父"作业启动多个"子"作业但仍能够自己手动执行每个子项,它也会派上用场.这可以通过创建"阶段"来实现,您可以向其中添加1到n个作业.构建仅在整个阶段完成后才会继续,因此如果一个阶段作为多个作业,则必须在执行其余任务之前完成.当然,如果阶段内存在故障,则可以配置构建是否继续.