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

时间:2016-04-26 18:11:56

标签: jenkins jenkins-pipeline

  

请注意:这个问题是基于旧的,现在称为"脚本"管道格式。当使用"声明性管道"时,并行块可以嵌套在阶段块内(参见Parallel stages with Declarative Pipeline 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

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

我可以并行构建不同的阶段,或者是" parallel"步骤只是意味着在一个阶段使用?

5 个答案:

答案 0 :(得分:47)

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

JENKINS-26107开始,stage采用块参数。您可以将parallel置于stagestage内置于parallelstage置于stage内等。但无法保证构建的可视化支持所有筑巢;特别是

  • 内置管道步骤(列出构建运行的每个步骤的“树表”)显示任意stage嵌套。
  • Pipeline Stage View plugin目前只会按照它们开始的顺序显示一个线性的阶段列表,而不管嵌套结构如何。
  • Blue Ocean会在顶级阶段显示顶级阶段和parallel分支,但目前不再有。{/ li>

JENKINS-27394,如果已实施,则会显示任意嵌套的stage

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:7)

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

self.tableView.tableHeaderView = headerView;

这个职位名为&quot;触发 - 测试&#39;接受一个名为&#39; Environment&#39;

的参数

Job&#39; test1&#39;和&#39; test2&#39;是简单的工作:

&#39; test1&#39;

的示例
  • 一个名为&#39; Environment&#39;
  • 的参数
  • 管道:echo&#34; $ env.Environment-TEST1&#34;

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

答案 3 :(得分:2)

我认为现在已经正式实施: Simple Guide to the SWIFT MT101 Format

答案 4 :(得分:1)

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

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