我在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,我不确定哪个其他管道或其他插件是相关的。
谢谢。
答案 0 :(得分:0)
简单的答案是"说"需要是@NonCPS。然后它按预期工作。
它看起来像是异常的原因是因为@NonCPS被实现为抛出在内部捕获和处理的异常。有关技术详情,请参阅https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md。
当@NonCPS函数调用启用CPS的函数时,解释器似乎应该引发用户可见的错误,而不是静默中止函数并继续使用管道...