自动化发布工具CI/CD实践Jenkins部署与配置教程
1. 前言背景
其实一直想把jenkins 的笔记整理下,介于公司这次升级jenkins2.0 ,根据自己部署的一些经验,我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目,随着项目的日益增多,环境越来越复杂,需求多,差异化的配置错综复杂,公司产品线大升级;是想着好好的把jenkins 平台给规划下做下升级,兼容更多的场景;
于是,就有了jenkins2.0 的一个探索,截止发文前,已投入生产实践中,本文我更多的还是来阐述分享点jenkins2.0 中带来的一些好的功能点,想法;同时也给大家规避类一些问题。
古代治学总结有人生三境界,在我看来,jenkins 使用接入亦有三个阶段,这也是每一个运维人员应用 jenkins 所必须要经历的。
第一阶段:初接触,有很多不熟悉不了解,应用场景也大多是依赖手工点点点维护的 free style 或者 maven 风格的项目,通过配置一些参数,结合脚本进行项目的构建与发布。这种维护方式其实也是 jenkins 在 1.0 时代的普遍使用姿势。它的最大弊端在于一切参数都要配置化,当维护的项目数量增多的时候,又遇到某些普遍性需要更改的地方,那么维护起来就是一场灾难了。
第二阶段:慢慢往后深入,接触越来越多,逐渐开始了解 pipeline,亦即 jenkins 在 2.0 时代提出的一个新概念:配置即代码,或者说代码即配置。我们可以不必点点点勾选过多地配置项,只需通过代码定义即可实现相同的效果。只不过据我了解,很多人在这个阶段,因为对流水线基础语法掌握程度不够,因此还有很多人是手工配置参数,然后再结合 jenkinsfile 来进行构建发布的,其实这种方式,并没有真正体悟到 2.0 的设计精髓,自然也无法吃到这波技术红利了。
第三阶段:你不应该满足于维护大量 jenkinsfile 的现状中,过多的 jenkinsfile 就像一个又一个肥大的肿块儿一般,对于后期的二次维护,都是极大的挑战。你可能听过共享库,渐渐你开始了解共享库,尝试共享库,最后将同一个类别的 jenkinsfile 进行逻辑抽象,每个项目都变成了另外一种变相的参数化构建,从而接入项目只需配置对应的
引导文件即可,这种方式能够极大地简化 jenkins 的运维使用难度,对项目交付效率的提升有极大的帮助。

上图,是我司CI/CD 的一个发展阶段,在jenkins2.0 时候,我们做了一个大的变动,使用共享库,将同一个类别的 jenkinsfile 进行逻辑抽象,每个项目都变成了另外一种变相的参数化构建,只需要维护每个项目各自的参数,也就是引导文件, 即可对项目进行交付,另外jenkins2.0 上涉及的一切配置、环境、基础设施、数据变更都纳入版本控制范围。一切皆代码,这也是GitOps的理念
2.部署条件
2.1 官网及下载
jenkins官方网站:Jenkins

Stable (LTS) : 稳定版本,长期支持 (LTS) 发布基线每 12 周从常规版本流中选择一次。每 4 周发布一次稳定版本
Regular releases (Weekly) : 定期发布(每周) 该发布线可快速向需要它们的用户和插件开发人员提供错误修复和新功能。它通常每周提供一次

2.1 软件要求
官网: jenkins requires Java 11 or 17 since jenkins 2.357 and LTS 2.361.1
Java11
2.2 服务器硬件要求
- 小型团队的推荐硬件配置:
- 4 GB+ of RAM
- 50 GB+ of drive space 50 GB+ 驱动器空间
3. 安装部署
3.1 本次安装环境信息
| 名称 | 版本 |
|---|---|
| Centos7 | Centos7.9 【8核16g500G 】 |
| jenkins | jenkins 2.401.1 LTS |
| Java | Openjdk11.0.2 |
3.2 部署jdk
- 下载地址 https://repo.huaweicloud.com/java/jdk/11.0.2+9/jdk-11.0.2_linux-x64_bin.tar.gz

