您如何处理声明性管道中的全局变量?
How do you handle global variables in a declarative pipeline?
之前关于如何覆盖环境指令中定义的变量,但似乎不可能。
我想在一个阶段设置一个变量并让其他阶段可以访问它。
在声明性管道中,执行此操作的唯一方法似乎是在脚本{}块中。
例如,我需要在结帐后设置一些变量。因此,在结帐阶段结束时,我有一个脚本{}块来设置这些变量,并且可以在其他阶段访问它们。
这行得通,但感觉不对。为了可读性,我更愿意在管道的顶部声明这些变量并覆盖它们。因此,这意味着在开头有一个 "set variables" 阶段,其中包含一个仅定义变量的脚本{}块——这太丑陋了。
我很确定我在这里遗漏了一个明显的特征。声明式管道是否具有全局变量功能,或者我必须使用脚本{}
如@mkobit 所说,您可以在管道块之外将变量定义为全局级别。你试过了吗?
def my_var
pipeline {
agent any
stages {
stage('Example') {
steps {
my_var = 'value1'
}
}
stage('Example2') {
steps {
printl(my_var)
}
}
}
}
工作正常,
def my_var
pipeline {
agent any
environment {
REVISION = ""
}
stages {
stage('Example') {
steps {
script{
my_var = 'value1'
}
}
}
stage('Example2') {
steps {
script{
echo "$my_var"
}
}
}
}
}
对于字符串,将其添加到 'environment' 块:
pipeline {
environment {
myGlobalValue = 'foo'
}
}
但是对于 non-string 变量,我为声明性管道找到的最简单的解决方案是将值包装在一个方法中。
示例:
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 的回答适用于大多数用例。不过,我在附加运算符 +=
时遇到了问题。所以这 NOT 工作 (MissingPropertyException
):
def globalvar = ""
pipeline {
stages {
stage("whatever) {
steps {
script {
globalvar += "x"
}
}
}
}
}
但这确实起作用了:
globalvar = ""
pipeline {
stages {
stage("whatever) {
steps {
script {
globalvar += "x"
}
}
}
}
}
这对我有用
pipeline {
agent any
stages {
stage('Example') {
steps {
script{
env.my_var = 'value1'
}
}
}
stage('Example2') {
steps {
printl(my_var)
}
}
}
}
之前
我想在一个阶段设置一个变量并让其他阶段可以访问它。 在声明性管道中,执行此操作的唯一方法似乎是在脚本{}块中。
例如,我需要在结帐后设置一些变量。因此,在结帐阶段结束时,我有一个脚本{}块来设置这些变量,并且可以在其他阶段访问它们。
这行得通,但感觉不对。为了可读性,我更愿意在管道的顶部声明这些变量并覆盖它们。因此,这意味着在开头有一个 "set variables" 阶段,其中包含一个仅定义变量的脚本{}块——这太丑陋了。
我很确定我在这里遗漏了一个明显的特征。声明式管道是否具有全局变量功能,或者我必须使用脚本{}
如@mkobit 所说,您可以在管道块之外将变量定义为全局级别。你试过了吗?
def my_var
pipeline {
agent any
stages {
stage('Example') {
steps {
my_var = 'value1'
}
}
stage('Example2') {
steps {
printl(my_var)
}
}
}
}
工作正常,
def my_var
pipeline {
agent any
environment {
REVISION = ""
}
stages {
stage('Example') {
steps {
script{
my_var = 'value1'
}
}
}
stage('Example2') {
steps {
script{
echo "$my_var"
}
}
}
}
}
对于字符串,将其添加到 'environment' 块:
pipeline {
environment {
myGlobalValue = 'foo'
}
}
但是对于 non-string 变量,我为声明性管道找到的最简单的解决方案是将值包装在一个方法中。
示例:
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 的回答适用于大多数用例。不过,我在附加运算符 +=
时遇到了问题。所以这 NOT 工作 (MissingPropertyException
):
def globalvar = ""
pipeline {
stages {
stage("whatever) {
steps {
script {
globalvar += "x"
}
}
}
}
}
但这确实起作用了:
globalvar = ""
pipeline {
stages {
stage("whatever) {
steps {
script {
globalvar += "x"
}
}
}
}
}
这对我有用
pipeline {
agent any
stages {
stage('Example') {
steps {
script{
env.my_var = 'value1'
}
}
}
stage('Example2') {
steps {
printl(my_var)
}
}
}
}