我在Jenkins管道工作(v2.7.1),我想打印多行字符串参数(Params)的每个元素,每行有3个字符串:Foo,Bar,Baz作为输入.
所以我尝试了以下语法(使用split和每个):
Params.split("\\r?\\n").each { param ->
println "Param: ${param}"
}
但它失败了:
java.lang.UnsupportedOperationException: Calling public static java.lang.Object
org.codehaus.groovy.runtime.DefaultGroovyMethods.each(java.lang.Object,groovy.lang.Closure) on a CPS-transformed closure is not yet supported (07001); encapsulate in a @NonCPS method, or use Java-style loops
at org.jenkinsci.plugins.workflow.cps.GroovyClassLoaderWhitelist.checkJenkins26481(GroovyClassLoaderWhitelist.java:90)
建议封装在@NonCPS方法中,或使用Java风格的循环.
所以我试图封装在@NonCPS方法中,如:
@NonCPS
def printParams() {
Params.split("\\r?\\n").each { param ->
println "Param: ${param}"
}
}
printParams()
但它失败了:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println groovy.lang.Closure java.lang.Object
如果没有这个功能(按照第一个例子),在开头添加@NonCPS就会抱怨意外的令牌.
我也尝试使用for运算符建议的Java风格语法(类似于here):
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)
我应该使用哪种语法来使其工作?