61

请注意:问题基于旧的,现在称为“脚本化”管道格式。当使用“声明性管道”时,并行块可以嵌套在阶段块内(请参阅使用声明性管道 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

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

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

4

5 回答 5

64

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

JENKINS-26107开始,stage采用块参数。您可以放入parallelinsidestagestageinsideparallelstageinsidestage等。但是构建的可视化不保证支持所有嵌套;尤其是

  • 内置的流水线步骤(一个“树表”列出了构建运行的每个步骤)显示了任意stage嵌套。
  • Pipeline Stage View插件目前只会显示一个线性的阶段列表,按照它们开始的顺序,不管嵌套结构。
  • Blue Ocean将显示顶级关卡,以及parallel顶级关卡内的分支,但目前没有更多。

JENKINS-27394如果实施,将显示任意嵌套stage的 s。

于 2016-04-27T14:50:39.033 回答
23

现在不推荐使用该语法,您将收到此错误:

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 都应标记为用作池。

于 2017-04-06T15:20:44.103 回答
13

我刚刚测试了以下管道并且它有效

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”的示例

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

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

于 2017-03-30T15:04:49.723 回答
5

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

stage('Tests') {
    parallel(
        'Unit Tests': {
            container('node') {
                sh("npm test --cat=unit")
            }
        },
        'API Tests': {
            container('node') {
                sh("npm test --cat=acceptance")
            }
        }
    )
}
于 2018-03-19T16:42:16.957 回答
4

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

于 2017-10-16T15:55:59.780 回答