您如何处理声明性管道中的全局变量?

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)
            }
        }

    }
}