环境变量可以被看作是pipeline与Jenkins交互的媒介。比如,可以在pipeline中通过BUILD_ NUMBER变量知道构建任务的当前构建次数。环境变量可以分为Jenkins内置变量和自定义变量。
在pipeline执行时,Jenkins通过一个名为env的全局变量,将Jenkins内置环境变量暴露出来。其使用方法有多种,示例如下:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo "Running ${env.BUILDNUMBER} on ${env.JENKINS_URL}" # 方法1
echo "Running $env.BUILDNUMBER on $env.JENKINS_URL" # 方法2
echo "Running ${BUILDNUMBER} on ${JENKINS_URL}" # 方法3 不推荐,难排查
}
}
}
}
默认env的属性可以直接在pipeline中引用。所以,以上方法都是合法的。但是不推荐方法三,因为出现变量冲突时,非常难查问题。
那么,env变量都有哪些可用属性呢?通过访问<Jenkins master的地址>/pipeline-syntax/globals#env
来获取完整列表。在列表中,当一个变量被声明为"For a multibranch project"时,代表只有多分支项目才会有此变量。
image.png
下面我们简单介绍几个在实际工作中经常用到的变量。
在使用env变量时,需要注意不同类型的项目,env变量所包含的属性及其值是不一样的。比如普通pipeline任务中的GIT BRANCH变量的值为origin/master,而在多分支pipeline任务中GIT BRANCH变量的值为master。 所以,在pipeline中根据分支进行不同行为的逻辑处理时,需要留意。
pipeline {
agent any
environment {
# 覆盖默认的PATH变量值
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
name='jack'
}
stages {
stage("test env") {
steps {
sh "printenv" #调试,打印所有env变量
echo "${name}" # jack
echo "${env.name}" # jack
}
}
}
}
environment指令可以用在pipeline中定义,作用域就是整个pipeline,当定义在stage阶段,只在当前stage有效。
environment {
__server_name = 'email-server'
__version = "${BUILD_NUMBER}"
__artifact_name = "${__server_name}-${__version}.jar"
}
小技巧 :
sh 'printenv'
将所有env变量打印出来。__server_name
,__就是前缀。
自定义全局环境变量会被加入env属性列表中,所以使用时可以直接用${env.g_name}
引用。