天天看點

Jenkins Pipeline 環境變量使用指南

你是否遇到過因環境變量問題導緻調試流水線很長時間?這篇文章一定能解決你的問題。

今天,我們專注于有效地使用Jenkins Pipeline環境變量。您将學習如何定義env變量,如何更新它們,以及如何在布爾表達式中正确使用它們。

主要内容

  • 列出環境變量
  • 讀取環境變量
  • 設定環境變量
  • 将布爾值存儲在環境變量中
  • sh在env環境變量中擷取輸出

1

讓我們首先列出所有可用的環境變量。您可以通過兩種不同的方法進行操作。您可以${YOUR_JENKINS_HOST}/env-vars.html在Jenkins主伺服器上打開頁面,以擷取HTML頁面上列出的所有環境變量的清單。

Jenkins Pipeline 環境變量使用指南

另外,您可以通過執行printenvshell指令列出所有環境變量。

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

注意:使用printenv | sort指令組合來擷取環境變量的排序清單可能很有用。

Jenkins Pipeline 環境變量使用指南

2

您可以在通過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 環境變量使用指南

3

可以使用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 環境變量使用指南

4

覆寫環境變量

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 環境變量使用指南

5

關于使用環境變量,存在一種普遍的誤解。存儲為環境變量的每個值都将轉換為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 環境變量使用指南

6

使用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 環境變量使用指南

繼續閱讀