2017-02-15 35 views
0

我在詹金斯管道减少了一些意外的行为(对我来说)常规以下内容:创建具有下列脚本代码詹金斯管道项目:意外的行为:没有。每次迭代

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()" 

当我在詹金斯(少@NonCPS)之外的Groovy解释执行,我得到的输出I预期:

before fn() 
ctx.alljobs=[a, b, c] 
a 
b 
c 
Done. 
after fn() 

当我运行詹金斯管道的工作,我看到以下内容:

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 

的。每个没有在所有正在执行的(我也看到了它执行一次 - 这正是促使我尽量减少到一个简单的代码片段) - 后循环是说,并且该功能被抛弃不打印,但函数返回后的说法正在执行。

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

流水线错误?或者我错过了什么?

我执行的詹金斯v2.44。这是一个严密锁定的环境;我知道它在某种Linux上运行;我相信我有workflow-cps的Pipeline:Groovy'v2.26,我不确定哪个其他管道或其他插件是相关的。

谢谢。

回答

0

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

它看起来像一个例外发生的原因是因为@NonCPS实现抛出其被捕获并处理内部异常。有关技术细节,请参阅https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md

这似乎解释应该当@NonCPS函数调用启用CPS功能,而不是默默地中止功能,并与管道上移动,以提高用户可见的错误...

+2

之一的几种情况如果您的脚本中出现了错误,Jenkins不会提供足够的信息(或任何)。 –