前言Jenkins,DevOps技术栈的核心之一,CI/CD离不开编写Pipeline脚本,入门Jenkins,简单查看文档,你应该不代理,如果stages、steps等关键字搞混了,pipeline的骨架可以快速搭建,但是在用内容填充骨架的时候,尤其是环境变量(系统内置|自定义)怎么用,大部分人都会变得困惑。浪费了很多时间,这篇文章帮你快速清除环境变量准备如果你想一边看这篇文章一边练习,但是没有可用的Jenkins服务,又想快速试用,可以使用Docker快速搭建Jenkins服务dockercontainerrun--rm-p8080:8080-p50000:50000--name=jenkins-v$(pwd):/var/jenkins_homejenkins/jenkins2021,没有本地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,每个变量的用途是写的很清楚方法2是通过执行printenvshell命令得到的:pipeline{agentanystages{stage("EnvVariables"){steps{sh"printenv"}}}}DirectSave-Build,你会在终端日志中看到相应的环境变量,可以快速的看到它们当前的值。通常这两种方法可以结合使用。读取环境变量。上面我们说了env是环境变量的关键字,但是要读取Jenkins内置的这些环境变量,env关键字是可选的,但是不能没有内衣,必须用${xxx}包围以内置环境变量BUILD_NUMBER为例来说明:如果在Jenkins文件中使用shell命令,即使没有{}也可以使用这些内置环境变量,看一下:pipeline{agentanystages{stage("ReadEnvVariables"){steps{echo"带env的读法:${env.BUILD_NUMBER}"echo"不带env的读法:${BUILD_NUMBER}"sh'echo"shell读法$BUILD_NUMBER"'}}}}可以看到结果都是一样的,不管有多少种,记住第一个最安全的内置环境变量是好的,但是不能完全满足我们自定义管道的执行逻辑,所以我们还需要知道如何定义并使用它。自定义环境变量CustomizeJenkinsenvironmentvariablesJenkinspipeline分为声明式和脚本式(命令式),对应的环境变量定义方式也略有不同。总结起来就是三种方式:我们来看一个实际的例子:env.FOO}"echo"NAME=${env.NAME}"script{env.SCRIPT_VARIABLE="ThumbUp"}echo"SCRIPT_VARIABLE=${env.SCRIPT_VARIABLE}"withEnv(["WITH_ENV_VAR=ComeOn"]){echo"WITH_ENV_VAR=${env.WITH_ENV_VAR}"}}}}}comeon运行结果:注意:withEnv(["WITH_ENV_VAR=ComeOn"]){}这里=号两边不能有空格,必须成为关键=v一个alue形式的完整流水线通常会有很多阶段。环境变量在不同阶段有不同的值是很常见的。在知道了如何设置和读取环境变量之后,我们还需要知道如何重写环境变量。重写Jenkins环境变量Jenkins最让人迷惑的地方就是重写环境变量,不过只要记住以下三个规则,就可以搞定withEnv(["WITH_ENV_VAR=ComeOn"]){}这种写法内置-在函数中,您可以重写任何环境变量。环境{}中定义的环境变量不能被脚本定义的环境变量(env.key="value")改写。脚本型环境变量只能改写脚本型环境变量。这三点是Hardrules,没有被这三点限制的都是允许的。这三个规则有点让人不知所措。农民选择豆类种子。让我们举个例子来证明。pipeline{agentanyenvironment{FOO="YoushouldlikeabirdYourmountain"NAME="Tan"}stages{stage("EnvVariables"){environment{//将重写第6行的变量NAME="RGYB"//将重写内置环境变量BUILD_NUMBERBUILD_NUMBER="10"}steps{//Shouldprint"FOO=Youshouldflytoyourmountainlikeabird"echo"FOO=${env.FOO}"//Shouldprint"NAME=RGYB"echo"NAME=${env.NAME}"//应该打印出"BUILD_NUMBER=10"echo"BUILD_NUMBER=${env.BUILD_NUMBER}"script{//创建环境变量的脚本env.SCRIPT_VARIABLE="1"}}}stage("OverrideVariables"){steps{script{//这里的FOO不会被重写,违反了RuleNo.2env.FOO="Tara"//SCRIPT_VARIABLE变量会被改写成符合RuleNo.3env.SCRIPT_VARIABLE="2"}//FOO在第37行改写失败,会打印出"FOO=Youshouldflytoyourmountainlikeabird"echo"FOO=${env.FOO}"//将打印出"SCRIPT_VARIABLE=2"echo"SCRIPT_VARIABLE=${env.SCRIPT_VARIABLE}"//FOO将被重写以符合RuleNo.1withEnv(["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来处理。没有办法应用布尔值吗?Jenkins中使用布尔值。如果你设置Ifavariableisfalse,Jenkins会将其转换为“false”。如果要使用Boolean进行条件判断,必须调用toBoolean()方法进行转换pipeline{agentanyenvironment{IS_BOOLEAN=false}stages{stage("EnvVariables"){steps{script{//Hello会被打印出来,因为非-空字符串将被认为是Boolean.Trueif(env.IS_BOOLEAN){echo"Hello"}//True布尔比较if(env.IS_BOOLEAN.toBoolean()==false){echo"RigongYibing"}//TrueBooleanif(!env.IS_BOOLEAN.toBoolean()){echo"RGYB"}}}}}}看运行结果:如果你写读完Pipeline,你就会知道写Pipeline离不开写shell。有时,您需要将shell的执行结果赋值给一个环境变量。Jenkins还有一种方法可以支持将shell结果赋值给环境变量。这个方法很简单。只需要记住一个格式:sh(script:'cmd',returnStdout:true)pipeline{agentanyenvironment{//使用trim()去除结果中的空格LS_RESULT="${sh(script:'ls-lah',returnStdout:true).trim()}"}stages{stage("EnvVariables"){steps{echo"LS_RESULT=${env.LS_RESULT}"}}}}关于Jenkins[1]环境变量的总结,理解这些基本就是了足以覆盖大部分应用场景。再次遇到环境变量问题,可以回头看看。有什么困惑吗?参考[1]Jenkins环境定义指南:https://e.printstacktrace.blog/jenkins-pipeline-environment-variables-the-definitive-guide/本文转载自微信公众号“日工一冰”,可以通过以下二维码关注和转载本文,请联系日工艺兵公众号。
