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

时间:2016-04-14 23:53:51

标签: jenkins groovy 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
            }
    }
}

在上面的例子中,即使是像json这样的对象:

[{
    "name": "foo"
}, {
    "name": "bar"
}]

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

2 个答案:

答案 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转换)方法或管道步骤,因此它们最好用于在将摘要传递回主脚本之前执行某些计算。