欢迎来到“Jenkins CookBook”系列的第一篇博客文章。今天,我们专注于有效地使用Jenkins Pipeline环境变量。您将学习如何定义env变量,如何更新它们,以及如何在布尔表达式中正确使用它们。

主要内容

  • 列出环境变量
  • 读取环境变量
  • 设置环境变量
  • 将布尔值存储在环境变量中
  • sh在env环境变量中获取输出

列出环境变量

让我们首先列出所有可用的环境变量。您可以通过两种不同的方法进行操作。您可以${YOUR_JENKINS_HOST}/env-vars.html在Jenkins主服务器上打开页面,以获取HTML页面上列出的所有环境变量的列表。

jenkins pipeline配置节点 jenkins pipeline 环境变量_Jenkins

另外,您可以通过执行printenvshell命令列出所有环境变量。

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

注意:使用printenv | sort命令组合来获取环境变量的排序列表可能很有用。

jenkins pipeline配置节点 jenkins pipeline 环境变量_Jenkins_02


读取环境变量

您可以在通过env对象的管道步骤中访问环境变量,例如,env.BUILD_NUMBER将返回当前的内部版本号。您也可以使用简写版本BUILD_NUMBER,但是在此变体中,这可能会使某些用户感到困惑-它缺少BUILD_NUMBER来自环境变量的上下文。

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."'            }        }    }}

jenkins pipeline配置节点 jenkins pipeline 环境变量_ide_03


设置环境变量

可以使用environment { }block 来声明性地设置环境变量,必须使用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}"                }            }        }    }}

jenkins pipeline配置节点 jenkins pipeline 环境变量_环境变量_04

覆盖环境变量

Jenkins Pipeline支持覆盖环境变量。您需要注意一些规则。

  • 该withEnv(["env=value]) { }块可以覆盖任何环境变量。
  • 使用environment {}块设置的变量不能使用命令式env.VAR = "value"赋值覆盖。
  • 命令式env.VAR = "value"分配只能覆盖使用命令式创建的环境变量。

这是一个示例性的Jenkinsfile,显示了所有三种不同的用例。

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"                }            }        }    }}

jenkins pipeline配置节点 jenkins pipeline 环境变量_Jenkins_05


将布尔值存储在环境变量中

关于使用环境变量,存在一种普遍的误解。存储为环境变量的每个值都将转换为String。当您存储布尔false值时,它将转换为"false"。如果要在布尔表达式中正确使用该值,则需要调用"false".toBoolean()method。

pipeline {    agent any    environment {        IS_BOOLEAN = false    }    stages {        stage("Env Variables") {            steps {                script {                    if (env.IS_BOOLEAN) {                        echo "You can see this message, because "false" String evaluates to Boolean.TRUE value"                    }                    if (env.IS_BOOLEAN.toBoolean() == false) {                        echo "You can see this message, because "false".toBoolean() returns Boolean.FALSE value"                    }                }            }        }    }}

jenkins pipeline配置节点 jenkins pipeline 环境变量_环境变量_06


使用SH捕获变量

您还可以将shell命令的输出捕获为环境变量。请记住,您需要使用sh(script: 'cmd', returnStdout:true)格式来强制sh步骤返回输出,以便可以捕获它并将其存储在变量中。

pipeline {    agent any    environment {        LS = "${sh(script:'ls -lah', returnStdout: true)}"    }    stages {        stage("Env Variables") {            steps {                echo "LS = ${env.LS}"            }        }    }}

jenkins pipeline配置节点 jenkins pipeline 环境变量_ide_07


jenkins pipeline配置节点 jenkins pipeline 环境变量_ide_08