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

与Jenkins工作流/管道并行运行阶段,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,请注意:该问题基于旧的,现在称为“脚本化”管道格式。使用“声明性管道”时,并行块可以嵌套在阶段块内部(请参阅) 我想知道Jenkins工作流/管道插件应该如何使用并行步骤,尤其是如何将它们与构建阶段混合。我知道一般的模式: parallel(firstTask: { // Do some stuff }, secondTask: { // Do some other stuff in parallel }) 但是,我希望并行运行两个阶段(在同一个节点上,有多个执行器),因此我尝试添加如

请注意:该问题基于旧的,现在称为“脚本化”管道格式。使用“声明性管道”时,并行块可以嵌套在阶段块内部(请参阅)

我想知道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
接受一个块参数。您可以将
parallel
放入
stage
内部或
stage
内部
parallel
stage
内部
stage
等。但是,构建的可视化并不保证支持所有嵌套;特别是

  • 内置管道步骤(列出构建运行的每个步骤的“树表”)显示任意
    stage
    嵌套
  • 当前,无论嵌套结构如何,都将按照阶段开始的顺序显示阶段的线性列表
  • 将显示顶级阶段,以及顶级阶段内的
    并行
    分支,但当前不再显示

,如果实现,将显示任意嵌套的
stage
s.

我刚刚测试了以下管道,它可以正常工作

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

  • 一个名为“Environment”的参数
  • 管道:echo“$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
            }
        )
    }
}
仅在此处添加node的用法,以便在多个构建服务器/vm之间分发作业:

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

        "Build Utilities" : {
            node('<Label>'){
               /// your stuff
              }
           }
         )
    }
}
管道{
舞台{
阶段(“工作1”){
台阶{
并行(“构建公共库”:
{
节点(“”){
///你的东西
}
},
“构建实用程序”:{
节点(“”){
///你的东西
}
}
)
}
}

所有虚拟机都应标记为用作池。

我认为这已经正式实施:

正如@Quartz提到的,您可以执行以下操作

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

什么示例不起作用?几分钟前我在Jenkins中尝试了你的代码片段,它似乎很好。正如我所说,工作步骤并不是真正作为阶段的一部分完成的,即阶段视图不显示它们所花费的时间,也没有日志。如果你不并行地执行相同的步骤,你会看到不同之处。我明白了-因此问题只能是b在stage视图中看到了,对吗?我想情况已经改变了:看到我对的答案了吗?我刚刚读到,从v2.1开始,并行机中的stage步骤是不可用的,因为它从来都不受支持。你能告诉我这是什么状态吗?在v2.2的pipeline中,stage步骤插件stage采取了块。尽管它仍然有检查是否它在并行内部,我没有看到它抛出异常。通常我也使用块
parallel([thingA:{stage('a'){echo('a')}]))
。请注意,它在标准用户界面和蓝海中看起来都很奇怪。请参阅@ZombieDev,v2.2使用声明性管道为我抛出异常。这种用法没有通过declarative-linter。Jenkins的哪个版本?根据@joao-cenoura-我真的希望它能工作,但它在2.58中不起作用,我在发布说明中也没有看到它的任何内容2.61或当前的插件,听起来他们会让它工作。你使用的是什么版本的Jenkins和管道插件?我的是“Jenkins ver.2.46.2”。这对我来说适用于版本2.65。你也可以在并行块定义中有多个阶段。在Jenkins ver.2.193工作