不知道是我对Groovy的知识有限还是Pipeline parallel
步骤中的一个怪癖。如果我使用map而不是单独传递每个闭包,我就不能让它接受failFast
:
def map = [:]
map['spam'] = {
node {
echo 'spam'
}
}
map['eggs'] = {
node {
echo 'eggs'
}
}
parallel map // Works.
parallel spam: map['spam'], eggs: map['eggs'], failFast: true // Works.
parallel map, failFast: true // Fails with exception.
字符串failFast
的例外是:
java.lang.IllegalArgumentException: Expected named arguments but got [{failFast=true}, {spam=org.jenkinsci.plugins.workflow.cps.CpsClosure2@51a382ad, eggs=org.jenkinsci.plugins.workflow.cps.CpsClosure2@718cb50d}]
at org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:276)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:111)
型
4条答案
按热度按时间ogsagwnx1#
字符串
gdx19jrr2#
如果你添加可选的语法,它会有一点帮助。第二个选项是传递一个新的
Map
,而第三个选项是传递你原来的Map
和一个额外的命名参数。老实说,我不知道它是怎么想的。字符串
无论如何,我认为最简单的事情是这样的:
型
或者...
型
drnojrws3#
Jesse Glick的answer
即使你使用for循环来创建一个并行stages,你也可以使用相同的代码-
字符串
aydmsdu94#
所有的答案都提供了解决方案,但没有一个解释你得到异常的原因。
要理解这一点,阅读Groovy的命名参数是有益的。
在Groovy中,要创建一个可以接受命名参数的函数,必须将其声明为接受单个
Map
参数的函数。示例:字符串
然而,这是错误的:
型
所以你试图调用一个需要一个map的函数,但是你传递给它两个map。
要亲自查看,请尝试在本地执行此测试Groovy代码,不需要Jenkins
型
最后,有几个替代解决方案可以在不修改原始
map
的情况下工作:型