如何自定义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 << linemyKeys = "${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.脚本式环境变量只能重写脚本式环境变量
总结一下:遇到问题后,找到根本问题往往会加速问题的解决。
