11

以前问过一个关于如何覆盖环境指令中定义的变量的问题,这似乎是不可能的。

我想在一个阶段设置一个变量并让其他阶段可以访问它。在声明式管道中,执行此操作的唯一方法似乎是在 script{} 块中。

例如,我需要在结帐后设置一些变量。因此,在结帐阶段结束时,我有一个 script{} 块来设置这些变量,并且它们可以在其他阶段访问。

这行得通,但感觉不对。为了便于阅读,我更喜欢在管道顶部声明这些变量并覆盖它们。因此,这意味着在开始时有一个“设置变量”阶段,其中包含一个仅定义 vars 的脚本{} 块——这很难看。

我很确定我在这里缺少一个明显的功能。声明性管道是否具有全局变量功能或者我必须使用脚本{}

4

5 回答 5

15

这工作没有错误,

def my_var
pipeline {
    agent any
    environment {
        REVISION = ""
    }
    stages {
        stage('Example') {
            steps {
                script{
                    my_var = 'value1'
                }
            }
        }

        stage('Example2') {
            steps {
                script{
                    echo "$my_var" 
                }
            }
        }
    }
}
于 2018-07-04T12:16:03.787 回答
9

就像@mkobit 所说,您可以将变量定义为管道块之外的全局级别。你试过吗?

def my_var
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                my_var = 'value1'
            }
        }

        stage('Example2') {
            steps {
                printl(my_var)
            }
        }

    }
}
于 2017-12-12T09:34:58.670 回答
5

@Sameera 的答案适用于大多数用例。不过,我在附加运算符时遇到了问题+=。所以这不起作用MissingPropertyException):

def globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}

但这确实有效:

globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}
于 2019-10-14T19:28:12.763 回答
5

对于字符串,将其添加到“环境”块中:

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()
}
于 2019-05-15T23:01:50.193 回答
0

这对我有用

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
               script{
                  env.my_var = 'value1'
               }
            }
        }

        stage('Example2') {
            steps {
                printl(my_var)
            }
        }

    }
}
于 2020-06-15T13:40:01.053 回答