Jenkins管道Groovy中出现意外行为:。每个都未迭代

Jenkins管道Groovy中出现意外行为:。每个都未迭代,groovy,jenkins-pipeline,Groovy,Jenkins Pipeline,我已将Jenkins Pipeline groovy中(对我而言)的一些意外行为简化为以下内容:使用以下脚本代码创建Jenkins Pipeline项目: def a = ['a','b','c'] def ctx = [ alljobs: a ] def say(s) {println "$s"} @NonCPS def fn(ctx) { say "ctx.alljobs=$ctx.alljobs" ctx.alljobs.each { j -> say "$j" } s

我已将Jenkins Pipeline groovy中(对我而言)的一些意外行为简化为以下内容:使用以下脚本代码创建Jenkins Pipeline项目:

def a = ['a','b','c']
def ctx = [ alljobs: a ]
def say(s) {println "$s"}

@NonCPS
def fn(ctx) {
  say "ctx.alljobs=$ctx.alljobs"
  ctx.alljobs.each { j -> say "$j" }
  say "done"
}
say "before fn()"
fn(ctx)
say "after fn()"
当我在Jenkins之外的Groovy解释器(less@NonCPS)中执行此操作时,我得到了预期的输出:

before fn()
ctx.alljobs=[a, b, c]
a
b
c
Done.
after fn()
运行Jenkins管道作业时,我看到以下内容:

Started by user John Elion (john.elion)
[Pipeline] echo
before fn()
[Pipeline] echo
ctx.alljobs=[a, b, c]
[Pipeline] echo
after fn()
[Pipeline] End of Pipeline
Finished: SUCCESS
.each根本没有执行(我也看到它执行过一次——这促使我尝试将其简化为一个简单的代码片段),并且函数正在被放弃——循环后的say没有打印出来,但函数返回后的say正在执行

我曾尝试在try-catch中包装各种块,以查看是否发生异常,但没有成功。我错过什么了吗?我期望在Jenkins之外的groovy解释器中看到的行为是错误的吗

管道缺陷?还是我遗漏了什么

我正在执行Jenkins v2.44。这是一个封闭的环境;我知道它运行在某种Linux上;我相信我有工作流cps“Pipeline:Groovy”v2.26,我不确定其他哪些管道或其他插件是相关的

谢谢。

简单的答案是“说”必须是@NonCPS。然后它就如预期的那样工作了

看起来异常正在发生的原因是@NonCPS被实现为抛出一个内部捕获和处理的异常。有关技术详细信息,请参阅


当@NonCPS函数调用启用CPS的函数时,解释器似乎应该引发一个用户可见的错误,而不是静默中止该函数并继续执行管道…

Jenkins没有提供足够信息(或任何信息)的几种情况之一,如果您在脚本中做错了什么。