小编典典

如何打印多行字符串参数的每个元素?

jenkins

我在Jenkins(v2.7.1)中完成了Pipeline作业,在此我想打印多行字符串参数(Params)的每个元素,每行3个字符串: Foo
BarBaz 作为输入。

因此,我尝试了以下语法(使用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在开始时添加它会抱怨 意外的token


我还尝试了使用 _for_运算符建议的Java样式语法(类似于here):

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

这似乎可以在普通Groovy中工作,但是在Jenkins中却失败了,原因是:

java.io.NotSerializableException:org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)上的java.util.AbstractList
$ Itr


我应该使用哪种语法使其起作用?


阅读 426

收藏
2020-07-25

共1个答案

小编典典

禁用“ 使用Groovy沙箱” 选项并添加@NonCPS帮助程序方法时,代码可以正常工作。或者,按照@
agg3l的建议,进行_Jenkins管理_ 以允许此方法访问。

因此,工作代码是(与第二个示例相同):

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