Jenkins Pipeline局部变量
变量未定义
在编写Jenkinsfile时,经常会遇到变量问题,明明已经定义过了,但是函数是就是无法读取。
例如:
1 | def some_var = "some value" |
将获得如下错误:
1 | groovy.lang.MissingPropertyException: No such property: some_var for class: groovy.lang.Binding |
在该例子中明明开始已经定义了dome_var变量,但是在pr函数中却无法引用。
原因
- 在main script中使用def定义的变量并不能被其它函数引用, def some_var = “some value”
- 在main script中不使用def定义的变量,能够被其它函数引用, some_var = “some value”
- 使用def定义的变量,添加@Field标注手,能够被同一个script中的其它函数引用, 这是因为在groovy编译该script时,会将脚本中的内容包含在一个class中,内容大致如下:
1
2
3
4import groovy.transform.Field
@Field
def some_var = "some value"从以上脚本中看到,some_var 并不在pr函数的范围中,所以无法识别该变量。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class 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()
}
}
}
}
}
}
如果在script中定义变量不带def的话,groovy编译时,会将该变量保存到groovy.lang.Binding中,这样的话,groovy的任意函数均可访问到该变量,但这里存在一个风险,就是会被覆盖,因为Binding是全局的。
最后使用@Field方式,将变量定义为该script下的变量,在该例子中,如果变量some_var添加了@Field标注,则script会被编译为:
1 | class Script1 { |
此时some_var变量做为该Script下的成员变量,该Script下的函数均可访问到。
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Michael Blog!
评论