Jenkins管道Groovy中的意外行为:。不迭代

时间:2017-02-15 12:59:55

标签: groovy jenkins-pipeline

我在Jenkins Pipeline groovy中减少了一些意外的行为(对我来说):使用以下脚本代码创建Jenkins管道项目:

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解释器中执行此操作时(更少@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根本没有执行(我也看过它执行一次 - 这是促使我尝试缩减为简单代码片段的原因),并且该函数被放弃了 - 循环后的说法不是打印,但函数返回后的说法正在执行。

我尝试在try-catch中包装各种块以查看是否发生了异常,但没有运气。我错过了什么吗?我错在期待Jenkins以外的常规翻译中看到的行为吗?

管道错误?或者我错过了什么?

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

谢谢。

1 个答案:

答案 0 :(得分:0)

简单的答案是"说"需要是@NonCPS。然后它按预期工作。

它看起来像是异常的原因是因为@NonCPS被实现为抛出在内部捕获和处理的异常。有关技术详情,请参阅https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md

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