Jenkins并行构建读取空映射,但它在前一阶段保存数据

Jenkins并行构建读取空映射,但它在前一阶段保存数据,jenkins,groovy,jenkins-pipeline,jenkins-groovy,Jenkins,Groovy,Jenkins Pipeline,Jenkins Groovy,试图使并行构建更具动态性的Total noobie 使用此声明性脚本 而不是在预先填充的映射中读取def jobs=[“JobA”、“JobB”、“JobC”],这非常有效 我试图从全局映射变量JOBS=[]中读取,我使用JOBS.add(“jobaa”)语法在一个阶段中填充该变量 在管道阶段打印出作业,表明其中包含内容 JOBS map is [JobAAA, JobBBB, JobCCC] 但当我使用它来生成一个并行构建时,它似乎变成了空的,并且我收到了错误消息 没有要运行的分支 我知道我

试图使并行构建更具动态性的Total noobie

使用此声明性脚本 而不是在预先填充的映射中读取
def jobs=[“JobA”、“JobB”、“JobC”]
,这非常有效

我试图从全局映射变量
JOBS=[]
中读取,我使用
JOBS.add(“jobaa”)
语法在一个阶段中填充该变量

在管道阶段打印出
作业
,表明其中包含内容

JOBS map is [JobAAA, JobBBB, JobCCC]
但当我使用它来生成一个并行构建时,它似乎变成了空的,并且我收到了错误消息

没有要运行的分支

我知道我一定在什么地方把我的理解弄混了,但谁能给我指出正确的方向呢

这是我正在使用的代码

def jobs = ["JobA", "JobB", "JobC"]
JOBS_MAP = []

def parallelStagesMap = jobs.collectEntries() {
   ["${it}" : generateStage(it)]
}

def parallelStagesMapJOBS = JOBS_MAP.collectEntries(){
   ["${it}" : generateStage(it)]
}

def generateStage(job) {
   return {
       stage("Build: ${job}") {
           echo "This is ${job}."
       }
   }
}

pipeline {
   agent any

   stages {
       stage('populate JOBS map') {
           steps {
               script {
                   JOBS_MAP.add("JobAAA")
                   JOBS_MAP.add("JobBBB")
                   JOBS_MAP.add("JobCCC")
               }
           }
       }
       stage('print out JOBS map'){
           steps {
               echo "JOBS_MAP map is ${JOBS_MAP}"
           }
       }
       stage('parallel job stage') {
           steps {
               script {
                   parallel parallelStagesMap
               }
           }
       }
       stage('parallel JOBS stage') {
           steps {
               script {
                   parallel parallelStagesMapJOBS
               }
           }
       }
   }
}
试试这个:

def jobs = ["JobA", "JobB", "JobC"]
JOBS_MAP = []

def generateStage(job) {
   return {
       stage("Build: ${job}") {
           echo "This is ${job}."
       }
   }
}

pipeline {
   agent any

   stages {
       stage('populate JOBS map') {
           steps {
               script {
                   JOBS_MAP.add("JobAAA")
                   JOBS_MAP.add("JobBBB")
                   JOBS_MAP.add("JobCCC")
               }
           }
       }
       stage('print out JOBS map'){
           steps {
               echo "JOBS_MAP map is ${JOBS_MAP}"
           }
       }
       stage('parallel job stage') {
           steps {
               script {
                   def parallelStagesMap = jobs.collectEntries() {
                       ["${it}" : generateStage(it)]
                   }
                   parallel parallelStagesMap
               }
           }
       }
       stage('parallel JOBS stage') {
           steps {
               script {
                   def parallelStagesMapJOBS = JOBS_MAP.collectEntries(){
                      ["${it}" : generateStage(it)]
                   }

                   parallel parallelStagesMapJOBS
               }
           }
       }
   }
}


在管道运行之前,创建一个空的
JOBS\u映射
,然后迭代它以创建
parallelStagesMapJOBS
(结果为空)。您稍后填充
JOBS\u MAP
的事实不会影响仍然为空的
parallelStagesMapJOBS
。感谢@MaratC对自顶向下阅读代码的回复。但我被认为在vary顶部声明一个变量而不使用
def
将使其成为
global
,因此可以在整个管道脚本中随时随地访问。如果这是正确的,我将在调用
parallelStagesMapJOBS
方法之前填充“global”变量。如果做不到这一点,我必须完全错误地理解脚本流。
JOBS\u MAP
parallelStagesMapJOBS
都是全局的,并且在管道运行之前它们都被定义为空的。在填充
JOBS\u MAP
之后的任何阶段,您可能希望将
parallelStagesMapJOBS
的定义移动到管道中。