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

为了获得尽可能快的反馈,我们偶尔希望 Jenkins 作业并行运行。当一项工作完成后,詹金斯有能力开始多项下游工作(或“分叉”管道)。然而,詹金斯似乎没有任何办法使下游工作只有开始的所有分支的叉成功(或’加入’的叉回到一起)。

詹金斯有一个“在其他项目建成后建造”按钮,但我解释为“启动这项工作时,任何上游工作完成”(而不是“启动这项工作时,所有上游工作成功”)。

这是我所说的可视化图像。有人知道是否有一个插件可以做我想要做的事情吗? Build Pipeline


编辑:

当我在2012年最初发布这个问题时,Jason 的回答(加入和推广构建插件)是最好的,而且我采用的解决方案也是最好的。

然而,dnozay 的回答(构建流程插件)在这个问题之后的一年左右变得流行起来,这是一个更好的答案。不管怎样,如果今天有人问我这个问题,我现在建议改为。

65727 次浏览

对于这种情况,我过去使用过两种解决方案:

  1. 在您的“部署”作业上使用 加入插件,并将“促进”指定为目标作业。您必须指定“功能测试”和“性能测试”作为连接的作业,并在构建后以某种方式启动它们。参数化触发器插件很适合这个。

  2. 在您的“部署”作业上使用 推广的构建插件,指定在下游作业完成时起作用的提升,并指定功能和性能测试作业。作为促销活动的一部分,触发“促销”工作。您仍然必须从“部署”开始两个测试作业

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

  1. “构建”作业必须创建一个新的指纹文件。换句话说,它必须采集一些文件的指纹而 Jenkins 认为这些文件来自最初的作业。再次检查作业的“查看指纹”链接来验证这一点。
  2. 所有下游链接作业(在本例中为“部署”、“功能测试”和“性能测试”)都需要获取并指纹化这个文件。拷贝工件插件非常适合这类事情。
  3. 请记住,一些插件允许您改变指纹的顺序和下游作业启动; 在这种情况下,指纹必须发生在下游作业指纹相同的文件,以确保正确设置指纹的起源。

多任务插件在这种情况下工作得非常出色。如果您希望单个“父”作业启动多个“子”作业,但仍然能够手动执行每个子作业,那么它也很方便。这是通过创建“阶段”来实现的,在“阶段”中添加1到 n 个作业。构建只有在整个阶段完成时才会继续,因此如果一个阶段是多个作业,那么它们都必须在其余作业执行之前完成。当然,如果阶段中出现故障,是否继续构建是可配置的。

管道插件

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

它带有 很多例子,你可以跟随这个 教程

例如:。

// build
stage 'build'
...


// deploy
stage 'deploy'
...


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


// promote artifacts
stage 'promote'
...

构建流程插件

你也可以使用 构建流程插件。它简直棒极了——但是它已经过时了(开发被冻结)。

安排工作

创造就业机会:

  • 建造
  • 部署
  • 性能测试
  • 功能测试
  • 升职

准备上游

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

    echo ${BUILD_TAG} > build.tag
    
  2. archive the build.tag artifact.

  3. record fingerprints to track file usage; if any job copies the same build.tag file and records fingerprints, you will be able to track the parent.
  4. Configure to get promoted when promotion job is successful.

Setting up the downstream jobs

  1. I use 2 parameters PARENT_JOB_NAME and PARENT_BUILD_NUMBER
  2. Copy the artifacts from upstream build job using the Copy Artifact Plugin

    • Project name = ${PARENT_JOB_NAME}
    • Which build = ${PARENT_BUILD_NUMBER}
    • Artifacts to copy = build.tag
  3. Record fingerprints; that's crucial.

Setting up the downstream promotion job

Do the same as the above, to establish upstream-downstream relationship. It does not need any build step. You can perform additional post-build actions like "hey QA, it's your turn".

Create a build flow job

// 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 最近提供了 宣布对工作流的一流支持。

我相信工作流插件现在被称为 管道插件,是(当前)首选的解决方案的原始问题,灵感来自构建流插件。GitHub 中还有一个 入门教程

Jason & dnozay 的答案已经足够好了,但是如果有人想找一个简单的方法,那就使用 JobFanin 插件

可以配置此菱形依赖性生成管道 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

Screenshot of the DepBuilder plugin UI

在构建项目之后,构建可视化将显示在项目仪表板页面上:

Build pipeline visualization

如果任何上游作业没有成功,构建将自动中止。中止行为可以在每个工作的基础上进行调整,更多信息见 DepBuilder 文档

Screenshot of the failed build