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

red*_*888 8 groovy jenkins jenkins-plugins jenkins-groovy jenkins-pipeline

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

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

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

这有效,但感觉不对.为了便于阅读,我更倾向于在管道顶部声明这些变量并将其覆盖.所以这意味着在一开始就有一个"设置变量"阶段,脚本{}块只定义了变量丑陋.

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

Vir*_*raj 12

这没有错误,

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

    stage('Example2') {
        steps {
             script{
                echo "$my_var" 
             }

        }
    }

 }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ano 7

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

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。@red888 你能告诉我们什么有效吗? (3认同)

小智 6

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

pipeline {
  environment {
    myGlobalValue = 'foo'
  }
}
Run Code Online (Sandbox Code Playgroud)

但对于非字符串变量,我发现的声明性管道最简单的解决方案是将值包装在方法中。

例子:

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()
}
Run Code Online (Sandbox Code Playgroud)


ako*_*nov 6

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

def globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这确实有效:

globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)