跳转至

Jenkins 环境变量

认识 Jenkins 环境变量

Jenkins 环境变量就是通过 env 关键字暴露出来的全局变量,可以在 Jenkins 文件的任何位置使用

查看 Jenkins 系统内置环境变量

访问 ${YOUR_JENKINS_HOST}/env-vars.html 页面,比如 http://192.168.1.100:8080/env-vars.html

image-20240701162933283

1. 通过执行 printenv shell 命令来获取:
pipeline {
    agent any

    stages {
        stage("Env Variables") {
            steps {
                sh "printenv"
            }
        }
    }
}

读取 Jenkins 环境变量

env 是环境变量的关键字,但是读取 Jenkins 内置的这些环境变量,env 关键字是可有可无, 要使用 ${xxx} 包围起来。以 BUILD_NUMBER 这个内置环境变量举例来说明:

${env.BUILD_NUMBER} = ${BUILD_NUMBER}

Jenkins 文件中使用 shell 命令,使用这些内置环境变量可以不用 {} :

pipeline {
    agent any

    stages {
        stage("Read Env Variables") {
            steps {
                echo "带 env 的读取方式:${env.BUILD_NUMBER}" # 建议使用规范
                echo "不带 env 的读取方式:${BUILD_NUMBER}"
                sh 'echo "shell 中读取方式 $BUILD_NUMBER"'
            }
        }
    }
}

自定义 Jenkins 环境变量

Jenkins pipeline 分声明式(Declarative)和 脚本式(imperative)写法,相应的环境变量定义方式也略有不同,归纳起来有三种方式:

image-20240701164853814

举个例子:

pipeline {
    agent any

    environment {
        architecture = "Linux"
    }

    stages {
        stage("Custom Env Variables") {
            environment {
                NAME = "Datarc"
            }

            steps {
                echo "architecture = ${env.architecture}"
                echo "NAME = ${env.NAME}"

                script {
                    env.SCRIPT_VARIABLE = "Thumb Up"
                }

                echo "SCRIPT_VARIABLE = ${env.SCRIPT_VARIABLE}"

                withEnv(["WITH_ENV_VAR=Come On"]) {
                    echo "WITH_ENV_VAR = ${env.WITH_ENV_VAR}"
                }
            }
        }
    }
}

注意:withEnv(["WITH_ENV_VAR=Come On"]) {} 这里的 = 号两侧不能有空格,必须是 key=value 的形式

一个完整的 pipeline 通常会有很多个 stage,环境变量在不同的 stage 有不同的值,知道如何设置以及读取环境变量后,我们还需知道如何重写环境变量

重写 Jenkins 环境变量

Jenkins 重写环境变量,以下面这三条规则为例:

1. withEnv(["WITH_ENV_VAR=Come On"]) {} 内置函数的这种写法可以重写任意环境变量
2. 定义在 environment {} 的环境变量不能被脚本式定义的环境变量env.key="value"重写
3. 脚本式环境变量只能重写脚本式环境变量
pipeline {
    agent any

    environment {
        FOO = "这是 Linux 系统"
        NAME = "Datarc"
    }

    stages {
        stage("Env Variables") {
            environment {
                // 会重写第 6 行 变量
                NAME = "RGYB" 
                // 会重写系统内置的环境变量 BUILD_NUMBER
                BUILD_NUMBER = "10" 
            }

            steps {
                // 应该打印出 "FOO = 这是 Linux 系统"
                echo "FOO = ${env.FOO}" 
                // 应该打印出 "NAME = RGYB"
                echo "NAME = ${env.NAME}" 
                // 应该打印出 "BUILD_NUMBER = 10"
                echo "BUILD_NUMBER =  ${env.BUILD_NUMBER}" 

                script {
                    // 脚本式创建一个环境变量
                    env.SCRIPT_VARIABLE = "1" 
                }
            }
        }

        stage("Override Variables") {
            steps {
                script {
                    // 这里的 FOO 不会被重写,违背 Rule No.2
                    env.FOO = "Tara"
                    // SCRIPT_VARIABLE 变量会被重写,符合 Rule No.3
                    env.SCRIPT_VARIABLE = "2" 
                }

                // FOO 在第 37 行重写失败,还会打印出 "FOO = 这是 Linux 系统"
                echo "FOO = ${env.FOO}" 
                // 会打印出 "SCRIPT_VARIABLE = 2"
                echo "SCRIPT_VARIABLE = ${env.SCRIPT_VARIABLE}" 

                // FOO 会被重写,符合 Rule No.1
                withEnv(["FOO=Educated"]) { 
                    // 应该打印 "FOO = Educated"
                    echo "FOO = ${env.FOO}" 
                }

                // 道理同上
                withEnv(["BUILD_NUMBER=15"]) {
                    // 应该打印出 "BUILD_NUMBER = 15"
                    echo "BUILD_NUMBER = ${env.BUILD_NUMBER}"
                }
            }
        }
    }
}

Shell 结果赋值给环境变量

格式:

sh(script: 'cmd', returnStdout:true)

举个例子:

pipeline {
    agent any

    environment {
        // 使用 trim() 去掉结果中的空格
        LS_RESULT = "${sh(script:'ls -lah', returnStdout: true).trim()}"
    }

    stages {
        stage("Env Variables") {
            steps {
                echo "LS_RESULT = ${env.LS_RESULT}"
            }
        }
    }
}