Jenkins Groovy如何从@NonCPS方法调用方法而不结束管道

Fo.*_*Fo. 6 groovy jenkins cloudbees jenkins-workflow

我需要在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
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,即使使用json对象,例如:

[{
    "name": "foo"
}, {
    "name": "bar"
}]
Run Code Online (Sandbox Code Playgroud)

...管道总是在第一次迭代后退出.这可能是由于混合同步和异步功能.有没有办法做到这一点?

Fo.*_*Fo. 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用后立即销毁JsonSlurper实例,删除@NonCPS注释,切换到c-style for循环而不是每个.