Jenkins Groovy如何在不结束流水线的情况下从@NonCPS方法中调用方法

9

我需要在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"
}]

在第一次迭代后,管道总是退出。这可能是由于混合使用同步和异步函数所致。有没有办法解决这个问题?


你有没有注意到这个错别字:def jsonObject = jsonSurper(json)(右侧缺少“l”)? - izzekil
这只是帖子中的一个笔误,而不是实际脚本...但是@izzekil发现得很好。 - Fo.
1
你可能遇到过这个问题:https://issues.jenkins-ci.org/browse/JENKINS-31314 或者这个问题:https://issues.jenkins-ci.org/browse/JENKINS-26481 - izzekil
是的,问题26481看起来很可能是相同的。 - Fo.
2个回答

11

我基本上通过以下方式解决了这个问题:

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循环而不是each。


也许你有解决这个问题的想法 https://stackoverflow.com/questions/44629038/how-do-i-remove-a-temporary-folder-on-exit-in-groovy -- 我们应该怎么做才能在Jenkins中使其工作? - sorin

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接