我假设您遇到类似的问题,就像我试图动态构建并行分支以并行执行一样。
有两点非常重要:
复制循环变量(在您的情况下为
it
),并仅在并行分支内使用该副本;如果您不这样做,那么所有分支(闭包)都将引用相同的变量,而该变量当然具有相同的值。这对于闭包而言尤其如此。另请参阅:http : //groovy-lang.org/closures.html。不要使用
collectEntries{}。坚持使用Java风格的循环,因为通常情况下,groovy循环无法正常工作。一些.each{}构造可能已经起作用,但是如果有疑问,请切换到Java循环。
以下精简示例对我有用。我相信您将能够根据需要进行调整。
def products = ["A", "B", "C", "D"]def parallelStagesMap = [:]// use java-style loopfor (def product: products) { // make a copy to ensure that each closure will get it's own variable def copyOfProduct = product parallelStagesMap[product] = {echo "install_Stage($copyOfProduct)"}}echo parallelStagesMap.toString()pipeline {agent any stages { stage('parallel stage') { steps { script { parallel parallelStagesMap } } } }}- 如果仍然不起作用:检查是否存在并升级您的
Pipeline: Groovy
插件,因为它们通常可以解决很多问题,这些问题通常在常规中有效,但不会在管道中解决。
您可能想检查以下相关问题,其中也包含一个最小的示例: 为并行执行使用groovy
CPS闭包