#建立软件工作目录
[root@localhost /]# mkdir -p /home/application/#下载软件包
[root@localhost /]# wget https://repo.huaweicloud.com/java/jdk/11.0.2+9/jdk-11.0.2_linux-x64_bin.tar.gz#解压软件包
[root@localhost /]# tar -xf jdk-11.0.2_linux-x64_bin.tar.gz -C /home/application/
[root@localhost /]# rm -rf jdk-11.0.2_linux-x64_bin.tar.gz[root@localhost /]# ls -l /home/application/jdk-11.0.2/
total 32
drwxr-xr-x 2 root root 4096 Jun 5 04:07 bin
drwxr-xr-x 4 root root 4096 Jun 5 04:07 conf
drwxr-xr-x 3 root root 4096 Jun 5 04:07 include
drwxr-xr-x 2 root root 4096 Jun 5 04:07 jmods
drwxr-xr-x 72 root root 4096 Jun 5 04:07 legal
drwxr-xr-x 6 root root 4096 Jun 5 04:07 lib
-r--r--r-- 1 668 668 160 Jan 18 2019 README.html
-rw-r--r-- 1 668 668 1256 Jan 18 2019 release
Copy
3.3 部署jenkins
3.3.1 创建jenkins软件工作目录,并下载最近的LTS war包
#建立jenkins软件工作目录
[root@localhost application]# mkdir -p /home/application/jenkins#下载最近的LTS war包
[root@localhost application]# wget http://get.jenkins.io/war-stable/2.401.1/jenkins.war -P /home/application/jenkins
Copy
3.3.2 创建jenkins 主目录
如果不指定jenkins 主目录的话,默认是在 /root/.jenkins 目录下 ; 因为咱这里给jenkins 单独创建了
/home/application/jenkins工作目录,就需要指定下
官方阐述了更改主目录的三种方法:
jenkins储存所有的数据文件在这个目录下. 你可以通过以下几种方式更改:
- 使用你Web容器的管理工具设置
jenkins_HOME环境参数. - 在启动Web容器之前设置
jenkins_HOME环境变量. - (不推荐)更改
jenkins.war(或者在展开的Web容器)内的web.xml配置文件
这里我们使用systemd 去管理jenkins 的启动停止,在Environment 中添加 JENKINS_HOME=/home/application/jenkins
3.3.3 使用systemd管理jenkins,并添加开机自启动
#使用systemd管理jenkins,并添加开机自启动
[root@localhost ~]# vim /etc/systemd/system/jenkins.service
[Unit]
Description=Jenkins Agent
After=network.target[Service]
User=root
Environment="JENKINS_HOME=/home/application/jenkins"
ExecStart=/home/application/jdk-11.0.2/bin/java -jar /home/application/jenkins/jenkins.war -Djava.awt.headless=true
Restart=always
RestartSec=3[Install]
WantedBy=multi-user.target[root@localhost jenkins]# chmod +x /etc/systemd/system/jenkins.service
#添加开机自启动
[root@localhost jenkins]# systemctl enable jenkins
Copy
3.3.4 启动jenkins
[root@localhost ~]# systemctl start jenkins[root@localhost ~]# systemctl status jenkins
● jenkins.service - jenkins AgentLoaded: loaded (/etc/systemd/system/jenkins.service; enabled; vendor preset: disabled)Active: active (running) since Mon 2023-06-05 05:01:48 EDT; 3s agoMain PID: 27603 (java)CGroup: /system.slice/jenkins.service└─27603 /home/application/jdk-11.0.2/bin/java -jar /home/application/jenkins/jenkins.war -Djava.awt.headless=trueJun 05 05:01:48 localhost.localdomain systemd[1]: Started jenkins Agent.
Jun 05 05:01:49 localhost.localdomain bash[27603]: Running from: /home/application/jenkins/jenkins.war
Jun 05 05:01:49 localhost.localdomain bash[27603]: webroot: /root/.jenkins/war
Jun 05 05:01:49 localhost.localdomain bash[27603]: 2023-06-05 09:01:49.735+0000 [id=1] INFO winstone.Logger#logInternal: Beginning extraction from war file
Jun 05 05:01:52 localhost.localdomain bash[27603]: 2023-06-05 09:01:52.031+0000 [id=1] WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
Jun 05 05:01:52 localhost.localdomain bash[27603]: 2023-06-05 09:01:52.127+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-10.0.13; built: 2022-12-07T20:13:20.134Z; git: 1c2636ea05c0ca8de1ffd6ca7f3a98ac084c766d; jvm 11.0.2+9-LTS
Hint: Some lines were ellipsized, use -l to show in full.
Copy
3.3.5 启动解锁jenkins
大概一两分钟后,可以看到日志输出,jenkins已经初始化安装成功,并且给出了管理员admin的登陆密码为946312e6f67746aba40950417e9c70b4
当然也可在/root/.jenkins/secrets/initialAdminPassword 文件中看到密码
[root@localhost ~]# systemctl status jenkins
● jenkins.service - jenkins AgentLoaded: loaded (/etc/systemd/system/jenkins.service; enabled; vendor preset: disabled)Active: active (running) since Mon 2023-06-05 05:01:48 EDT; 2min 53s agoMain PID: 27603 (java)CGroup: /system.slice/jenkins.service└─27603 /home/application/jdk-11.0.2/bin/java -jar /home/application/jenkins/jenkins.war -Djava.awt.headless=trueJun 05 05:01:55 localhost.localdomain bash[27603]: Please use the following password to proceed to installation:
Jun 05 05:01:55 localhost.localdomain bash[27603]: 946312e6f67746aba40950417e9c70b4
Jun 05 05:01:55 localhost.localdomain bash[27603]: This may also be found at: /root/.jenkins/secrets/initialAdminPassword
Jun 05 05:01:55 localhost.localdomain bash[27603]: *************************************************************
Jun 05 05:01:55 localhost.localdomain bash[27603]: *************************************************************
Jun 05 05:01:55 localhost.localdomain bash[27603]: *************************************************************
Jun 05 05:02:13 localhost.localdomain bash[27603]: 2023-06-05 09:02:13.107+0000 [id=35] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
Jun 05 05:02:13 localhost.localdomain bash[27603]: 2023-06-05 09:02:13.124+0000 [id=23] INFO hudson.lifecycle.Lifecycle#onReady: jenkins is fully up and running
Jun 05 05:02:14 localhost.localdomain bash[27603]: 2023-06-05 09:02:14.052+0000 [id=49] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
Jun 05 05:02:14 localhost.localdomain bash[27603]: 2023-06-05 09:02:14.053+0000 [id=49] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1[root@localhost ~]# cat /root/.jenkins/secrets/initialAdminPassword
946312e6f67746aba40950417e9c70b4
Copy
4. 安装后配置
4.1 登录jenkins平台
如果没有指定端口的话,默认是8080; 如果要指定端口的话,需要再启动文件里 加上 --httpPort=8888
贴入密码

