【问题标题】:Running stages in parallel with Jenkins workflow / pipeline与 Jenkins 工作流/管道并行运行阶段
【发布时间】:2016-08-20 17:42:39
【问题描述】:

请注意:问题基于旧的,现在称为“脚本化”管道格式。使用“声明式管道”时,并行块可以嵌套在阶段块内(参见Parallel stages with Declarative Pipeline 1.2)。

我想知道并行步骤应该如何与 Jenkins 工作流/管道插件一起工作,尤其是。如何将它们与构建阶段混合。我知道一般模式:

parallel(firstTask: {
  // Do some stuff
}, secondTask: {
  // Do some other stuff in parallel
})

但是,我想并行运行几个阶段(在同一个节点上,有多个执行程序),所以我尝试添加这样的阶段:

stage 'A'
// Do some preparation stuff

parallel(firstTask: {
  stage 'B1'
  // Do some stuff
}, secondTask: {
  stage 'B2'
  // Do some other stuff in parallel
})

stage 'C'
// Finalizing stuff

这没有按预期工作。 “做事”任务是并行执行的,但并行阶段会立即结束,并且不包含它们应该包含的内容。因此,Stage View 不会显示正确的结果,也不会链接日志。

我可以并行构建不同的阶段,还是“并行”步骤仅用于单个阶段?

【问题讨论】:

  • 什么exaclty不起作用?几分钟前我在 Jenkins 中尝试了你的 sn-p,它似乎工作得很好。
  • 正如我所说,工作步骤并没有真正作为阶段的一部分完成,即阶段视图不显示它们花费的时间,也没有日志。如果您不平行地执行相同的步骤,您会看到差异。
  • 我明白了——所以这个问题只能在舞台视图中看到,对吧?
  • 查看我对*.com/questions/46834998/…的回复

标签: jenkins jenkins-pipeline


【解决方案1】:

您不得将已弃用的非块范围 stage(如在原始问题中)放在 parallel 中。

截至JENKINS-26107stage 采用块参数。您可以将parallel 放入stagestage 放入parallelstage 放入stage 等。但是构建的可视化并不能保证支持所有嵌套;特别是

  • 内置的管道步骤(一个“树表”列出了构建运行的每个步骤)显示任意stage 嵌套。
  • Pipeline Stage View plugin 目前只会按阶段开始的顺序显示线性阶段列表,而不管嵌套结构如何。
  • Blue Ocean 将显示*阶段,以及*阶段内的 parallel 分支,但目前没有更多。

JENKINS-27394,如果实现了,会显示任意嵌套的stages。

【讨论】:

  • 我刚刚读到here,从 v 2.1 开始,并行内的阶段步骤不可用,因为它从未受到支持。你能告诉我目前的状态是什么吗?
  • 在 v2.2 的 pipeline-stage-step 插件阶段采取块。虽然它仍然可以检查它是否在并行内部,但我没有看到它抛出异常。通常我也使用块parallel([thingA: { stage('A') { echo('A') } }])。请注意,它在标准 UI 和蓝海中都会显得很奇怪。见JENKINS-38442
  • @ZombieDev,v2.2 使用声明性管道为我抛出异常。这种用法不通过声明性linter。
【解决方案2】:

该语法现已弃用,您将收到此错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 14: Expected a stage @ line 14, column 9.
       parallel firstTask: {
       ^

WorkflowScript: 14: Stage does not have a name @ line 14, column 9.
       parallel secondTask: {
       ^

2 errors

你应该这样做:

stage("Parallel") {
    steps {
        parallel (
            "firstTask" : {
                //do some stuff
            },
            "secondTask" : {
                // Do some other stuff in parallel
            }
        )
    }
}

只是在这里添加节点的使用,在多个构建服务器/虚拟机之间分配作业:

pipeline {
  stages {
    stage("Work 1"){
     steps{
      parallel ( "Build common Library":   
            {
              node('<Label>'){
                  /// your stuff
                  }
            },

        "Build Utilities" : {
            node('<Label>'){
               /// your stuff
              }
           }
         )
    }
}

应将所有 VM 标记为用作池。

【讨论】:

    【解决方案3】:

    我刚刚测试了以下管道并且它可以工作

    parallel firstBranch: {
        stage ('Starting Test') 
        {
            build job: 'test1', parameters: [string(name: 'Environment', value: "$env.Environment")]
        }
    }, secondBranch: {
        stage ('Starting Test2') 
        {
            build job: 'test2', parameters: [string(name: 'Environment', value: "$env.Environment")]
        }
    }
    

    这个名为“触发器测试”的作业接受一个名为“环境”的参数

    作业“test1”和“test2”是简单的作业:

    “test1”的示例

    • 一个名为“环境”的参数
    • 管道:echo "$env.Environment-TEST1"

    在执行时,我可以看到两个阶段同时运行

    【讨论】:

    • Jenkins 的哪个版本?
    • 根据@joao-cenoura - 我真的希望它能够工作,但它在 2.58 中不起作用,我在 2.61 或当前插件的发行说明中看不到任何内容他们会让它发挥作用。您使用的是什么版本的 Jenkins 和管道插件?
    • 我的是“Jenkins ver. 2.46.2”
    • 这适用于我的版本 2.65。您也可以在并行块定义中拥有多个阶段。
    【解决方案4】:

    正如@Quartz 提到的,你可以做类似的事情

    stage('Tests') {
        parallel(
            'Unit Tests': {
                container('node') {
                    sh("npm test --cat=unit")
                }
            },
            'API Tests': {
                container('node') {
                    sh("npm test --cat=acceptance")
                }
            }
        )
    }
    

    【讨论】:

      【解决方案5】:

      我认为现在已经正式实施了: https://jenkins.io/blog/2017/09/25/declarative-1/

      【讨论】: