任何人都可以解释“闭合” /“詹金斯”的魔力



我想了解基于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"

中解决该属性。
  1. this
  2. 封闭的delegate属性,可以重新分配
  3. 关闭的owner

在您的示例中, var1var2是无法在闭合中解决的参考的示例。

以下将关闭的代表分配给config,并确保这是第一个将用于解决未解决的参考的"位置"

def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config

因此,当我们将属性 var1var2设置在闭合中时,它们会根据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 Shorthand
config.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"。

如果您仍在挣扎,也许这个问题会有所帮助。

最新更新