虚拟化容器,大数据,DBA,中间件,监控。

Jenkins Pipeline 10 环境变量使用指南

21 12月
作者:admin|分类:系统运维

你是否遇到过因环境变量问题导致调试流水线很长时间?这篇文章一定能解决你的问题。本文章翻译自博客 https://e.printstacktrace.blog/jenkins-pipeline-environment-variables-the-definitive-guide/

今天,我们专注于有效地使用Jenkins Pipeline环境变量。您将学习如何定义env变量,如何更新它们,以及如何在布尔表达式中正确使用它们。

主要内容

  • 列出环境变量

  • 读取环境变量

  • 设置环境变量

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

  • sh在env环境变量中获取输出

1 列出环境变量


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

图片

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

pipeline {
    agent any

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

JOB_URL=http://139.198.170.122:8080/job/pipeline-test0/
GROOVY_HOME=/usr/local/groovy-3.0.7
WORKSPACE=/data/cicd/jenkinsagent/workspace/pipeline-test0
JOB_NAME=pipeline-test0
PWD=/data/cicd/jenkinsagent/workspace/pipeline-test0
JAVA_HOME=/usr/local/jdk8

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

图片图片

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

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

图片

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

图片

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

图片

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

图片图片

流水线全局变量参考


 内置变量

BUILD_NUMBER          //构建号
BUILD_ID              //构建号
BUILD_DISPLAY_NAME    //构建显示名称
JOB_NAME              //项目名称
              
EXECUTOR_NUMBER       //执行器数量
NODE_NAME             //构建节点名称
WORKSPACE             //工作目录
JENKINS_HOME          //Jenkins home
JENKINS_URL           //Jenkins地址
BUILD_URL             //构建地址
JOB_URL               //项目地址

currentbuild变量

result  currentResult   //构建结果
displayName      //构建名称  #111
description      //构建描述
duration         //持续时间

image.png

流水线中变量定义引用


 变量的类型:两种类型的变量。
1.Jenkins系统内置变量 (全局变量)
2.Pipeline中定义变量(全局/局部变量)

Jenkins系统内置变量:是Jenkins系统在安装部署后预先定义好的变量。这些变量可以通过Jenkins流水线语法页面看到具体有哪些。这些变量都是全局的可以使用"${env.变量名}引用。


Pipeline中的变量:

首先你要先理解pipeline可以用groovy语法来编写,而groovy是一门编程语言。所有的编程语言也都有各自的变量定义方式。 这就容易让大家产生疑惑的地方,pipeline中可以有很多种写法。

def name = "devops"
String name = "devops"

以上这两种写法是一样,def可以自动推导出变量类型,而String这种写法是精确这个变量是一个字符串类型的。

如果你在Jenkins图形界面设置了参数化构建,那么这些参数也都变成了Jenkins全局变量,可以使用与Jenkins内置变量相同的引用方式。


如果在某个stage定义的变量默认是局部变量,在后续的stage中可能语法引用,所以如果需要引用最好定义为全局变量。

全局变量的定义方式:
env.name = "devops"
引用方式: "${env.name}"


总之变量是我们在编写Jenkins流水线是经常用到的。无处不在。如果你要定义全局的变量就用env.变量名的方式定义。 变量也不仅仅只有这几种写法,我建议如果想了解更多,可以多看下groovy这门需要的更多语法。

浏览620 评论0
返回
目录
返回
首页
微服务需要考虑的问题 Jenkins pipeline 09 parallel 阶段并行