我有以下 Groovy 代码:// @NonCPSdef printList(params) { def jobs = [:] println params params.split(",").each { param -> println "Param: ${param}" }}text = "Foo,Bar,Baz,Qux"printList(text)从 groovy 命令调用时按预期工作:$ groovy test.groovyFoo,Bar,Baz,QuxParam: FooParam: BarParam: BazParam: Qux尽管在 Jenkins 的非沙盒作业中进行测试时,我得到了不同的结果:[Pipeline] echoFoo,Bar,Baz,Qux[Pipeline] echoParam: Foo[Pipeline] End of Pipeline问题是只打印了第一项,而不是全部。然而,只有在使用 @NonCPS 辅助方法时,代码才能在 Jenkins 中按预期工作。为什么需要 @NonCPS 才能正确遍历项目列表?有没有不使用 @NonCPS 的解决方法(尤其是在沙盒环境中)? 最佳答案 我了解 CPS 的工作原理和实现方式,以及它是如何由管道处理的(到目前为止还没有深入研究它的代码),管道试图测试挂起的能力(备份/..传输../恢复)通过序列化接口(interface)执行(JVM)状态最多的代码指令。考虑到它是 JVM 其次,我自己不是 Groovy 或 Java 专家,就我所能想到的实现而言,groovy 生成器(例如 { f -> print f } )与 python(yield)或 C/C++ 生成器(仿函数对象)中的生成器非常相似。到目前为止,只要可迭代的主题迭代器(例如列表索引或产量表达式状态)是隐式的,就不能通过管道轻松地序列化它们。因此偏好 Java 风格的循环。替代的 Java 风格(经典 C)循环处理起来要简单得多,只要执行范围显式包含循环迭代器('i' 索引变量)。请不要认为这是一个权威的答案,上述只是我个人对管道 CPS 的理解关于jenkins - 为什么在遍历列表时需要@NonCPS?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40196903/ 10-14 03:31