TL; DR
- 定义的变量 与
def
主脚本主体不能从其他方法来访问。 - 定义的变量 ,而不
def
能够直接通过任何方法甚至从不同的脚本访问。这是一个坏习惯。 - 使用
def
和@Field
注释定义的变量可以直接从同一脚本中定义的方法访问。
说明
当groovy编译该脚本时,它实际上将所有内容移动到一个 大致 类似于以下内容的类
class script1 { def pr() { def another_var = "another " + some_var echo "${another_var}" } def run() { def some_var = "some value" pipeline { agent any stages { stage ("Run") { steps { pr() } } } } }}您可以看到这
some_var显然超出了范围,因为
pr()它是另一种方法中的局部变量。
在没有定义变量的 情况下
def,实际上 没有 将该变量放入脚本的绑定中(所谓的 绑定变量 )。因此,当groovy
pr()首先执行方法时,它将尝试查找具有名称的局部变量,
some_var如果该变量不存在,则尝试在Binding中找到该变量(因为您没有定义便存在该变量
def)。
绑定变量被认为是不好的做法,因为如果您加载多个脚本(
load步骤),则在所有这些脚本中都可以访问绑定变量,因为Jenkins对所有脚本共享相同的绑定。更好的选择是使用
@Field
注释。这样,您可以使一个脚本中的所有方法都可以访问变量,而无需将其暴露给其他脚本。
import groovy.transform.Field@Field def some_var = "some value"def pr() { def another_var = "another " + some_var echo "${another_var}"}//your pipeline当groovy将这个脚本编译成一个类时,它将看起来像这样
class script1 { def some_var = "some value" def pr() { def another_var = "another " + some_var echo "${another_var}" } def run() { //your pipeline }}


