运行 个阶段与 Jenkins 工作流/管道并行

Running stages in parallel with Jenkins workflow / pipeline

Please note: the question is based on the old, now called "scripted" pipeline format. When using "declarative pipelines", parallel blocks can be nested inside of stage blocks (see Parallel stages with Declarative Pipeline 1.2).

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

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 没有显示正确的结果,也没有 link 日志。

我可以并行构建不同的阶段,还是 "parallel" 这一步只能在一个阶段中使用?

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

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

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

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

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

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")]
    }
}

这个名为 'trigger-test' 的作业接受一个名为 'Environment'

的参数

工作 'test1' 和 'test2' 是简单的工作:

'test1'

的示例
  • 一个参数名为'Environment'
  • 管道:回显“$env.Environment-TEST1”

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

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

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

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

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

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