Jenkins中环境变量的过程有哪些
创始人
2024-12-28 06:42:17
0次

认识 Jenkins 环境变量

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

其实和你使用的编程语言中的全局变量没有实质差别

查看 Jenkins 系统内置环境变量

Jenkins 在系统内置了很多环境变量方便我们快速使用,查看起来有两种方式:

方式一:

直接在浏览器中访问 ${YOUR_JENKINS_HOST}/env-vars.html 页面就可以,比如 http://localhost:8080/env-vars.html ,每个变量的用途写的都很清楚

Jenkins中环境变量的过程有哪些

方式二

通过执行 printenv shell 命令来获取:

pipeline {
  agent any

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

直接 Save - Build, 在终端 log 中你会看到相应的环境变量,并且可以快速看到他们当前的值

Jenkins中环境变量的过程有哪些

通常这两种方式可以结合使用

读取环境变量

上面我们说了 env 是环境变量的关键字,但是读取 Jenkins 内置的这些环境变量,env 关键字是可有可无, 但不能没了底裤,都要使用 ${xxx} 包围起来。以 BUILD_NUMBER 这个内置环境变量举例来说明就是这样滴:

Jenkins中环境变量的过程有哪些

如果你在 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中环境变量的过程有哪些

内置的环境变量虽好,但也不能完全满足我们自定义的 pipeline 的执行逻辑,所以我们也得知道如何定义以及使用自定义环境变量

自定义 Jenkins 环境变量

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

Jenkins中环境变量的过程有哪些

还是看个实际例子吧:

pipeline {
  agent any

  environment {
    FOO = "bar"
  }

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

      steps {
        echo "FOO = ${env.FOO}"
        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 让人相对困惑最多的地方就是重写环境变量,但是只要记住下面这三条规则,就可以搞定一切了

  • withEnv(["WITH_ENV_VAR=Come On"]) {} 内置函数的这种写法,可以重写任意环境变量

  • 定义在 environment {} 的环境变量不能被脚本式定义的环境变量(env.key="value")重写

  • 脚本式环境变量只能重写脚本式环境变量

这三点是硬规则,没涵盖在这 3 点规则之内的也就是被允许的了

三条规则就有点让人头大了,农夫选豆种,举例为证吧

pipeline {
  agent any

  environment {
    FOO = "你当像鸟飞往你的山"
    NAME = "Tan"
  }

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

      steps {
       	// 应该打印出 "FOO = 你当像鸟飞往你的山"
        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 = 你当像鸟飞往你的山"
        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}"
        }
      }
    }
  }
}

来验证一下结果吧

Jenkins中环境变量的过程有哪些

Jenkins中环境变量的过程有哪些

看到这,基本的设置应该就没有什么问题了,相信你也发现了,Jenkins 设置环境变量和编程语言的那种设置环境变量还是略有不同的,后者可以将变量赋值为对象,但 Jenkins 就不行,因为在 Jenkins 文件中,所有设置的值都会被当成 String, 难道没办法应用 Boolean 值吗?

Jenkins 中使用 Boolean 值

如果设置一个变量为 false ,Jenkins 就会将其转换为 "false", 如果想使用 Boolean 来做条件判断,必须要调用 toBoolean() 方法做转换

pipeline {
  agent any

  environment {
    IS_BOOLEAN = false
  }

  stages {
    stage("Env Variables") {
      steps {
        script {
         	// Hello 会被打印出来,因为非空字符串都会被认为是 Boolean.True
          if (env.IS_BOOLEAN) {
            echo "Hello"
          }

         	// 真正的 Boolean 比较
          if (env.IS_BOOLEAN.toBoolean() == false) {
            echo "日拱一兵"
          }
         
         	// 真正的 Boolean 
          if (!env.IS_BOOLEAN.toBoolean()) {
            echo "RGYB"
          }
        }
      }
    }
  }
}

来看运行结果:

Jenkins中环境变量的过程有哪些

如果你写过 Pipeline,你一定会知道,写 Pipeline 是离不开写 shell 的,有些时候,需要将 shell 的执行结果赋值给环境变量,Jenkins 也有方法支持

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

Jenkins中环境变量的过程有哪些

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...