Jenkins并行构建读取空映射,但它在前一阶段保存数据
试图使并行构建更具动态性的Total noobie 使用此声明性脚本 而不是在预先填充的映射中读取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] 但当我使用它来生成一个并行构建时,它似乎变成了空的,并且我收到了错误消息 没有要运行的分支 我知道我
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
的定义移动到管道中。