如何在脚本化的詹金斯管道中动态设置环境变量?

问题描述 投票:1回答:1

我正在尝试在jenkins管道脚本中动态设置环境变量。

我正在使用.groovy和.jenkinsfile脚本的组合来为管道尽可能干燥地生成stage {}定义。

我下面有一种方法:

def generateStage(nameOfTestSet, pathToTestSet, machineLabel, envVarName, envVarValue)
{
    echo "Generating stage for ${nameOfTestSet} on ${machineLabel}"
    return node("${machineLabel}") {
        stage(nameOfTestSet)
        {
            /////// Area of interest ////////////
            environment {
                "${envVarName} = ${envVarValue}"
            }
           /////////////////////////////////////
            try {
                echo "Would run: "+pathToTestSet

            } finally {
                echo "Archive results here"
            }   
        }
    }
}

有一些包装器代码正在运行,但是抽象起来,我们将使调用者本质上使用:

generateStage("SimpleTestSuite", "path.to.test", "MachineA", "SOME_ENV_VAR", "ENV_VALUE")

最后两个参数是环境名称(SOME_ENV_VAR)和值(ENV_VALUE

等效的声明性代码将是:

stage("SimpleTestSuite")
{
  agent {
     label "MachineA"
  }
  environment = {
   SOME_ENV_VAR = ENV_VALUE
  }
  steps {
    echo "Would run" + "path.to.test" 
  }
  post {
    always {
      echo "Archive results"
      }
  }
}

但是,运行此脚本时,第一个代码块中的environment语法似乎根本不影响实际执行。如果我回显$ {SOME_ENV_VAR}(或者甚至在以该变量名作为实际环境值的情况下回显$ {envVarName}),它们都将返回null。

我想知道使environment{}部分尽可能干/动态的最佳方法是什么?

[如果有一个可扩展的解决方案可以包含一个environmentName = Value对的列表,我会更愿意,因为这是更常见的情况。

注意:我已经尝试过脚本管道的withEnv[]解决方案,但是这似乎有相同的问题。

jenkins jenkins-pipeline dry jenkins-groovy jenkins-declarative-pipeline
1个回答
0
投票

我想出了解决办法。

将使用withEnv([])步骤。

def generateStage(nameOfTestSet, pathToTestSet, machineLabel, listOfEnvVarDeclarations=[])
{
    echo "Generating stage for ${nameOfTestSet} on ${machineLabel}"
    return node("${machineLabel}") {
        stage(nameOfTestSet)
        {
            withEnv(listOfEnvVarDeclarations) {
                try {
                    echo "Would run: "+pathToTestSet

                } finally {
                    echo "Archive results here"
                }   
            }
        }
    }
}

调用方方法将是:

generateStage("SimpleTestSuite", "path.to.test", "MachineA", ["SOME_ENV_VAR=\"ENV_VALUE\""])

由于withEnv([])步骤可以吸收多个环境变量,所以我们也可以这样做:

generateStage("SimpleTestSuite", "path.to.test", "MachineA", ["SOME_ENV_VAR=\"ENV_VALUE\"", "SECOND_VAR=\"SECOND_VAL\""])

这将是有效的并且应该起作用。

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