如何在脚本化的詹金斯管道中动态设置环境变量?
How to dynamically set environment variables in scripted jenkins pipeline?
我正在尝试在 jenkins 管道脚本中动态设置环境变量。
我正在使用 .groovy 和 .jenkinsfile 脚本的组合来为管道生成尽可能干燥的阶段{}定义。
我有以下方法:
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} 以防它将此变量名称作为实际环境值)它们都 return null.
我想知道使此 environment{}
部分尽可能干/动态的最佳方法是什么?
如果有一个可以接受 environmentName=Value 对列表的可扩展解决方案,我会更喜欢它,因为这将是更一般的情况。
注意:我已经尝试过针对脚本化管道的 withEnv[]
解决方案,但这似乎有同样的问题。
我找到了解决方法。
是使用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\""])
这将是有效的并且应该有效。
我正在尝试在 jenkins 管道脚本中动态设置环境变量。
我正在使用 .groovy 和 .jenkinsfile 脚本的组合来为管道生成尽可能干燥的阶段{}定义。
我有以下方法:
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} 以防它将此变量名称作为实际环境值)它们都 return null.
我想知道使此 environment{}
部分尽可能干/动态的最佳方法是什么?
如果有一个可以接受 environmentName=Value 对列表的可扩展解决方案,我会更喜欢它,因为这将是更一般的情况。
注意:我已经尝试过针对脚本化管道的 withEnv[]
解决方案,但这似乎有同样的问题。
我找到了解决方法。
是使用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\""])
这将是有效的并且应该有效。