我的项目有许多其他项目的公共变量,所以我使用 Jenkins 共享库并创建了一个vars/buildMeta.groovy
文件,我在其中定义了我的变量(一些sh
解析函数),并在环境阶段使用它们(var1,var2):
pipeline {
environment {
// initialize common vars
var1 = buildMeta.getVar1()
var2 = buildMeta.getVar2()
varA = var1 + "some_string"
varB = var2 + "some_other_string"
} // environment
stages {
stage('Some Stage') {
// ...
}
}
post {
always {
script {
// Print environment variables
sh "env"
} // script
} // always
} // post
} // pipeline
我决定将 , 导出varA
到varB
共享vars/my_vars.groovy
并从那里使用它们(当我必须使用var1
, var2
vars 传输配置映射时)。
class my_vars {
static Map varMap = [:]
static def loadVars (Map config) {
varMap.varA = config.var1 + "some_string"
varMap.varB = config.var2 + "some_other_string"
// Many more variables ...
return varMap
}
}
问题是,为了将这些变量声明为环境变量,我使用了这种方式:
pipeline {
my_vars.loadVars().each { key, value ->
env[key] = value
}
environment {
// initialize common vars
var1 = buildMeta.getVar1()
var2 = buildMeta.getVar2()
} // environment
stages {
stage('Some Stage') {
// ...
}
}
// ...
} // pipeline
但是这样buildMeta vars(var1,var2)还没有定义,所以我无法正确初始化my_vars.loadVars()
调用。另一方面,我无法复制这些buildMeta.groovy
功能,my_vars.loadVars()
因为前者有sh
用法,而对后者的调用未在阶段(脚本)下定义。
我可以通过将所有这些函数调用放在一个单独的阶段(比如说“加载变量”阶段)来解决所有这些问题,但我真的想避免那个虚拟阶段。最好的做法是什么?
谢谢!