我有下面的Groovy代码:为什么在迭代列表时需要@NonCPS?
// @NonCPS
def printList(params) {
def jobs = [:]
println params
params.split(",").each { param ->
println "Param: ${param}"
}
}
text = "Foo,Bar,Baz,Qux"
printList(text)
从groovy
命令调用时预期其工作原理:
$ groovy test.groovy
Foo,Bar,Baz,Qux
Param: Foo
Param: Bar
Param: Baz
Param: Qux
尽管詹金斯非沙盒的工作中进行测试时,我有不同结果:
[Pipeline] echo
Foo,Bar,Baz,Qux
[Pipeline] echo
Param: Foo
[Pipeline] End of Pipeline
问题是只打印第一项而不是全部打印。
但是,只有在使用@NonCPS
辅助方法时,代码才能在Jenkins中按预期工作。
为什么@NonCPS
对于正确迭代项目列表是必要的?没有使用@NonCPS
(特别是在沙盒环境中)有什么解决方法吗?
我不会尝试,现在CPS工作在流水线解释你,它的实现还是有点神奇/对我来说不可预知,并且与这个问题无关。然而,我可以说非沙盒管道的行为与同一个脚本的沙盒版本有很大不同。对我来说可能会成为实施问题。 Jenkins管道现在仍在大量开发中。顺便说一下,'禁用沙箱'选项不适用于SCM来源的scipt,原因很明显 – agg3l
我建议您关注“沙盒”模式,解决它出现时的问题和限制。这是管道的主要模式 – agg3l