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

时间:2012-01-26 00:07:09

标签: plugins build continuous-integration jenkins pipeline

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

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

这是我正在谈论的内容的可视化。有谁知道一个插件是否存在我做的事情? Build Pipeline


编辑:

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

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

7 个答案:

答案 0 :(得分:30)

管道插件

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

它附带many examples,您可以按照此tutorial

e.g。

// build
stage 'build'
...

// deploy
stage 'deploy'
...

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

// promote artifacts
stage 'promote'
...

构建流程插件

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

设置作业

为:创建工作:

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

设置上游

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

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

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

    1. 我使用了2个参数PARENT_JOB_NAMEPARENT_BUILD_NUMBER
    2. 使用Copy Artifact Plugin

      从上游build作业复制工件
      • 项目名称= ${PARENT_JOB_NAME}
      • 哪个版本= ${PARENT_BUILD_NUMBER}
      • 要复制的工件= build.tag
    3. 记录指纹;这是至关重要的。

    4. 设置下游促销工作

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

答案 1 :(得分:27)

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

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

  2. 在“部署”作业中使用Promoted Builds Plugin,指定在下游作业完成时有效的促销,并指定功能和性能测试作业。作为促销活动的一部分,触发“推广”工作。您仍然需要从“deploy”

  3. 启动两个测试作业

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

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

答案 2 :(得分:11)

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

答案 3 :(得分:8)

Multijob plugin可以很好地适应这种情况。如果您希望单个“父”作业启动多个“子”作业但仍能够自己手动执行每个子项,它也会派上用场。这可以通过创建“阶段”来实现,您可以向其中添加1到n个作业。构建仅在整个阶段完成后才会继续,因此如果一个阶段作为多个作业,则必须在执行其余任务之前完成。当然,如果阶段内出现故障,构建是否会继续进行配置。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

Screenshot of the DepBuilder plugin UI

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

Build pipeline visualization

如果任何上游作业没有成功,构建将自动中止。可以针对每个作业调整中止行为,有关详细信息,请参阅 DepBuilder documentation

Screenshot of the failed build