web-dev-qa-db-ja.com

複数行の文字列パラメータの各要素を印刷するにはどうすればよいですか?

Jenkins(v2.7.1)でパイプラインジョブを実行しました。ここでは、複数行の文字列パラメーター(Params)の各要素を、各行に3つの文字列とともに出力します。FooBarBaz入力として。

だから私は次の構文を試しました( spliteachを使用):

Params.split("\\r?\\n").each { param ->
    println "Param: ${param}"
}

しかし、それは失敗します:

Java.lang.UnsupportedOperationException:CPS変換されたクロージャでのpublic static Java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each(Java.lang.Object、groovy.lang.Closure)の呼び出しはまだサポートされていません(- JENKINS-26481 ); @NonCPSメソッドでカプセル化するか、org.jenkinsci.plugins.workflow.cps.GroovyClassLoaderWhitelist.checkJenkins26481(GroovyClassLoaderWhitelist.Java:90)でJavaスタイルのループを使用します

@ NonCPSメソッドでカプセル化するか、Javaスタイルのループを使用するを提案します。


だから私は@ NonCPSメソッドでカプセル化するのようにしようとしました:

@NonCPS
def printParams() {
    Params.split("\\r?\\n").each { param ->
        println "Param: ${param}"
    }
}
printParams()

しかし、それは失敗します:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:staticMethodの使用が許可されていないスクリプトorg.codehaus.groovy.runtime.DefaultGroovyMethods println groovy.lang.Closure Java.lang.Object

関数がない場合(最初の例のように)、最初に@NonCPSを追加すると、予期しないトークンについて文句を言います。


for演算子( here と同様)を使用して提案されたJavaスタイルの構文も試しました。

String[] params = Params.split("\\r?\\n")
for (String param: params) {
    println "Param: ${param}"
}

これはプレーンなGroovyで機能するようですが、Jenkinsでは次のように失敗します。

Java.io.NotSerializableException:Java.util.AbstractList $ Itr at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.Java:860)


それを機能させるためにどの構文を使用する必要がありますか?

6
kenorb

Groovy Sandboxオプションを使用して@NonCPSヘルパーメソッドを追加すると、コードは正常に機能します。または、 @ agg3l で提案されているように、Jenkins managementに進んで、このメソッドへのアクセスを許可します。

したがって、動作するコードは(2番目の例と同じ)です。

@NonCPS
def printParams() {
    Params.split("\\r?\\n").each { param ->
        println "Param: ${param}"
    }
}
printParams()
2
kenorb