2016-04-26 66 views
29

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).与詹金斯工作流程/流水线并行运行的阶段

我想知道如何并行步骤应该与詹金斯工作流程/管道插件,特别是如何工作。如何将它们与构建阶段混合使用。我知道的一般模式:

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不会显示正确的结果,也不会链接日志。

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

+0

什么exaclty不起作用?我在几分钟前在Jenkins试过了你的代码片段,它似乎工作得很好。 –

+0

正如我所说的,工作步骤并非真正作为阶段的一部分,即阶段视图不显示花费的时间,也没有日志。如果你不平行地做同样的步骤,你会看到不同之处。 – ami

+0

我明白了 - 所以这个问题只能在舞台视图中看到,对吧? –

回答

37

您可能不会在parallel中放置不推荐使用的非块范围的stage(如原始问题中)。

JENKINS-26107开始,stage取块参数。您可以将parallel放入stagestage的内部,parallelstage的内部,stage的内部等等。但是构建的可视化不能保证支持所有的嵌套;特别

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

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

+1

我刚刚阅读[这里](https://wiki.jenkins-ci.org/display/JENKINS/Pipeline + Stage + Step + Plugin),从2.1版开始,并行中的阶段步骤是不可用的,因为它没有被支持。你能告诉我这是什么现状吗? – dhiller

+0

在流水线阶段插件阶段的版本2.2中,需要块。虽然它仍然有检查它是否在平行内部,但我没有看到它抛出异常。通常我会使用一个块,并行([thingA:{stage('A'){echo('A')}}])''。请注意,它在标准用户界面和蓝色海洋中看起来都很奇怪。参见[JENKINS-38442](https://issues.jenkins-ci.org/browse/JENKINS-27394) – ZombieDev

+0

@ZombieDev,v2.2使用声明式管道为我引发异常。这种用法不会传递声明式linter。 – Yichun

3

我刚才测试了以下的管道和它的作品

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

这个工作命名为“触发测试”接受一个名为“环境”

工作“测试1”和“测试2”是简单的一个参数工作:

示例 'test1的'

  • 一个参数名为 '环境'
  • 流水线:echo“$ env。环境TEST1"

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

+1

Jenkins的哪个版本? –

+0

根据@ joao-cenoura - 我真的想要这个工作,但它在2.58中不起作用,我没有在2.61的发行说明中看到任何东西,或者当前的插件听起来像会使它工作。你使用的是什么版本的Jenkins和管道插件? – Typhlosaurus

+0

Mine是“Jenkins版本2.46.2” – OlivierTerrien

6

这种语法现在已经过时了,你会得到这样的错误:

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 
      } 
     ) 
    } 
} 
相关问题