【问题标题】:How do I make a Jenkins job start after multiple simultaneous upstream jobs succeed?在多个同时上游作业成功后,如何让 Jenkins 作业开始?
【发布时间】:2012-02-19 04:53:09
【问题描述】:

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

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

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


编辑:

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

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

【问题讨论】:

  • 引用 Andrew 的回答......“Jenkins 最近宣布了对工作流的一流支持。” jenkins-ci.org/content/workflow-plugin-10
  • 如果您认为现在较新的答案更合适,您可以更改所选答案。

标签: jenkins build continuous-integration jenkins-pipeline jenkins-plugins


【解决方案1】:

管道插件

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

自带many examples,你可以关注这个tutorial

例如

// build
stage 'build'
...

// deploy
stage 'deploy'
...

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

// promote artifacts
stage 'promote'
...

构建流程插件

您也可以使用Build Flow Plugin。它简直太棒了 - 但它已被弃用(开发冻结)。

设置作业

为以下人员创建工作:

  • 构建
  • 部署
  • 性能测试
  • 功能测试
  • 促销

设置上游

  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)

祝你好运。

【讨论】:

  • 我自己更喜欢这个答案 - 恕我直言,它非常简单且更灵活。
【解决方案2】:

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

  1. 在您的“部署”作业中使用Join Plugin,并将“提升”指定为目标作业。您必须将“功能测试”和“性能测试”指定为加入的作业,并以某种方式启动它们,后期构建。 Parameterized Trigger Plugin 对此很有用。

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

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

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

【讨论】:

  • 我尝试了 Join 和 Promoted Builds 插件,但我认为它们存在我第一次输入问题时没有考虑到的限制。基本上,它们似乎只有在拆分的每个“分支”都恰好是一项深度工作时才起作用。插件都按我上图中的预期工作,但我们真正的管道看起来更像这样:dl.dropbox.com/u/74726/pipeline.png - 请注意拆分的一个“分支”只有一个深度(代码覆盖率),而另一个分支是两个工作深度(部署然后测试)当覆盖、部署和测试全部通过时,谁都不会启动“提升”工作!
  • 当路径深度为多个作业时,我使用了此解决方案。关键的关键是指纹文件。我会更新我的答案以反映这一点。
  • 谢谢。指纹确实是答案!
  • 我面临的问题是分支只有一个工作深度。不知道如何使用指纹文件。在哪里可以找到更具体的信息?
  • 我没有看到 Post Build Actions 下的 Join Trigger 选项,安装了 join 插件后,我通过手动上传 .hpi 文件安装了插件。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    Jenkins 最近announced 对工作流的一流支持。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 嗨,Yogi,有没有办法将参数传递给合并作业?我正在使用参数化触发器插件
        • 需要将其添加为插件的增强功能。目前这个插件不这样做
        【解决方案7】:

        这个菱形依赖构建管道可以配置为 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

        【讨论】:

          猜你喜欢
          • 2014-07-14
          • 2019-04-06
          • 1970-01-01
          • 1970-01-01
          • 2013-05-01
          • 1970-01-01
          • 2020-09-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多