我需要在Jenkins管道中解析一些JSON并在循环中调用一些常规方法,但是在第一次函数调用之后脚本总是退出。怎么做?
import groovy.json.JsonSlurper
import com.cloudbees.groovy.cps.NonCPS
@NonCPS
def myMethod(String json) {
def jsonSlurper = new JsonSlurper()
def jsonObject = jsonSlurper(json)
jsonObject.each {
obj ->
switch(obj.name) {
case "foo":
doAThing(obj)
break
case "bar":
doAnotherThing(obj)
break
}
}
}
在上面的例子中,即使是像json这样的对象:
[{
"name": "foo"
}, {
"name": "bar"
}]
......管道总是在第一次迭代后退出。这可能是由于混合同步和异步功能。有没有办法做到这一点?
答案 0 :(得分:9)
我主要通过执行以下操作来解决此问题:
import groovy.json.JsonSlurper
def myMethod(String json) {
def jsonSlurper = new JsonSlurper()
def jsonObject = jsonSlurper(json)
jsonSlurper = null
for(int i = 0; i < jsonObject.size(); i++) {
switch(jsonObject[i].name) {
case "foo":
doAThing(jsonObject[i])
break
case "bar":
doAnotherThing(jsonObject[i])
break
}
}
}
使用后立即销毁JsonSlurper实例,删除@NonCPS注释,切换到c-style for循环而不是每个。
答案 1 :(得分:3)
为了澄清,这被记录为不受支持的功能 - https://github.com/jenkinsci/workflow-cps-plugin/#technical-design
您不能从@NonCPS方法调用常规(CPS转换)方法或管道步骤,因此它们最好用于在将摘要传递回主脚本之前执行某些计算。