2016-04-14 4 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

これは実際のスクリプトではなく、実際のスクリプトではなく、投稿の入力ミスです...でも良いアイザックキ –

+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スタイルに切り替えます。

+0

多分この問題を解決する方法についてのアイデアもあります。https://stackoverflow.com/questions/44629038/how-do-i-remove-a-temporary-folder-on-exit-in-groovy - 私たちは何をすべきですか?それをジェンキンスで働かせるには? – sorin

2
だけ明確にするために、これはサポートされていない機能として文書化されて

からhttps://github.com/jenkinsci/workflow-cps-plugin/#technical-design

あなたは@NonCPS方法から、定期的に(CPSは、形質転換)メソッド、またはパイプラインのステップを呼び出すことはできませんので、彼らは最高使用されていますサマリをメインスクリプトに渡す前にいくつかの計算を実行するためのものです。

関連する問題