ken*_*orb 5 groovy jenkins jenkins-pipeline
我在Jenkins(v2.7.1)中完成了Pipeline作业,在这里我要打印多行字符串参数(Params)的每个元素,每行3个字符串:Foo,Bar,Baz作为输入。
因此,我尝试了以下语法(使用split和each):
Params.split("\\r?\\n").each { param ->
println "Param: ${param}"
}
Run Code Online (Sandbox Code Playgroud)
但是它失败了:
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()
Run Code Online (Sandbox Code Playgroud)
但是它失败了:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println groovy.lang.Closure java.lang.Object
如果没有该功能(按照第一个示例),则@NonCPS在开始时添加它会抱怨意外的token。
我还尝试了使用for运算符建议的Java样式语法(类似于here):
String[] params = Params.split("\\r?\\n")
for (String param: params) {
println "Param: ${param}"
}
Run Code Online (Sandbox Code Playgroud)
这似乎可以在普通Groovy中工作,但是在Jenkins中却失败了,原因是:
java.io.NotSerializableException:org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)上的java.util.AbstractList $ Itr
我应该使用哪种语法使其起作用?
当禁用“使用 Groovy Sandbox”选项并添加@NonCPS辅助方法时,该代码可以正常工作。或者,按照@agg3l的建议,继续进行Jenkins 管理以允许此方法访问。
所以工作代码是(与第二个示例相同):
@NonCPS
def printParams() {
Params.split("\\r?\\n").each { param ->
println "Param: ${param}"
}
}
printParams()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9832 次 |
| 最近记录: |