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

ami*_*ami 43 jenkins jenkins-pipeline

请注意:问题基于旧的,现在称为"脚本"管道格式.使用"声明性管道"时,并行块可以嵌套在阶段块内(请参阅带有声明性管道1.2的并行阶段).

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

parallel(firstTask: {
  // Do some stuff
}, secondTask: {
  // Do some other stuff in parallel
})
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这不能按预期工作."do stuff"任务是并行执行的,但并行阶段会立即结束,并且不会包含它们应包含的内容.因此,舞台视图不会显示正确的结果,也不会链接日志.

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

Jes*_*ick 51

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

JENKINS-26107开始,stage采用块参数.您可以放置parallel在内部stage,stage内部parallelstage内部stage等.但是不能保证构建的可视化支持所有嵌套; 特别是

  • 内置管道步骤(列出构建运行的每个步骤的"树表")显示任意stage嵌套.
  • 流水线阶段查看插件目前只显示阶段的线性表,在他们开始,无论嵌套结构的顺序.
  • Blue Ocean将展示顶级舞台,以及parallel顶级舞台内的分支,但目前不再有.

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

  • 我只是在[here](https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+Step+Plugin)上读过,从v 2.1开始,并行中的阶段步骤已不可用,因为它不是'从来没有支持。您能告诉我这是什么现状吗? (2认同)

PRF*_*PRF 15

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

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
Run Code Online (Sandbox Code Playgroud)

你应该做的事情如下:

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

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

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

        "Build Utilities" : {
            node('<Label>'){
               /// your stuff
              }
           }
         )
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Oli*_*ien 8

我刚刚测试了以下管道,它的工作原理

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")]
    }
}
Run Code Online (Sandbox Code Playgroud)

这个名为'trigger-test'的Job接受一个名为'Environment'的参数

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

'test1'的示例

  • 一个名为'Environment'的参数
  • 管道:echo"$ env.Environment-TEST1"

在执行时,我能够看到两个阶段同时运行

  • 哪个版本的詹金斯? (2认同)

Qua*_*rtz 5

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


Ano*_*lip 5

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

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