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.
我需要在 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.