2016-04-14 45 views
5

我需要在Jenkins管道中解析一些JSON并在循环中调用一些常规方法,但是脚本总是在第一次函数调用之后退出。这个怎么做?Jenkins Groovy如何从@NonCPS方法调用方法而不结束管道

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" 
}] 

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

+0

你有没有注意到错字:def jsonObject = jsonSurper(json)(在右半部分缺少“l”)? – izzekil

+0

这只是一个错误的帖子,而不是实际的脚本......但好眼睛@izzekil –

+1

你可能会遇到这样的:https://issues.jenkins-ci.org/browse/JENKINS-31314或这个:https: //issues.jenkins-ci.org/browse/JENKINS-26481 – izzekil

回答

7

我已经做了以下基本解决了这个问题:

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循环,而不是每一个。

+0

也许你也有一个关于如何解决这个问题的想法https://stackoverflow.com/questions/44629038/how-do-i-remove-a-temporary-folder-on-exit-in-groovy-我们应该怎么做做到这一点,使其在詹金斯工作? – sorin

相关问题