![Jenkins 2.x实践指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/830/25449830/b_25449830.jpg)
4 环境变量与构建工具
4.1 环境变量
环境变量可以被看作是pipeline与Jenkins交互的媒介。比如,可以在pipeline中通过BUILD_NUMBER变量知道构建任务的当前构建次数。环境变量可以分为Jenkins内置变量和自定义变量。接下来我们分别讨论。
4.1.1 Jenkins内置变量
在pipeline执行时,Jenkins通过一个名为env的全局变量,将Jenkins内置环境变量暴露出来。其使用方法有多种,示例如下:
![](https://epubservercos.yuewen.com/29EDEB/13898202705417506/epubprivate/OEBPS/Images/51_1.jpg?sign=1738865714-467yWX9N2gzFG9MWGKZuWQXgrMSJKyMi-0-ac02b4eaff6e230795b5e71fb008d04b)
默认env的属性可以直接在pipeline中引用。所以,以上方法都是合法的。但是不推荐方法三,因为出现变量冲突时,非常难查问题。
那么,env变量都有哪些可用属性呢?通过访问<Jenkins master的地址>/pipeline-syntax/globalsenv来获取完整列表。在列表中,当一个变量被声明为“For a multibranch project”时,代表只有多分支项目才会有此变量。
下面我们简单介绍几个在实际工作中经常用到的变量。
• BUILD_NUMBER:构建号,累加的数字。在打包时,它可作为制品名称的一部分,比如server-2.jar。
• BRANCH_NAME:多分支pipeline项目支持。当需要根据不同的分支做不同的事情时就会用到,比如通过代码将release分支发布到生产环境中、master分支发布到测试环境中。
• BUILD_URL:当前构建的页面URL。如果构建失败,则需要将失败的构建链接放在邮件通知中,这个链接就可以是BUILD_URL。
• GIT_BRANCH:通过git拉取的源码构建的项目才会有此变量。
在使用env变量时,需要注意不同类型的项目,env变量所包含的属性及其值是不一样的。比如普通pipeline任务中的GIT BRANCH变量的值为origin/master,而在多分支pipeline任务中GIT BRANCH变量的值为master。
所以,在pipeline中根据分支进行不同行为的逻辑处理时,需要留意。
小技巧:在调试pipeline时,可以在pipeline的开始阶段加一句:sh'printenv',将env变量的属性值打印出来。这样可以帮助我们避免不少问题。
4.1.2 自定义pipeline环境变量
当pipeline变得复杂时,我们就会有定义自己的环境变量的需求。声明式pipeline提供了environment指令,方便自定义变量。比如:
![](https://epubservercos.yuewen.com/29EDEB/13898202705417506/epubprivate/OEBPS/Images/52_1.jpg?sign=1738865714-kUrthNoQnuuOXywpzXOrgMpiYXtmsrBL-0-222bab9a69f9e380b98472a3a299a8cb)
![](https://epubservercos.yuewen.com/29EDEB/13898202705417506/epubprivate/OEBPS/Images/53_1.jpg?sign=1738865714-SnjSPit3JcMGGMeFVDEGFzGu30rYuBWe-0-8eda658ba2a295757cd6f8ce253b45c9)
另外,environment指令可以在pipeline中定义,代表变量作用域为整个pipeline;也可以在stage中定义,代表变量只在该阶段有效。
但是这些变量都不是跨pipeline的,比如pipeline a访问不到pipeline b的变量。在pipeline之间共享变量可以通过参数化pipeline来实现。我们将在第8章中进行讨论。
在实际工作中,还会遇到一个环境变量引用另一个环境变量的情况。在environment中可以这样定义:
![](https://epubservercos.yuewen.com/29EDEB/13898202705417506/epubprivate/OEBPS/Images/53_2.jpg?sign=1738865714-MytMKnYwELyi1t3sJzUlylZzXj2QEb6Q-0-a85f109033a5f1d97004235078939a11)
值得注意的是,如果在environment中定义的变量与env中的变量重名,那么被重名的变量的值会被覆盖掉。比如在environment中定义PATH变量(PATH也是env中的一个变量)。
![](https://epubservercos.yuewen.com/29EDEB/13898202705417506/epubprivate/OEBPS/Images/53_3.jpg?sign=1738865714-zeHBKShnciqabZxvtdMeNU73QL0diltu-0-d21cd252dfeb6ef709ffbdce7a1cd811)
在执行sh指令时,我们将看到无法在系统上执行。
![](https://epubservercos.yuewen.com/29EDEB/13898202705417506/epubprivate/OEBPS/Images/53_4.jpg?sign=1738865714-0ujSJXN9lpjY7P2LUc2FcUu7vbTzjjUC-0-557e62d3403aa95d9d0d8d40a50337cf)
小技巧:为避免变量名冲突,读者可根据所在公司的实际情况,在变量名前加上前缀,比如__server_name,__就是前缀。
4.1.3 自定义全局环境变量
env中的变量都是Jenkins内置的,或者是与具体pipeline相关的。有时候,我们需要定义一些全局的跨pipeline的自定义变量。
进入Manage Jenkins→Configure System→Global properties页,勾选“Environment variables”复选框,单击“Add”按钮,在输入框中输入变量名和变量值即可,如图4-1所示。
![](https://epubservercos.yuewen.com/29EDEB/13898202705417506/epubprivate/OEBPS/Images/54_1.jpg?sign=1738865714-JpWk8sc2LbwlGcRMWGOEZnbvCg7MgJPA-0-d491eebe5dd7209a5d176a6428046d91)
图4-1 添加自定义全局变量
通过单击“Add”按钮,还可以添加多个全局环境变量。
自定义全局环境变量会被加入 env 属性列表中,所以,使用自定义全局环境变量与使用Jenkins内置变量的方法无异:${env.g name}。