Groovy (错误)管道jenkins,在循环中调用sh+;序列化json
我不明白为什么会发生错误:Groovy (错误)管道jenkins,在循环中调用sh+;序列化json,groovy,jenkins-pipeline,jenkins-groovy,Groovy,Jenkins Pipeline,Jenkins Groovy,我不明白为什么会发生错误: stage('name') { steps { script { def jsonObj = new JsonSlurper().parseText( env.work_servers ) for(item in jsonObj){ cmd("my command --param1=${item.srv} --param2=${item.port}")
stage('name') {
steps {
script {
def jsonObj = new JsonSlurper().parseText( env.work_servers )
for(item in jsonObj){
cmd("my command --param1=${item.srv} --param2=${item.port}")
}
}
}
}
获取错误,错误堆栈
即使将cmd方法调用替换为sh,也不会有任何更改
如果在没有循环的情况下调用命令,一切都会正常工作
stage('name') {
steps {
script {
def srv = "..."
def port = "..."
cmd("my command --param1=${srv} --param2=${port}")
srv = "..."
port = "..."
cmd("my command --param1=${srv} --param2=${port}")
}
}
}
这同样有效
stage('name') {
steps {
script {
def jsonObj = new JsonSlurper().parseText( env.work_servers )
for(item in jsonObj){
echo item
}
}
}
}
您会看到这个问题,因为
new JsonSlurper().parseText(text)
返回类型为groovy.json.internal.LazyMap
的映射,该映射不可序列化。在stage中运行的任何代码都必须对可序列化对象进行操作。(使用@NonCPS
注释的提取方法可以应用异常)
这个问题的解决方案很简单-将JsonSlurper
替换为JsonSlurperClassic
,它从parseText(text)
方法返回HashMap
stage('name') {
steps {
script {
def jsonObj = new JsonSlurperClassic().parseText( env.work_servers )
for(item in jsonObj){
cmd("my command --param1=${item.srv} --param2=${item.port}")
}
}
}
}
或者,如果您需要继续使用JsonSlurper
,您可以将解析JSON并对JSON对象执行任何操作的部分提取到单独的方法中,并使用@NonCPS
对其进行注释。如果JSON是一个巨大的,并且使用<代码> LazyMap <代码>,你可以考虑这个备选方案。否则,切换到JsonSlurperClassic
是解决问题的最佳方法
stage('name') {
steps {
script {
def jsonObj = new JsonSlurperClassic().parseText( env.work_servers )
for(item in jsonObj){
cmd("my command --param1=${item.srv} --param2=${item.port}")
}
}
}
}