我正在尝试在 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[]
解决方案,但这似乎有相同的问题。