前言
Jenkins, DevOps 技术栈的外围之一,CI/CD 离不开编写 Pipeline 脚本,上手 Jenkins ,简略查一下文档,你就应该不会被 agent,stages,step 这类关键词弄懵,也能很快构建出 pipeline 的骨架
然而当向骨架中填充内容的时候,尤其如何利用环境变量(零碎内置 | 自定义),少数人都会变得比拟凌乱,节约很多工夫,本文就帮忙大家疾速通关环境变量
筹备
如果你想一边浏览本文,一边实际,然而没有 Jenkins 服务可用,又想疾速尝试,能够利用 Docker 一个命令疾速搭建 Jenkins 服务
<code class="shell">docker container run --rm -p 8080:8080 -p 50000:50000 --name=jenkins -v $(pwd):/var/jenkins_home jenkins/jenkins
2021 年了,本地没有 Docker 说不过去了,过去瞧瞧 Docker 系列是否入得了你的法眼?
关上浏览器输出:localhost:8080
- 找到终端的长期明码登陆
- 装置举荐的依赖
- 创立新的 Pipeline 类型的 Item
- 点击左侧 Config,而后在页面底部 Pipeline 局部输出咱们接下来写的脚本进行测试就好了
就是这么简略…..
意识 Jenkins 环境变量
Jenkins 环境变量就是通过
env
关键字裸露进去的全局变量,能够在 Jenkins 文件的任何地位应用
其实和你应用的编程语言中的全局变量没有本质差异
查看 Jenkins 零碎内置环境变量
Jenkins 在零碎内置了很多环境变量不便咱们疾速应用,查看起来有两种形式:
形式一:
间接在浏览器中拜访 ${YOUR_JENKINS_HOST}/env-vars.html
页面就能够,比方 http://localhost:8080/env-vars.html
,每个变量的用处写的都很分明
形式二
通过执行 printenv
shell 命令来获取:
<code class="groovy">pipeline { agent any stages { stage("Env Variables") { steps { sh "printenv" } } } }
间接 Save – Build, 在终端 log 中你会看到相应的环境变量,并且能够疾速看到他们以后的值
通常这两种形式能够联合应用
读取环境变量
下面咱们说了 env
是环境变量的关键字,然而读取 Jenkins 内置的这些环境变量,env
关键字是可有可无, 但不能没了底裤,都要应用 ${xxx}
包围起来。以 BUILD_NUMBER
这个内置环境变量举例来说明就是这样滴:
如果你在 Jenkins 文件中应用 shell 命令,应用这些内置环境变量甚至能够不必 {}
, 来看一下:
<code class="groovy">pipeline { agent any stages { stage("Read Env Variables") { steps { echo "带 env 的读取形式:${env.BUILD_NUMBER}" echo "不带 env 的读取形式:${BUILD_NUMBER}" sh 'echo "shell 中读取形式 $BUILD_NUMBER"' } } } }
能够看到后果是一样一样滴,不论有几种,记住第一种最稳当
内置的环境变量虽好,但也不能齐全满足咱们自定义的 pipeline 的执行逻辑,所以咱们也得晓得如何定义以及应用自定义环境变量
自定义 Jenkins 环境变量
Jenkins pipeline 分申明式(Declarative)和 脚本式(imperative)写法,相应的环境变量定义形式也略有不同,归纳起来有三种形式:
还是看个理论例子吧:
<code class="groovy">pipeline { agent any environment { FOO = "bar" } stages { stage("Custom Env Variables") { environment { NAME = "RGYB" } steps { echo "FOO = ${env.FOO}" echo "NAME = ${env.NAME}" script { env.SCRIPT_VARIABLE = "Thumb Up" } echo "SCRIPT_VARIABLE = ${env.SCRIPT_VARIABLE}" withEnv(["WITH_ENV_VAR=Come On"]) { echo "WITH_ENV_VAR = ${env.WITH_ENV_VAR}" } } } } }
来看运行后果:
留神:
withEnv(["WITH_ENV_VAR=Come On"]) {}
这里的 = 号两侧不能有空格,必须是key=value
的模式
一个残缺的 pipeline 通常会有很多个 stage,环境变量在不同的 stage 有不同的值是很常见的,晓得如何设置以及读取环境变量后,咱们还得晓得如何重写环境变量
重写 Jenkins 环境变量
Jenkins 让人绝对困惑最多的中央就是重写环境变量,然而只有记住上面这三条规定,就能够搞定所有了
withEnv(["WITH_ENV_VAR=Come On"]) {}
内置函数的这种写法,能够重写任意环境变量- 定义在
environment {}
的环境变量不能被脚本式定义的环境变量(env.key="value"
)重写 - 脚本式环境变量只能重写脚本式环境变量
这三点是硬规定,没涵盖在这 3 点规定之内的也就是被容许的了
三条规定就有点让人头大了,农夫选豆种,举例为证吧
<code class="groovy">pipeline { agent any environment { FOO = "你当像鸟飞往你的山" NAME = "Tan" } stages { stage("Env Variables") { environment { // 会重写第 6 行 变量 NAME = "RGYB" // 会重写零碎内置的环境变量 BUILD_NUMBER BUILD_NUMBER = "10" } steps { // 应该打印出 "FOO = 你当像鸟飞往你的山" echo "FOO = ${env.FOO}" // 应该打印出 "NAME = RGYB" echo "NAME = ${env.NAME}" // 应该打印出 "BUILD_NUMBER = 10" echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" script { // 脚本式创立一个环境变量 env.SCRIPT_VARIABLE = "1" } } } stage("Override Variables") { steps { script { // 这里的 FOO 不会被重写,违反 Rule No.2 env.FOO = "Tara" // SCRIPT_VARIABLE 变量会被重写,合乎 Rule No.3 env.SCRIPT_VARIABLE = "2" } // FOO 在第 37 行重写失败,还会打印出 "FOO = 你当像鸟飞往你的山" echo "FOO = ${env.FOO}" // 会打印出 "SCRIPT_VARIABLE = 2" echo "SCRIPT_VARIABLE = ${env.SCRIPT_VARIABLE}" // FOO 会被重写,合乎 Rule No.1 withEnv(["FOO=Educated"]) { // 应该打印 "FOO = Educated" echo "FOO = ${env.FOO}" } // 情理同上 withEnv(["BUILD_NUMBER=15"]) { // 应该打印出 "BUILD_NUMBER = 15" echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" } } } } }
来验证一下后果吧
看到这,根本的设置应该就没有什么问题了,置信你也发现了,Jenkins 设置环境变量和编程语言的那种设置环境变量还是略有不同的,后者能够将变量赋值为对象,但 Jenkins 就不行,因为在 Jenkins 文件中,所有设置的值都会被当成 String, 难道没方法利用 Boolean 值吗?
Jenkins 中应用 Boolean 值
如果设置一个变量为 false
,Jenkins 就会将其转换为 "false"
, 如果想应用 Boolean 来做条件判断,必须要调用 toBoolean()
办法做转换
<code class="groovy">pipeline { agent any environment { IS_BOOLEAN = false } stages { stage("Env Variables") { steps { script { // Hello 会被打印进去,因为非空字符串都会被认为是 Boolean.True if (env.IS_BOOLEAN) { echo "Hello" } // 真正的 Boolean 比拟 if (env.IS_BOOLEAN.toBoolean() == false) { echo "日拱一兵" } // 真正的 Boolean if (!env.IS_BOOLEAN.toBoolean()) { echo "RGYB" } } } } } }
来看运行后果:
如果你写过 Pipeline,你肯定会晓得,写 Pipeline 是离不开写 shell 的,有些时候,须要将 shell 的执行后果赋值给环境变量,Jenkins 也有办法反对
Shell 后果赋值给环境变量
实来源gao($daima.com搞@代@#码网现这种形式很简略,只须要记住一个格局:sh(script: 'cmd', returnStdout:true)
<code class="groovy">pipeline { agent any environment { // 应用 trim() 去掉后果中的空格 LS_RESULT = "${sh(script:'ls -lah', returnStdout: true).trim()}" } stages { stage("Env Variables") { steps { echo "LS_RESULT = ${env.LS_RESULT}" } } } }
总结
对于 Jenkins 环境变量,理解这些基本上就满足绝大多数利用场景了,当再遇到环境变量问题时,能够回过来翻看一下了,有解决的困惑吗?
日拱一兵 | 原创