所以我有一个
Jenkinsfile
这样地:
properties([
[$class: 'BuildDiscarderProperty',
strategy: [$class: 'LogRotator',
numToKeepStr: '10',
artifactNumToKeepStr: '15']]
])
List<String> buildFlavours = ['ubuntu', 'macosx']
List<BuildStep> modulesGroups = [
new BuildStep('UnitTestGroup1'),
new BuildStep('UnitTestGroup2')
]
println "*** outside loop, buildFlavours.size() = ${buildFlavours.size()}"
buildFlavours.each { flavour ->
println "*** inside loop, flavour = ${flavour}"
println "*** outside loop, modulesGroups.size() = ${modulesGroups.size()}"
modulesGroups.each { group ->
// Doesn't work, silently terminates the pipeline with no error!
println "*** inside loop, group = ${group}"
// Somehow this works:
// String groupCopy = group.toString()
// println "*** inside loop, group = ${groupCopy}"
}
}
class BuildStep {
private String displayName
BuildStep(String displayName) {
this.displayName = displayName
}
@Override
String toString() {
return displayName
}
}
当我运行它时,我得到以下输出:
[Pipeline] properties
[Pipeline] echo
*** outside loop, buildFlavours.size() = 2
[Pipeline] echo
*** inside loop, flavour = ubuntu
[Pipeline] echo
*** outside loop, modulesGroups.size() = 2
[Pipeline] echo
*** inside loop, flavour = macosx
[Pipeline] echo
*** outside loop, modulesGroups.size() = 2
[Pipeline] End of Pipeline
为什么循环的内容似乎没有被执行,既没有打印消息也没有抛出错误?
我得到的最好的线索是Jenkins正在使用Groovy CPS,也许出于某种原因,它可能会把代码重写得一团糟。
到目前为止的调查:
-
它不会扔任何东西
Throwable
-如果我试图抓住一个,什么也抓不到。
-
当我把循环中的println改为
toString()
首先,不知何故
做
工作和循环内部的信息确实会被打印出来,但我还不知道为什么。
-
制造
BuildStep
类序列化或更改其名称不会影响任何事情。
-
现在,
filed a ticket
因为至少我认为糟糕的错误报告是可以修复的。