- 首先要注意的是单引号,双引号,3单引号,3双引号的使用区别。
- 用def 在某个stage内定义的变量,仅在这个stage内有效。
- 要想定义的变量在每个stage内都有效,可以在script中使用VARIABLE_NAME=value来定,使用时也需要在script中,并使用双引号或者3双引号才行。使用单引号或者3单引号是不行的。示例见文末。
1 Jenkins内置的环境变量
Jenkins环境变量是通过env变量公开的全局变量,可以在Jenkins文件中的任何位置使用。存储在env变量中的任何值都存储为字符串类型。环境变量可以在pipeline 顶层、特定stage或script块内部设置。
获取方法1:
通过访问 ${YOUR_JENKINS_HOST}/env-vars.html 页可以查看所有可用的内置环境变量。
获取方法2:
pipeline {
agent any
stages {
stage("Env Variables") {
steps {
sh "printenv"
}
}
}
}
读取环境变量
您可以通过env对象以管道步骤访问环境变量,例如env.BUILD_NUMBER将返回当前的内部版本号。您也可以使用简写版本的内部版本号BUILD_NUMBER,但在这种变体中,可能会让某些用户感到困惑—不知道这个BUILD_NUMBER是来自于env。
pipeline {
agent any
stages {
stage("Env Variables") {
steps {
echo "The build number is ${env.BUILD_NUMBER}"
echo "You can also use \${BUILD_NUMBER} -> ${BUILD_NUMBER}"
sh 'echo "I can access $BUILD_NUMBER in shell command as well."'
}
}
}
}
设置环境变量
可以使用environment{}块、或者使用env.VARIABLE_NAME或使用withEnv([“VARIABLE_NAME=value”]){}块以声明方式设置环境变量。
pipeline {
agent any
environment {
FOO = "bar"
}
stages {
stage("Env Variables") {
environment {
NAME = "Alan"
}
steps {
echo "FOO = ${env.FOO}"
echo "NAME = ${env.NAME}"
script {
env.TEST_VARIABLE = "some test value"
}
echo "TEST_VARIABLE = ${env.TEST_VARIABLE}"
withEnv(["ANOTHER_ENV_VAR=here is some value"]) {
echo "ANOTHER_ENV_VAR = ${env.ANOTHER_ENV_VAR}"
}
}
}
}
}
重写/设置环境变量(这里的规则需要注意)
-
withEnv ([“env=value”]) {}块可以覆盖任何环境变量。但也只是在紧接着的大括号内有效{}。在大括号外无效。value可以使用变量。注意withEnv不能方在sh里,因为它不是一个shell命令。
-
无法使用命令env.VAR=“value”赋值重写使用environment{}块设置的变量。
-
命令式env.VAR=“value”赋值只能覆盖使用命令式赋值创建的环境变量。
pipeline {
agent any
environment {
FOO = "bar"
NAME = "Joe"
}
stages {
stage("Env Variables") {
environment {
NAME = "Alan" // overrides pipeline level NAME env variable
BUILD_NUMBER = "2" // overrides the default BUILD_NUMBER
}
steps {
echo "FOO = ${env.FOO}" // prints "FOO = bar"
echo "NAME = ${env.NAME}" // prints "NAME = Alan"
echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" // prints "BUILD_NUMBER = 2"
script {
env.SOMETHING = "1" // creates env.SOMETHING variable
}
}
}
stage("Override Variables") {
steps {
script {
env.FOO = "IT DOES NOT WORK!" // it can't override env.FOO declared at the pipeline (or stage) level
env.SOMETHING = "2" // it can override env variable created imperatively
}
echo "FOO = ${env.FOO}" // prints "FOO = bar"
echo "SOMETHING = ${env.SOMETHING}" // prints "SOMETHING = 2"
withEnv(["FOO=foobar"]) { // it can override any env variable
echo "FOO = ${env.FOO}" // prints "FOO = foobar"
}
withEnv(["BUILD_NUMBER=1"]) {
echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" // prints "BUILD_NUMBER = 1"
}
}
}
}
}
全局环境变量
要想定义的变量在每个stage内都有效,可以在script中使用VARIABLE_NAME=value来定义变量,使用时也需要在script中,并使用双引号或者3双引号才行。使用单引号或者3单引号是不行的。
pipeline {
agent { label 'any' }
environment {
ZIP_NODE = "xyz.zip"
}
stages {
stage ('test1') {
steps {
script {
ZIP_NODE = "abc.zip"
}
}
}
stage ('test2') {
steps {
script{
echo "${ZIP_NODE}" #打印结果abc.zip,在script 内,sh外,双引号,打印的是被赋值后的全局变量
sh """
echo ${ZIP_NODE} #打印结果abc.zip,在script内sh 内,3双引号,打印的是被赋值后的全局变量
"""
sh '''
echo ${ZIP_NODE} #打印结果xyz.zip, 3单引号打印出来的是environment中设置的变量值
'''
}
}
}
}
}
全局变量传递给sharedlibraries
上一步中的script中定义的变量虽然可以跨stage使用。但是在sharedlibraries中是不能直接使用的。这里我们通过一种变通的方法解决:
通过以下方法用script中定义的变量值创建一个env的变量。
env.SOMETHING = "1" // creates env.SOMETHING variable
用一个script中定义的变量创建一个环境变量。再将env传给sharedlibraries的方法。在sharedlibraries中就能通过env.SOMETHING 得到这个全局变量的值了。
pipeline中:
script {
env.SOMETHING = "${ZIP_NODE}"
}
sharedlibraries中:
${env.SOMETHING} 得到的是${ZIP_NODE}的值