如何在Jenkins脚本管道中动态设置环境变量?

3

我正在尝试在 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{}部分尽可能DRY/动态的最佳方法是什么?
我更喜欢有一个可扩展的解决方案,可以接受一组 environmentName=Value 对,因为这将是更通用的情况。
注:我已经尝试了针对脚本管道的withEnv[]解决方案,但这似乎有相同的问题。
1个回答

2
我找到了解决这个问题的方法。 就是使用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\""])

这是有效的,应该能够正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接