10分钟搞定让你困惑的 Jenkins 环境变量
myzbx 2025-03-14 19:07 11 浏览
前言
Jenkins, DevOps 技术栈的核心之一,CI/CD 离不开编写 Pipeline 脚本,上手 Jenkins ,简单查一下文档,你就应该不会被 agent,stages,step 这类关键词弄懵,也能很快构建出 pipeline 的骨架
但是当向骨架中填充内容的时候,尤其如何利用环境变量(系统内置 | 自定义),多数人都会变得比较混乱,浪费很多时间,本文就帮助大家快速通关环境变量
准备
如果你想一边阅读本文,一边实践,但是没有 Jenkins 服务可用,又想快速尝试,可以应用 Docker 一个命令快速搭建 Jenkins 服务
docker container run --rm -p 8080:8080 -p 50000:50000 --name=jenkins -v $(pwd):/var/jenkins_home jenkins/jenkins
2021 年了,本地没有 Docker 说不过去了,过来瞧瞧 Docker 系列是否入得了你的法眼?
打开浏览器输入:localhost:8080
- 找到终端的临时密码登陆
- 安装推荐的依赖
- 创建新的 Pipeline 类型的 Item
- 点击左侧 Config,然后在页面底部 Pipeline 部分输入我们接下来写的脚本进行测试就好了
就是这么简单.....
认识 Jenkins 环境变量
Jenkins 环境变量就是通过
env
关键字暴露出来的全局变量,可以在 Jenkins 文件的任何位置使用
其实和你使用的编程语言中的全局变量没有实质差别
查看 Jenkins 系统内置环境变量
Jenkins 在系统内置了很多环境变量方便我们快速使用,查看起来有两种方式:
方式一:
直接在浏览器中访问 ${YOUR_JENKINS_HOST}/env-vars.html
页面就可以,比如
,每个变量的用途写的都很清楚
http://localhost:8080/env-vars.html
方式二
通过执行 printenv
shell 命令来获取:
pipeline {
agent any
stages {
stage("Env Variables") {
steps {
sh "printenv"
}
}
}
}
直接 Save - Build, 在终端 log 中你会看到相应的环境变量,并且可以快速看到他们当前的值
通常这两种方式可以结合使用
读取环境变量
上面我们说了 env
是环境变量的关键字,但是读取 Jenkins 内置的这些环境变量,env
关键字是可有可无, 但不能没了底裤,都要使用 ${xxx}
包围起来。以 BUILD_NUMBER
这个内置环境变量举例来说明就是这样滴:
如果你在 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"'
}
}
}
}
可以看到结果是一样一样滴,不管有几种,记住第一种最稳妥
内置的环境变量虽好,但也不能完全满足我们自定义的 pipeline 的执行逻辑,所以我们也得知道如何定义以及使用自定义环境变量
自定义 Jenkins 环境变量
Jenkins pipeline 分声明式(Declarative)和 脚本式(imperative)写法,相应的环境变量定义方式也略有不同,归纳起来有三种方式:
还是看个实际例子吧:
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 文件中,所有设置的值都会被当成 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"
}
}
}
}
}
}
来看运行结果:
如果你写过 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 环境变量,了解这些基本上就满足绝大多数应用场景了,当再遇到环境变量问题时,可以回过来翻看一下了,有解决的困惑吗?
趣味原创解析Java技术栈问题,将复杂问题简单化,将抽象问题图形化落地如果对我的专题内容感兴趣,或抢先看更多内容,欢迎访问我的博客 dayarch.top
相关推荐
- Django零基础速成指南:快速打造带用户系统的博客平台
-
#python##服务器##API##编程##学习#不是所有教程都值得你花时间!这篇实战指南将用5分钟带你解锁Django核心技能,手把手教你从零搭建一个具备用户注册登录、文章管理功能的完整...
- iOS 17.0 Bootstrap 1.2.9 半越狱来啦!更新两点
-
这款Bootstrap半越狱工具终于更新,离上一次更新已相隔很久,现在推出1.2.9版本,主要为内置两点功能进行更新,也是提升半越狱的稳定性。如果你正在使用这款半越狱工具的,建议你更新。注意!...
- iOS 16.x Bootstrap 1.2.3 发布,支持运行清理工具
-
本文主要讲Bootstrap半越狱工具更新相关内容。如果你是iOS16.0至16.6.1和17.0系统的,想体验半越狱的果粉,请继续往下看。--知识点科普--Bootstrap...
- SpringBoot整合工作流引擎Acticiti系统,适用于ERP、OA系统
-
今日推荐:SpringBoot整合工作流引擎Acticiti的源码推荐理由:1、SpringBoot整合工作流引擎Acticiti系统2、实现了三级权限结构3、持久层使用了mybatis框架4、流程包...
- SpringCloud自定义Bootstrap配置指南
-
在SpringCloud中自定义Bootstrap配置需要以下步骤,以确保在应用启动的早期阶段加载自定义配置:1.添加依赖(针对新版本SpringCloud)从SpringCloud2020...
- Python使用Dash开发网页应用(三)(python网页开发教程)
-
PlotlyDash开发Web应用示例一个好的网页设计通常都需要编写css甚至js来定制前端内容,例如非常流行的bootstrap框架。我们既然想使用Dash来搭建web应用,很大的一个原因是不熟悉...
- Oxygen XML Editor 27.1 中的新功能
-
OxygenXMLEditor27.1版是面向内容作者、开发者、合作者和出版商的行业领先工具包的增量版本。在27.1版本中,AIPositronAssistant得到了增强,包括用于...
- 【LLM-多模态】Mini-Gemini:挖掘多模态视觉语言模型的潜力
-
一、结论写在前面论文提出了Mini-Gemini,一个精简而强大的多模态VLM框架。Mini-Gemini的本质在于通过战略性框架设计、丰富的数据质量和扩展的功能范围,发掘VLM的潜在能力。其核心是补...
- 谐云课堂 | 一文详解分布式改造理论与实战
-
01微服务与分布式什么是分布式?首先,我们对上图提到的部分关键词进行讲解。单体,是指一个进程完成全部的后端处理;水平拆分,是同一个后端多环境部署,他们都处理相同的内容,使用反向代理来均衡负载,这种也叫...
- 基于Abaqus的手动挡换挡机构可靠性仿真
-
手动挡,也称手动变速器,英文全称为Manualtransmission,简称MT,即用手拨动换挡操纵总成才能改变变速器内的齿轮啮合位置,改变传动比,从而达到变速的目的。家用轿车主要采用软轴连接的换挡...
- 【pytorch】目标检测:彻底搞懂YOLOv5详解
-
YOLOv5是GlennJocher等人研发,它是Ultralytics公司的开源项目。YOLOv5根据参数量分为了n、s、m、l、x五种类型,其参数量依次上升,当然了其效果也是越来越好。从2020...
- 超实用!50个非常实用的PS快捷键命令大全分享
-
今天,给大家介绍50个非常实用的快捷键命令大全,大家伙都是设计师,关于软件使用那是越快越好啊。一、常用的热键组合1、图层混合模式快捷键:正常(Shift+Option+N),正片叠底(Shif...
- Pohtoshop中深藏不露的小技巧(科目一考试技巧记忆口诀看完必过)
-
邢帅教育ps教程为大家总结了一些Pohtoshop中深藏不露的小技巧,可以帮助到大家在设计时减少不必要的麻烦,提高工作效率哦~~~1.设置网格线保持像素完美不在1:1分辨率下也能保持像素完美,可以...
- Ganglia监控安装总结(监控安装工作总结)
-
一、ganglia简介:Ganglia是一个跨平台可扩展的,高性能计算系统下的分布式监控系统,如集群和网格。它是基于分层设计,它使用广泛的技术,如XML数据代表,便携数据传输,RRDtool用于数据...
- 谁说Adobe XD做不出好看的设计?那是你没搞懂这些功能
-
AdobeXD的美化栏具有将设计视图美化的功能,它能使界面设计和原型设计更漂亮、更吸引眼球。美化栏的7个功能包括竖线布局设计、横线布局设计、重复网格、图形大小和位置设置、响应式调整大小、文字美化以及...
- 一周热门
- 最近发表
-
- Django零基础速成指南:快速打造带用户系统的博客平台
- iOS 17.0 Bootstrap 1.2.9 半越狱来啦!更新两点
- iOS 16.x Bootstrap 1.2.3 发布,支持运行清理工具
- SpringBoot整合工作流引擎Acticiti系统,适用于ERP、OA系统
- SpringCloud自定义Bootstrap配置指南
- Python使用Dash开发网页应用(三)(python网页开发教程)
- Oxygen XML Editor 27.1 中的新功能
- 【LLM-多模态】Mini-Gemini:挖掘多模态视觉语言模型的潜力
- 谐云课堂 | 一文详解分布式改造理论与实战
- 基于Abaqus的手动挡换挡机构可靠性仿真
- 标签列表
-
- HTML 基础教程 (29)
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 中级教程 (30)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)