一尘不染

Jenkins Groovy如何在不结束管道的情况下从@NonCPS方法调用方法

jenkins

我需要在Jenkins Pipeline中解析一些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"
}]

…管道总是在第一次迭代后退出。据推测这是由于混合了同步和异步功能。有什么办法吗?


阅读 494

收藏
2020-07-25

共1个答案

一尘不染

我已经通过执行以下操作基本上解决了此问题:

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样式的for循环,而不是每个循环。

2020-07-25