首页 文章

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

提问于
浏览
34

请注意:问题基于旧的,现在称为“脚本”的管道格式 . 使用“声明性管道”时,并行块可以嵌套在阶段块内(请参阅带有声明性管道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”任务是并行执行的,但并行阶段会立即结束,并且不包含它们应包含的内容 . 因此,舞台视图不会显示正确的结果,也不会链接日志 .

我可以并行构建不同的阶段,还是仅仅意味着在单个阶段中使用的“并行”步骤?

5 回答

  • 11

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

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

    • 内置管道步骤(列出构建运行的每个步骤的“树表”)显示任意 stage 嵌套 .

    • Pipeline Stage View plugin目前仅按照它们开始的顺序显示阶段的线性列表,而不管嵌套结构如何 .

    • Blue Ocean将显示顶级阶段,以及顶级阶段内的 parallel 分支,但目前不再有 .

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

  • 41

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

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

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

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

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

  • 0

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

    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'的Job接受一个名为'Environment'的参数

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

    'test1'的示例

    • 一个名为'Environment'的参数

    • 管道:echo "$env.Environment-TEST1"

    On execution, I am able to see both stages running in the same time

  • 1

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

  • 6

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

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

相关问题