72

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

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

这是我正在谈论的内容的可视化。有谁知道是否存在插件来做我所追求的? 构建管道


编辑:

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

但是,dnozay 的答案(构建流程插件)在这个问题之后一年左右变得流行,这是一个更好的答案。对于它的价值,如果人们今天问我这个问题,我现在建议改为。

4

7 回答 7

31

管道插件

您可以使用Pipeline Plugin(以前的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. 归档build.tag工件。

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

设置下游作业

  1. 我使用 2 个参数PARENT_JOB_NAMEPARENT_BUILD_NUMBER
  2. 使用Copy Artifact Plugin从上游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)

祝你好运。

于 2013-09-19T18:30:16.550 回答
27

我过去曾在这种情况下使用过两种解决方案:

  1. 在您的“部署”作业上使用加入插件,并将“提升”指定为目标作业。您必须将“功能测试”和“性能测试”指定为加入的作业,并以某种方式启动它们,后期构建。参数化触发器插件对此很有用。

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

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

  1. “构建”作业必须创建一个新的指纹文件。换句话说,它必须对 Jenkins 认为源自初始工作的文件进行指纹识别。仔细检查作业的“查看指纹”链接以验证这一点。
  2. 所有下游链接的作业(在本例中为“部署”、“功能测试”和“性能测试”)都需要获取同一个文件并对其进行指纹识别。Copy Artifacts 插件非常适合这类事情。
  3. 请记住,某些插件允许您更改指纹识别和下游作业开始的顺序;在这种情况下,必须在下游作业对同一文件进行指纹识别之前进行指纹识别,以确保正确设置指纹的 ORIGIN。
于 2012-01-26T02:15:43.613 回答
10

Multijob插件非常适合这种情况。如果您想要一个“父”作业来启动多个“子”作业,但仍然能够自己手动执行每个子作业,它也会派上用场。这通过创建“阶段”来工作,您可以在其中添加 1 到 n 个作业。构建仅在整个阶段完成后才会继续,因此如果一个阶段作为多个作业,它们都必须在其余部分执行之前完成。当然,如果阶段内出现故障,构建是否继续是可配置的。

于 2013-06-11T15:42:57.270 回答
10

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

于 2015-01-01T06:49:07.430 回答
2

我相信 Workflow Plugin 现在被称为Pipeline Plugin并且是受 Build Flow Plugin 启发的原始问题的(当前)首选解决方案。GitHub中还有一个入门教程

于 2016-02-14T19:39:15.113 回答
2

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

于 2016-03-14T06:51:26.077 回答
1

这个菱形依赖构建管道可以使用DepBuilder 插件进行配置。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 插件 UI 的屏幕截图

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

构建管道可视化

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

构建失败的屏幕截图

于 2021-02-25T11:53:52.037 回答