Jenkins 管道 Groovy 中的意外行为:.each 不迭代
Unexpected behavior in Jenkins Pipeline Groovy: .each not iterating
我已将 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 解释器中执行此操作时(较少 @NonCPS),我得到了预期的输出:
before fn()
ctx.alljobs=[a, b, c]
a
b
c
Done.
after fn()
当我 运行 Jenkins Pipeline 作业时,我看到以下内容:
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没有打印出来,而是函数returns执行后的say.
我尝试在 try-catch 中包装各种块以查看是否发生异常,但没有成功。我错过了什么吗?我在 Jenkins 之外的 groovy 解释器中看到的行为是错误的吗?
管道错误?还是我遗漏了什么?
我在 Jenkins v2.44 上执行。这是一个严密锁定的环境;我知道它是某种 Linux 上的 运行ning;我相信我有 workflow-cps 'Pipeline: Groovy' v2.26,但我不确定哪个其他管道或其他插件是相关的。
谢谢。
简单的答案是 "say" 需要是@NonCPS。然后它按预期工作。
它看起来像发生异常的原因是因为@NonCPS 被实现为抛出一个在内部捕获和处理的异常。有关技术详细信息,请参阅 https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md。
当@NonCPS 函数调用 CPS-enabled 函数时,解释器似乎应该引发 user-visible 错误,而不是默默地中止该函数并继续使用管道...
我已将 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 解释器中执行此操作时(较少 @NonCPS),我得到了预期的输出:
before fn()
ctx.alljobs=[a, b, c]
a
b
c
Done.
after fn()
当我 运行 Jenkins Pipeline 作业时,我看到以下内容:
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没有打印出来,而是函数returns执行后的say.
我尝试在 try-catch 中包装各种块以查看是否发生异常,但没有成功。我错过了什么吗?我在 Jenkins 之外的 groovy 解释器中看到的行为是错误的吗?
管道错误?还是我遗漏了什么?
我在 Jenkins v2.44 上执行。这是一个严密锁定的环境;我知道它是某种 Linux 上的 运行ning;我相信我有 workflow-cps 'Pipeline: Groovy' v2.26,但我不确定哪个其他管道或其他插件是相关的。
谢谢。
简单的答案是 "say" 需要是@NonCPS。然后它按预期工作。
它看起来像发生异常的原因是因为@NonCPS 被实现为抛出一个在内部捕获和处理的异常。有关技术详细信息,请参阅 https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md。
当@NonCPS 函数调用 CPS-enabled 函数时,解释器似乎应该引发 user-visible 错误,而不是默默地中止该函数并继续使用管道...