4.2 安装jenkins插件
选择 安装jenkins社区推荐的插件;安装过程可能会有点问题,安装失败啥的,重复安装就行,如果实在安装不下去,可以跳过,等进入到jenkins 设置界面设置代理地址即可


4.3 创建用户,配置实例
-
在这里创建一个管理员账号,到此jenkins的初始化配置已完成。




4.4 配置更新站点
-
由于使用官方的站点速度相对很慢,这里采用清华大学的jenkins更新站点。
-
站点地址: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
-




到这里安装基本上就完成了
相关文章:
自动化发布工具CI/CD实践Jenkins部署与配置教程
1. 前言背景 其实一直想把jenkins 的笔记整理下,介于公司这次升级jenkins2.0 ,根据自己部署的一些经验,我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目,随着项目的日益增多&#x…...
python中的demjson包介绍
demjson是Python中的一个第三方模块库,专门用于编码和解码JSON数据。以下是关于demjson包的详细介绍: 一、主要功能 编码与解码: demjson提供了将Python对象(如字典、列表等)编码成JSON字符串的功能。同时,…...
什么是SQL作业
SQL作业是在数据库服务器上按特定时间或间隔自动执行的计划任务或流程,这些作业由Microsoft SQL Server中的SQL Server代理管理,对于自动执行日常任务(如数据库系统中的备份、数据导入和报告生成)以及确保及时准确地处理和更新数据…...
Android实践开发制作小猴子摘桃小游戏
Android实践制作小猴子摘桃小游戏 实践素材项目源文件获取:Android可能存在版本差异项目如果不能正确运行,可以使用里面的素材自己构建项目Android实践制作小猴子摘桃小游戏Android实践制作小猴子摘桃小游戏https://mp.weixin.qq.com/s/jNU_hVfj9xklsil…...
springboot整合couchbase(集群)
springboot整合couchbase 1、Couchbase1.1、介绍1.2、Bucket1.3、Couchbase SDK 2、(key,value)写入couchbase集群2.1、总体图2.2、依赖2.3、CouchbaseConfig 配置文件2.4、代码使用 1、Couchbase 1.1、介绍 1.2、Bucket 在 Couchbase 中,bucket 是一个重要的概念…...
VsCode启用右括号自动跳过(自动重写) - 自录制gif演示
VsCode启用右括号自动跳过(自动重写) - 自录制gif演示 前言 不知道大家在编程时候的按键习惯是怎样的。输入完左括号后编辑器一般会自动补全右括号,输入完左括号的内容后,是按→跳过右括号还是按)跳过右括号呢? for (int i 0; i < a.s…...
[Linux]在vim中批量注释与批量取消注释
1.在vim中批量注释的步骤: 1.在normal模式下按Ctrl v ,进入V-BLOCK模式 2.按 J 键 或 K 键选择要注释的内容,J向上K向下 我们给第5,6,7行进行注释 3.按住shift i进入插入模式,输入 // 4.点击ESC键&…...
NC,GFS、ICON 数据气象信息可视化--降雨量的实现
随着气象数据的快速发展和应用,气象信息的可视化成为了一项不可或缺的技术手段。它不仅能帮助气象专家快速解读数据,还能为公众提供直观的天气预报信息。今天,我们将从降雨量的可视化出发,带大家一起了解如何实现气象数据的可视化…...
LLM之RAG实战(五十二)| 如何使用混合搜索优化RAG 检索
在RAG项目中,大模型生成的参考内容(专业术语称为块)来自前一步的检索,检索的内容在很大程度上直接决定了生成的效果,因此检索对于RAG项目至关重要,最常用的检索方法是关键字搜索和语义搜索。本文将分别介绍…...
探索Scala基础:融合函数式与面向对象编程的强大语言
Scala作为一门在现代编程领域备受瞩目的编程语言,融合了函数式编程和面向对象编程的特性,运行于Java虚拟机(JVM)之上,与Java有着良好的互操作性。它简洁、高效且表达力强,适用于各种规模和类型的软件开发项…...
Selenium文件上传
在 Web 自动化测试中,文件上传是一项常见的任务。不同的网站和前端技术可能导致上传方式有所不同,因此需要采用不同的方法进行处理。 方法 1:使用 send_keys() 直接上传(最常用) 适用场景: 页面中 有标准的 <input type="file"> 标签。 不需要弹出 Wind…...
Java多线程与高并发专题——Condition 和 wait/notify的关系
引入 上一篇关于Condition,我们对Condition有了进一步了解,在之前生产/消费者模式一文,我们讲过如何用 Condition 和 wait/notify 来实现生产者/消费者模式,其中的精髓就在于用Condition 和 wait/notify 来实现简易版阻塞队列&am…...
mysql-分区和性能
mysql自身只支持表的横向分区。 常听到开发人员说“”对表做个分区“,然后数据的查询就会快了。这是真的吗?实际上可能跟根本感觉不到查询速度的提升,甚至会发现查询速度急剧下降。因此,在合理使用分区之前,必须了解分…...
使用matlab进行分位数回归
对于使用MATLAB、R语言或者STATA执行带有虚拟变量的分位数回归,这三个工具都带有强大的分析功能。在核心观点上,首先需要理解分位数回归的基本原理、其次要掌握如何在各个统计软件中实现该分析、最后,需要熟悉虚拟变量在模型中的应用并合理加…...
[操作系统,学习记录]3.进程(2)
1.fork(); 玩法一:通过返回值if,else去执行不同的代码片段 玩法二:if,else然后调用execve函数去执行新的程序 2.进程终止: 退出码,子进程通过exit/return返回,父进程wait/waitpid等待而得&am…...
26考研——排序_选择排序_选择排序的基本思想 简单选择排序(8)
408答疑 文章目录 四、选择排序选择排序的基本思想简单选择排序定义算法思想性能分析空间效率时间效率稳定性 适用性 九、参考资料鲍鱼科技课件26王道考研书 四、选择排序 选择排序的基本思想 每一趟(如第 i i i 趟)在剩下 n − i 1 n-i1 n−i1&…...
StarRocks BE宕机排查
StarRocks BE宕机排查 排查是否OOM dmesg -T|grep -i oom #排查是否oom原因: 2.X版本OOM原因 BE 的配置文件 (be.conf) 中 mem_limit 配置不合理,需要配置mem_limit(机器总内存-其他服务占用内存-1~2g(系统预留)) 比如机器内存40G,上面有…...
PPT——组合SCI论文图片
SCI论文中对于图的排版常常是最头疼的事情,通常需要几个图组合在一起,并且如何控制图中的字体一致也是麻烦事。 保持这个大图里面的一致,转头一看跟其他图又不一致了。最近跟我的博导学了一手,今天就来记录一下吧。主要用到的软件…...
Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)
1. brew安装 mac需要先安装brew,如果本地已经安装过brew这一步可以忽略,遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败,因为…...
03 相机标定图像采集
学完本文,您将获取一下技能: 1:如何提升标定质量,如选择标定板,标定图像采集的注意事项, 2:实现标定图像自动筛选的代码 3:量产场景如何通过一张图像来标定相机 为了实现良好的标定效果,以下因素在标定数据采集前必须设置得当。 标定板选择 标定板尺寸准确材料平…...
CentOS 安装LAMP全过程 - 完整步骤与最佳实践
在开始搭建 LAMP 环境之前,需要确保系统已经满足以下条件: 1、操作系统:CentOS 7 或 CentOS 8 2、网络连接:系统必须能够访问互联网以下载所需的软件包 3、权限:需要 root 权限或者通过sudo 提权执行命令 先更新系…...
基于DCT变换和Huffman编码的图像压缩解压缩算法matlab性能仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 DCT变换 4.2 Huffman编码的数学原理 4.3 图像压缩流程 4.4 仿真测试指标 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a/matl…...
Vue下 Sortable 实现 table 列表字段可拖拽排序,显示隐藏组件开发
vue 开发table 列表时,需要动态调整列字段的顺序和显示隐藏 实现效果如图所示: vue 组件代码 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…...
李飞飞、吴佳俊团队新作:FlowMo如何以零卷积、零对抗损失实现ImageNet重构新巅峰
目录 一、摘要 二、引言 三、相关工作 四、方法 基于扩散先前的离散标记化器利用广告 架构 阶段 1A:模式匹配预训练 阶段 1B:模式搜索后训练 采样 第二阶段:潜在生成建模 五、Coovally AI模型训练与应用平台 六、实验 主要结果 …...
.js项目编译成.exe程序(交叉编译全过程整理)
1.前提: (这个文档有配套的视频解说教程,大家想看的话, 直接在 blibli搜索 , 尘埃落在星河湾 这个up主, 将vtk.js打包成.exe实录课程_哔哩哔哩_bilibili ) 先将下载库的环境搭建好: 打开编辑配置文件,下面代码依次执行 npm config edit registryhttps://registry.npmmirror.com…...
Android面试总结之Handler 机制深入探讨原理、应用与优化
1.使用过Handler吗?Handler是用来干嘛的? 答:使用过,Handler是android中设计的用于线程间通信的工具类,针对单个Handler对象而言,与其关联的有Message,MessageQueue和Looper,其中Me…...
OpenAI 推出图像生成新突破:GPT-4o 实现图像编辑对话化
关键要点 OpenAI 推出了 4o 图像生成功能,集成于 GPT-4o,提供精准且逼真的图像生成。 它似乎适用于多种用户,包括免费用户,API 访问预计几周内推出。 安全措施包括 C2PA 元数据和内容屏蔽,限制生成不适当图像。 研究…...
android11关机安卓充电的UI定制化
引言 首先上一张安卓充电的图片: 安卓关机状态下有两种充电模式:uboot-charge和android-charge,可通过dts配置使用哪一种充电模式。 dts配置中uboot-charge和android-charge是互斥的,如下配置的是开启android-charge:…...
Web前端之JavaScript的DOM操作冷门API
MENU 前言1、Element.checkVisibility()2、TreeWalker3、Node.compareDocumentPosition()4、scrollIntoViewIfNeeded()5、insertAdjacentElement()6、Range.surroundContents()7、Node.isEqualNode()8、document.createExpression()小结 前言 作为前端开发者,我们每…...
惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”
惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”,它们都有自己的核心技术、专利设计和生态体系。以下是它们“自己的”核心部分: 1. 关键自研技术 品牌自研技术/专利说明…...
