0

我正在尝试在詹金斯管道中创建并行阶段,例如这个例子

node {
 stage('CI') {
   script {
doDynamicParallelSteps()
   }

 }
}

def doDynamicParallelSteps(){
 tests = [:]
 for (f in ["Branch_1", "Branch_2", "Branch_3"]) {
   tests["${f}"] = {
     node {
       stage("${f}") {
         echo "${f}"
       }
     }
   }
 }
 parallel tests
}

我期待看到“Branch_1”、“Branch_2”、“Branch_3”,而不是“Branch_3”、“Branch_3”、“Branch_3”

在此处输入图像描述

我不明白为什么。你能帮忙吗?

4

2 回答 2

1

这与闭包和迭代有关,但最终这可能会解决它:

 for (f in ["Branch_1", "Branch_2", "Branch_3"]) {
   def definitive_name = f
   tests[definitive_name] = {
于 2020-05-20T11:47:20.677 回答
0

简短回答:在经典视图中,舞台名称显示变量的最后一个值${f}。此外,所有回声都回显相同的值。您需要更改循环。

长答案:詹金斯不允许有多个具有相同名称的阶段,所以这永远不会成功:)

在您的示例中,您可以在 Blue Ocean 上看到它:

蓝海复刻

此外,在控制台输出上,名称也是正确的。在 Jenkins 经典视图中,舞台名称具有变量的最后一个值${f}。最后一个值被打印在舞台名称的经典视图上,所有的echo都是一样的。

解决方案:改变你的循环。这对我来说很好。

node {
 stage('CI') {
   script {
    doDynamicParallelSteps()
   }
 }
}

def void doDynamicParallelSteps(){
    def branches = [:] 
    for (int i = 0; i < 3 ; i++) {
        int index=i, branch = i+1
        branches["branch_${branch}"] = { 
            stage ("Branch_${branch}"){ 
                node {
                    sh "echo branch_${branch}"
                }
            }
        }
    }
    parallel branches
}

在此处输入图像描述

于 2020-05-19T22:57:34.240 回答