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

问题描述 投票:0回答:6

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

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

例如,我需要在结帐后设置一些变量。因此,在结账阶段结束时,我有一个

script{}
块来设置这些变量,并且可以在其他阶段访问它们。

这可行,但感觉不对。为了可读性,我更愿意在管道的顶部声明这些变量并覆盖它们。因此,这意味着在开始时有一个“设置变量”阶段,其中有一个仅定义变量的

script{}
块:这很丑陋。

我很确定我在这里缺少一个明显的功能。声明式管道是否具有全局变量功能,还是必须使用

script{}

jenkins groovy jenkins-pipeline jenkins-plugins jenkins-groovy
6个回答
15
投票

这工作正常,没有错误,

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

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

10
投票

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

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

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

    }
}

6
投票

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

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

6
投票

@Sameera 的答案适用于大多数用例。不过,我在附加运算符

+=
时遇到了问题。所以这不起作用
MissingPropertyException
):

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

但这确实有效:

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

3
投票

正确的语法是:

  • 对于全局静态变量

在文件顶部的某个位置,在

pipeline {
之前,声明:

def MY_VAR = 'something'
  • 对于可以跨阶段编辑和重用的全局变量:

在文件顶部,添加对字段的导入:

import groovy.transform.Field

pipeline {
之前的某个地方,声明:

@Field def myVar

然后在步骤中的脚本中设置变量

  stage('some stage') {
    steps {
      script {
        myVar = 'I mutate myVar with success'
      }
    }
  }
  • 更进一步,您可以声明函数:

之前

pipeline {

def initSteps() {
    cleanWs()
    checkout scm
}

然后

  stages {
    stage('Init') {
      steps {
        initSteps()
      }
    }
  }

0
投票

这对我有用

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

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

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.