web-dev-qa-db-ja.com

Jenkins Groovyはパイプラインを終了せずに@NonCPSメソッドからメソッドを呼び出す方法

Jenkins Pipelineで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"
}]

...パイプラインは常に最初の反復後に終了します。これは、おそらく同期と非同期の機能が混在しているためです。これを行う方法はありますか?

8
Fo.

この問題は基本的に次のようにして解決しました。

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ループに切り替えます。

9
Fo.

明確にするために、これはサポートされていない機能として記載されています https://github.com/jenkinsci/workflow-cps-plugin/#technical-design

@NonCPSメソッドから通常の(CPS変換された)メソッドまたはパイプラインステップを呼び出すことはできないため、要約をメインスクリプトに返す前にいくつかの計算を実行するのに最適です。

3
evildethow