vlambda博客
学习文章列表

如何自定义jenkins环境变量

这篇文章主要介绍如何自定义jenkins的环境变量


前段时间在使用jenkins 的pipeline的时候遇到一个问题,有两个stage,其中stage1主要实现的功能是获取代码文件的版本信息,获取版本是使用了一段shell脚本实现的,如下

# 获取版本号的脚本@NonCPSString 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.脚本式环境变量只能重写脚本式环境变量



总结一下:遇到问题后,找到根本问题往往会加速问题的解决。