如何自定义jenkins环境变量
这篇文章主要介绍如何自定义jenkins的环境变量
前段时间在使用jenkins 的pipeline的时候遇到一个问题,有两个stage,其中stage1主要实现的功能是获取代码文件的版本信息,获取版本是使用了一段shell脚本实现的,如下
# 获取版本号的脚本
String extractLines(final String content) {
String myKeys = " "
content.eachLine { line ->
if(line =~ "server.version="){
echo "version = ${line}"
// myKeys << line
myKeys = "${line}"
myKeys =myKeys.replace("server.version=","")
// echo "version = myKeys"
return myKeys
}
}
return myKeys
最终把获取到的版本信息赋值给一个变量(例如version),然后结合一些指定值(例如时间戳BUILD_TIMESTAMP)拼接成docker镜像名称(例如docker_image= ${version}_${BUILD_TIMESTAMP}这种形式),
stage("获取版本号拼接镜像名") {
steps {
script {
checkout(拉取代码的流水线脚本)
final String content = readFile(file: "包含版本号的文件路径")
# 调用上面获取version的脚本
final String version = extractLines(content)
echo "version = ${version}"
docker_image="${myKeys}_${BUILD_TIMESTAMP}"
echo "docker_image = ${docker_image}"
}
}
}
stage2主要实现的是打包功能,这个打包的job需要用到stage1中拼接好的镜像名(即docker_image)。
测试了很多次发现只能将BUILD_TIMESTAMP值传到stage2,而version传递不过去,然后根据日志信息百度谷歌无果,后来仔细想了想,这种问题应该和jenkins中的变量定义方式或者作用域有关系。然后顺着这个思路继续往下走,最后成功解决上述问题。
先贴一下解决后的脚本,在docker_image变量前面加env,声明为环境变量,然后变量就可以顺利传递到stage2中使用了。
stage("获取版本号拼接镜像名") {
steps {
script {
checkout(拉取代码的流水线脚本)
final String content = readFile(file: "包含版本号的文件路径")
# 调用上面获取version的脚本
final String version = extractLines(content)
echo "version = ${version}"
env.docker_image="${myKeys}_${BUILD_TIMESTAMP}"
echo "docker_image = ${docker_image}"
}
}
}
再总结一下解决问题过程中了解到的jenkins自定义环境变量的三种方式
# 第一种是声明式
environment {
key = value
}
# 第二种是脚本式
env.key=value
# 第三种是内置函数式
withEnv(["key=value"]){}
我是用的是第二种脚本式解决的
另外,三种自定义环境变量的方式有三条规则需要注意
1.withEnv(["WITH_ENV_VAR=Come On"]) {} 内置函数的这种写法,可以重写任意环境变量
2.定义在 environment {} 的环境变量不能被脚本式定义的环境变量(env.key="value")重写
3.脚本式环境变量只能重写脚本式环境变量
总结一下:遇到问题后,找到根本问题往往会加速问题的解决。