如何在jenkins声明性管道groovy中并行运行外部Map并按顺序运行内部Map

368yc8dk  于 2022-11-01  发布在  Jenkins
关注(0)|答案(1)|浏览(209)

我有一个场景,我想以这样一种方式运行:外部Map应该并行运行,而其中一个外部Map的内部Map应该按顺序运行。我有类似于下面提到的东西,但在我看来,outer_map1和outer_map2将按顺序运行,而不是按并行代码摘录运行:

stage('test'){
   parallel outer_map1
   outer_map2.each{ key, value ->
      parallel value()
   }
}

这里,outer_map1包含作为字符串的key,value将是要执行的命令,并且该Map的所有项都应该并行运行,而outer_map2包含key作为字符串,value将是Map,而这个内部Map再次包含key作为字符串,value将是要执行的命令。map2将是应该并行运行的内部Map,而outer_map2的每个项应该按顺序运行。
因此,这里的主要挑战是确定outer_map1和outer_map2如何并行运行。
我可以为outer_map1和outer_map2设置2个不同的阶段,但如果我采用这种方法,则不知道如何并行运行这2个阶段。

w46czmvw

w46czmvw1#

您可以将outer_map2的执行部分作为一个项添加到outer_map1中。这样,outer_map2的整个执行将与outer_map1的所有其他执行并行进行。
类似于:

stage('test'){
    outer_map1['outer-map2-branch-name'] = {
        outer_map2.each { key, value ->
            parallel value
        }
    }
    parallel outer_map1
}

如果您使用的是声明性管道,并希望将其分为两个阶段以提高可读性,则可以混合使用声明性管道和脚本化管道:

pipeline {
    agent any
    stages {
        stage('Parallel Stage') {
            parallel {
                stage('outer map 1') {
                    steps {
                        script{
                            parallel outer_map1
                        }
                    }
                }
                stage('outer map 2') {
                    steps {
                        script {
                            outer_map2.each {
                                echo "executing ${it.key}"
                                parallel it.value
                            }
                        }
                    }
                }
            }
        }
    }
}

这两个选项都应该产生您想要的行为。

相关问题