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

Jenkins Groovy how to call methods from @NonCPS method without ending pipeline

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

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

我基本上通过执行以下操作解决了这个问题:

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://github.com/jenkinsci/workflow-cps-plugin/#technical-design

You may not call regular (CPS-transformed) methods, or Pipeline steps, from a @NonCPS method, so they are best used for performing some calculations before passing a summary back to the main script.