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