Jenkinsfile中的奇怪变量作用域行为

当我运行以下Jenkins管道脚本时:

def some_var = "some value"

def pr() {

def another_var = "another " + some_var

echo "${another_var}"

}

pipeline {

agent any

stages {

stage ("Run") {

steps {

pr()

}

}

}

}

我收到此错误:

groovy.lang.MissingPropertyException: No such property: some_var for class: groovy.lang.Binding

如果def从中删除some_var,则可以正常工作。有人可以解释导致此行为的作用域规则吗?

回答:

回答:

  • 定义的变量 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

}

}

以上是 Jenkinsfile中的奇怪变量作用域行为 的全部内容, 来源链接: utcz.com/qa/422446.html

回到顶部