我想了解基于groovy dsl和Closure的Jenkins管道的一部分。
我有一个詹金斯文件,如下:
foo {
var1 = "foo value 1"
var2 = "foo value 2"
}
我在我的Jenkins的共享lib中有一个Groovy脚本(foo.groovy中的foo.groovy(:
def call(body) {
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()
println config.var1 // display foo value 1 : for me the magic is here !!
}
我想理解groovy/jenkins机制,当闭合称为映射时,将用变量var1和var2设置地图配置。
。我理解(几乎(闭合机制和委托方法,但是我们怎么知道配置映射对闭合的委托字段的影响允许在我的jenkinsfile中声明的变量构建地图?/p>
我希望我在问题上很清楚!:(
问:
Stef
当封闭中引用属性时,该引用无法在封闭中解决,试图在各种" loces"
中解决该属性。-
this
- 封闭的
delegate
属性,可以重新分配 - 关闭的
owner
在您的示例中, var1
和 var2
是无法在闭合中解决的参考的示例。
以下将关闭的代表分配给config
,并确保这是第一个将用于解决未解决的参考的"位置"
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
因此,当我们将属性 var1
和 var2
设置在闭合中时,它们会根据config
解决,即将其设置为此Map
的键值对。
如果您的示例更改为:
foo {
def var3 = "some value"
var1 = "foo value 1"
var2 = "foo value 2"
var3 = "some value"
}
var3
将通过 config
解决,因为它可以在闭合中解决。
更新
回答您的评论(我认为(问:为什么将关闭的代表设置为地图会导致键值对添加到该地图上?
当var1 = "foo value 1"
无法在闭合中解决时,它是根据地图解决的,因为此
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
这有效地意味着我们正在调用
config.var1 = "foo value 1"
这是
的Groovy Shorthandconfig.put("var1", "foo value 1")
也许如果您更改代码直接调用put
方法,例如
def foo = {
put('var1', "foo value 1")
}
def call(body) {
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()
println config.var1 // display foo value 1 : for me the magic is here !!
}
call(foo)
如果您在Groovy Console中运行此代码,您会看到它也打印出" foo value 1"。
如果您仍在挣扎,也许这个问题会有所帮助。