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

时间:2016-10-22 18:40:43

标签: jenkins groovy jenkins-pipeline

我在Jenkins(v2.7.1)中的管道工作,我想打印多行字符串参数(Params)的每个元素,每行包含3个字符串: Foo Bar Baz 作为输入。

所以我尝试了以下语法(使用spliteach):

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

但它失败了:

  

java.lang.UnsupportedOperationException:调用public static java.lang.Object   尚未支持CPS转换闭包上的org.codehaus.groovy.runtime.DefaultGroovyMethods.each(java.lang.Object,groovy.lang.Closure)(JENKINS-26481);封装在@NonCPS方法中,或使用Java风格的循环       在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:脚本不允许使用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       在org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)

我应该使用哪种语法来实现它?

2 个答案:

答案 0 :(得分:1)

禁用使用Groovy Sandbox 选项并添加@NonCPS帮助程序方法时,代码可以正常工作。或者,根据@agg3l的建议,继续 Jenkins管理以允许此方法访问。

所以工作代码是(与第二个例子相同):

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

答案 1 :(得分:0)

我知道这是一篇过时的文章,但这是我的方法,希望可以帮助其他人

params.readLines().each {
                            println it
                            if (it) {
                                // if you want to avoid make operation with empty lines
                            }
                        }
相关问题