Jenkins(v2.7.1)でパイプラインジョブを実行しました。ここでは、複数行の文字列パラメーター(Params
)の各要素を、各行に3つの文字列とともに出力します。Foo 、Bar、Baz入力として。
だから私は次の構文を試しました( split
とeach
を使用):
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)
それを機能させるためにどの構文を使用する必要がありますか?
Groovy Sandboxオプションを使用して@NonCPS
ヘルパーメソッドを追加すると、コードは正常に機能します。または、 @ agg3l で提案されているように、Jenkins managementに進んで、このメソッドへのアクセスを許可します。
したがって、動作するコードは(2番目の例と同じ)です。
@NonCPS
def printParams() {
Params.split("\\r?\\n").each { param ->
println "Param: ${param}"
}
}
printParams()