• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

Jenkins Pipeline 环境变量 的 查看,读取,设置,覆盖

1. 列出环境变量

首先列出所有可用的环境变量。您可以通过两种不同的方法进行操作。

1.1  ${YOUR_JENKINS_HOST}/env-vars.html

Jenkins 服务器上打开页面  ${YOUR_JENKINS_HOST}/env-vars.html,列出的所有环境变量的列表。

1.2 使用 shell 命令

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

pipeline {
    agent any
    stages {
        stage("Env Variables") {
            steps {
                sh "printenv"  //也可以使用 printenv | sort 进行排序
            }
        }
    }
}

2. 读取环境变量

您可以在 pipeline steps 中通过 env 对象来访问 环境变量

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

输出结果

image.png

3.设置环境变量

可以 environment { } 块中、script 中命令式、或者 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}"
                }
                
            }
        }
    }
}

输出结果

image.png

4.覆盖环境变量

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

  1. withEnv(["env=value]) { } 块可以覆盖任何环境变量。

  2. 命令式 env.VAR = "value" 不能覆盖 environment { } 块 中设置的环境变量

  3. 命令式 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"
                }
                
            }
        }
    }
}

输出结果

image.png

5.将Boolean值存储在环境变量中

因为存储为环境变量的每个值都将转换为 String。当您存储布尔 false 值时,它将转换为 "false"。如果要在布尔表达式中正确使用该值,则需要调用 "false".toBoolean() 方法

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

输出结果

image.png

6.将 shell 输出赋给环境变量

您还可以将 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}"
            }
        }
    }
    
}

输出结果: 

image.png


翻译自:Jenkins Pipeline Environment Variables - The Definitive Guide

0
0
下一篇:阿里云 pod 间不能通过 ingress 的域名 进行访问 解析

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。