• 首先要注意的是单引号,双引号,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}的值
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