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

时间:2017-12-08 15:02:59

标签: jenkins jenkins-plugins jenkins-pipeline

以前asked a question关于如何覆盖环境指令中定义的变量,似乎不可能。

我想在一个阶段设置一个变量,并让其他阶段可以访问它。 在声明性管道中,似乎唯一的方法是在脚本{}块中。

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

这有效,但感觉不对。为了便于阅读,我更倾向于在管道顶部声明这些变量并将其覆盖。这意味着有一个"设置变量"在一开始阶段用一个脚本{}块来定义变量 - 这很难看。

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

5 个答案:

答案 0 :(得分:9)

这一切正常,

git push heroku masterbranch

答案 1 :(得分:7)

与@mkobit一样,您可以将变量定义为管道块之外的全局级别。你试过了吗?

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

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

    }
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

@Sameera的回答对大多数用例来说都是好的。我在附加运算符+=时遇到问题。因此,起作用了(MissingPropertyException

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

但这没有有效:

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

答案 4 :(得分:0)

这对我有用

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

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

    }
}