我之前问过一个问题,关于如何覆盖环境指令中定义的变量,这似乎是不可能的。
我想在一个阶段设置一个变量并使其可供其他阶段访问。在声明式管道中,执行此操作的唯一方法似乎是在 script{} 块中。
例如,我需要在结帐后设置一些变量。因此,在结账阶段结束时,我有一个
script{}
块来设置这些变量,并且可以在其他阶段访问它们。
这可行,但感觉不对。为了可读性,我更愿意在管道的顶部声明这些变量并覆盖它们。因此,这意味着在开始时有一个“设置变量”阶段,其中有一个仅定义变量的
script{}
块:这很丑陋。
我很确定我在这里缺少一个明显的功能。声明式管道是否具有全局变量功能,还是必须使用
script{}
?
这工作正常,没有错误,
def my_var
pipeline {
agent any
environment {
REVISION = ""
}
stages {
stage('Example') {
steps {
script{
my_var = 'value1'
}
}
}
stage('Example2') {
steps {
script{
echo "$my_var"
}
}
}
}
}
就像@mkobit所说,您可以在管道块之外将变量定义为全局级别。你尝试过吗?
def my_var
pipeline {
agent any
stages {
stage('Example') {
steps {
my_var = 'value1'
}
}
stage('Example2') {
steps {
printl(my_var)
}
}
}
}
对于字符串,将其添加到“环境”块中:
pipeline {
environment {
myGlobalValue = 'foo'
}
}
但是对于非字符串变量,我发现的声明性管道最简单的解决方案是将值包装在方法中。
示例:
pipeline {
// Now I can reference myGlobalValue() in my pipeline.
...
}
def myGlobalValue() {
return ['A', 'list', 'of', 'values']
// I can also reference myGlobalValue() in other methods below
def myGlobalSet() {
return myGlobalValue().toSet()
}
@Sameera 的答案适用于大多数用例。不过,我在附加运算符
+=
时遇到了问题。所以这不起作用(MissingPropertyException
):
def globalvar = ""
pipeline {
stages {
stage("whatever) {
steps {
script {
globalvar += "x"
}
}
}
}
}
但这确实有效:
globalvar = ""
pipeline {
stages {
stage("whatever) {
steps {
script {
globalvar += "x"
}
}
}
}
}
正确的语法是:
在文件顶部的某个位置,在
pipeline {
之前,声明:
def MY_VAR = 'something'
在文件顶部,添加对字段的导入:
import groovy.transform.Field
在
pipeline {
之前的某个地方,声明:
@Field def myVar
然后在步骤中的脚本中设置变量
stage('some stage') {
steps {
script {
myVar = 'I mutate myVar with success'
}
}
}
之前
pipeline {
def initSteps() {
cleanWs()
checkout scm
}
然后
stages {
stage('Init') {
steps {
initSteps()
}
}
}
这对我有用
pipeline {
agent any
stages {
stage('Example') {
steps {
script{
env.my_var = 'value1'
}
}
}
stage('Example2') {
steps {
printl(my_var)
}
}
}
}