使用Jenkins持续集成的一些经验总结

news2024/10/25 9:11:01

作为一名测试开发人员或工程师,您是否曾在项目中遇到手动部署与测试效率低下的问题?当每次提交代码都需要人工触发一系列的构建与测试流程时,整个开发进度都会受到拖累。正是在这样的背景下,Jenkins,作为持续集成的关键工具,帮助我们改变了这一局面。

那么,Jenkins在实际使用中有哪些关键经验值得分享?如何才能充分利用它的强大功能来提升团队的整体效能?今天就让我们一起来总结一下,关于使用Jenkins持续集成的一些实战经验。

 

流水线(Pipeline)的配置与优化


流水线是Jenkins的核心功能之一,它允许你定义从代码构建到测试再到部署的整个流程。在某个项目中,我们团队从最初的手动触发测试,逐步演化为通过Jenkins Pipeline进行自动化构建和测试。这不仅减少了人工操作,还确保了每次提交代码都能及时获得反馈。在优化过程中,利用并行构建和Stage View功能,可以清晰地查看各个阶段的执行情况,优化持续集成流程。

Jenkins插件的选择与管理


Jenkins丰富的插件库为它带来了巨大的灵活性。在项目中,我们结合GitLab、SonarQube和Allure插件,实现了代码管理、质量检测和测试报告的无缝集成。插件的选择要根据实际需求,不要过度依赖不必要的插件,否则可能导致系统的性能问题。因此,定期更新并清理无用插件也是维护Jenkins的一个关键经验。

配置管理与环境隔离


使用Jenkins进行持续集成时,配置管理至关重要。通过配置不同的节点,我们可以为不同的项目或团队分配独立的执行环境,避免相互干扰。在某次项目中,Jenkins通过Docker隔离了不同的环境,使得我们可以在同一平台上进行不同语言的构建和测试,显著提升了跨项目的协同效率。

01 Performance插件兼容性问题

自由风格项目中,有使用 Performance 插件收集构建产物,但是截至到目前最新版本(Jenkins v2.298,Performance:v3.19),此插件和Jenkins都存在有兼容性问题,会导致项目配置页面table,div错位而导致无法保存配置,这个问题已经存在了好长时间了(至少半年),插件作者一直没有修复,目前在项目中要想使用这个插件,有以下三种解决办法:

  • 将自由风格项目切换为流水线风格

  • 服务器上手动修改项目的config.xml文件以达到保存配置的效果

  • Jenkins版本降级,经过测试,此插件在v2.263.4 LTS上可以正常使用,降级前做好备份工作,以及考虑其他插件的兼容性问题

02  修改Jenkins 安全策略(CSP)

场景:

借助 Robot Framework Plugin,可将Robot Framework项目更好的集成到Jenkins中,但是直接在Jenkins 项目中点击预览测试报告,会出现 Opening Robot Framework log failed 的错误,这是由于Jenkins为了避免受到恶意HTML/JS文件的攻击,会默认将安全策略CSP设置为:

sandbox; default-src 'none'; img-src 'self'; style-src 'self';

在此配置下,只允许加载Jenkins服务器上托管的CSS文件和图片文件。解决办法需要借助 Startup Trigger 和 Groovy plugin 两个插件,具体步骤如下:

  • Jenkins中新建一个Job,该Job专用Jenkins启动时执行的配置命令;

  • 在“构建触发器”模块,选择“Build when job nodes start”选项,Restricted node Label保持空白,Quiet period设置为0;

  • 在“构建”模块,选择“Execute system Groovy ”,执行如下Groovy命令:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
  • 重启Jenkins服务器进行测试,会发现等待所有节点连接成功后此项目会立即自动触发构建。再去触发Robot项目构建,等待完成后点击访问测试报告页面,会发现已经可以正常访问了;

03 自定义Jenkins相对访问路径

场景:

nginx 为Jenkins做目录代理,同时站点下还代理了很多其他的应用,这里需要自定义Jenkins相对访问路径

本机访问Jenkins的路径为:http://localhost:29908,需要改为:http://localhost:29908/jenkins

方法如下:

  • 在Jenkins安装根目录下找到 jenkins.xml文件

  • 找到service节点下的 arguements 子节点,并在最后面添加--prefix参数:
    --prefix="/jenkins",其中 /jenkins 是自定义的访问路径

  • 重启Jenkins服务,此时本机已经可以通过http://localhost:29908/jenkins进行访问

  • 测试目录代理访问

注意:

如果在目录代理之前,子节点和主节点之间就已经通过JNLP的方式连接好了,则需要找到子节点根目录下的 jenkins-slave.xml 文件将service.arguements节点-jnlpUrl 参数值修改为正确的值。

04  git clone失败 : Killed by signal 15

场景:

jenkins项目clone代码时,出现任务被kill掉的情况,导致出现以下错误信息:

图片

通过查看控制台的输出日志,可以看出原因是因为超时了。如果在限制时间内代码都没有clone完成,那么就任务就会被强制杀死:

图片

解决方法:

当所需要clone的版本库过大或服务器网速较差时,clone的时间会超过默认的10分钟。因此需要修改 clone 的超时时间。

设置方法如下:

图片

Jenkins:Build step 'Execute Windows batch command' marked build as failure

图片

场景:

使用Jenkins定时跑接口测试用例,明明所有的用例都执行成功了,但是还是会触发执行失败时的邮件通知,查看Jenkins控制台日志,发现是由于上面截图的原因导致的。

解决方法:

在bat脚本(shell同样适用)最后一行加上exit 0,表示正常运行程序并退出程序。

Jenkins运行在Tomcat容器中,替换jar包的方法

背景:jenkins.war中引用的 commons-fileupload-1.3.1-jenkins-2.jar 被扫出来有安全隐患,需要替换到最新的1.4版本,因为扫描的时候是根据版本来的,如果直接采用覆盖并重命名的方法,还是会被扫出来,目前采取的方法是创建软连接。

  • 先下载最新的commons-fileupload-1.4.jar

  • 创建软链接(管理员权限),Linux系统下同理。

mklink webapps\jenkins\WEB-INF\lib\commons-fileupload-1.3.1-jenkins-2.jar  webapps\jenkins\WEB-INF\lib\commons-fileupload-1.4.jar
  • 把旧的commons-fileupload-1.3.1-jenkins-2.jar删除

  • 重启tomcat

05  Windows节点机无法运行jnlp文件

在节点机双击jnlp文件没有反应时,可以尝试用命令行方式运行此文件,cmd进入jnlp文件目录下,运行 javaws slave-agent.jnlp,可以查看具体的错误提示,如下:

图片

上图中这种情况,只需要修改下java安全配置即可解决,其他情况再具体分析。

06 关闭CSRF防护

Jenkins v2.204.6之前的版本,要想关闭CSRF防护,只需要在全局安全配置中禁用相关配置即可,但是较高版本的 Jenkins 默认均开启CSRF防护且删除了禁用的入口。要想禁用CSRF防护,只能通过配置参数的方式。

Jenkins若是跑在Tomcat下,只需在tomcat启动脚本中加入配置如下:

 

-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true

若是以jar包形式部署的,只需在启动时加上配置参数即可。

07 修改 JVM 的内存配置


 

无论是以 Jdk Jar 方式运行Jenkins,还是将 War 包放在 Tomcat等容器下运行,都会存在一个问题:默认 JVM 内存分配太少,这导致启动或者运行一段时间后内存溢出报错java.lang.OutOfMemoryError: PermGen spac

所以,需要在启动前修改配置文件中的JVM 内存配置

set JAVA_OPTS=

-server

-Xms5000M

-Xmx5000M  

-Xss512k

-XX:+AggressiveOpts

-XX:+UseBiasedLocking

-XX:PermSize=256M

-XX:MaxPermSize=512M

-XX:+DisableExplicitGC

-XX:MaxTenuringThreshold=31
-XX:+UseConcMarkSweepGC

-XX:+UseParNewGC  

-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m   -XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true

这里的几个 JVM 参数含义如下:

  • -Xms: 使用的最小堆内存大小

  • -Xmx: 使用的最大堆内存大小

  • -XX:PermSize: 内存的永久保存区域大小

  • -XX:MaxPermSize: 最大内存的永久保存区域大小这几个参数也不是配置越大越好,具体要根据所在机器实际内存和使用大小配置。

08 配置优化减少磁盘空间占用


 

Job 构建历史较多时,如果没有配置好清理策略的话,会导致占用大量磁盘空间,最终可能会因磁盘空间不够而导致构建失败。并且在加载项目配置时,Jenkins也需要花费时间分析历史构建记录,页面加载的耗时会相应的增加。

1、丢弃旧的构建配置

图片

如上图,配置最大保持 2 天之内的构建,如果超过 2 天的构建,则会在Job 执行前被清理掉,同时配置了最大保持构建数量为 30 个,意思就是如果 2 天内构建次数如果超过 30 次,则最多保留最近执行的 30 个构建。

2、使用Disk Uasge插件

不建议,使用此插件的过程中,发现可能会导致服务器卡顿。

3、定时清理tomcat日志

默认情况下,tomcat每天都会生成新的日志文件,且某些情况下,产生的日志文件体积会非常大,如果长期不清理,日志文件会越来越多,占用很多磁盘空间。

目前的处理方法是在Jenkins新建了一个定时任务,专门用来删除tomcat产生的日志文件。

图片

09 设置构建时间

有些 Job 在执行构建时,由于某些原因导致构建挂起,耗时比较长,而这些长时间挂起的 Job 会导致 Jenkins 内存占用比较大,性能下降,严重的会直接导致 Jenkins 挂掉

所以,我们需要设置构建超时时间来预防这种事情发生,一旦超过一定的时间,要让 Job 自动停止掉,如下:

图片

设置全局属性

适当设置全局属性,可以避免在pipeline中重复写死一些固定值,例如输出日志地址、接口请求地址等等,而且当固定值需要修改时,只需要修改一次即可,不用去每个文件里面修改,方便维护。设置入口为:系统管理 -> 系统配置-> 全局属性-> Environment variables

如下图:

图片

 

 

10 统一管理脚本

需要安装 Managed script 插件,该插件是为了在管理文件时创建 Script 脚本文件,然后在 Job 中配置直接使用,方便脚本的统一管理和维护。

插件安装完成后,进入“系统管理” —> “Managed files” ,点击 “Add a new Config” ,并选择 “Groovy file” 类型,创建一个新的 Groovy 脚本文件,然后输入我们要执行的脚本代码,如下:

图片

创建完毕后,我们在 Job 中构建处选择 “Execute managed script” 就可以使用这些脚本了。

11 轻量备份

使用 ThinBackup 插件,允许我们对Jenkins配置信息进行全量或增量备份,由于插件不会保存构建历史和构建工件,所备份过程更为快捷,并且无需关闭Jenkins服务器。

图片

还原备份:

图片

在现代软件开发流程中,持续集成已经成为了一个不可或缺的环节。随着软件交付周期的不断缩短,团队对自动化构建、测试和部署的需求越来越高。而Jenkins作为开源且功能强大的工具,已经广泛应用于全球的开发团队。它帮助团队提高了协作效率,也推动了DevOps文化的普及。对于国内外的开发和测试团队来说,Jenkins已经成为了许多公司实现高效持续集成和交付的首选工具。

如果你还没有在团队中引入Jenkins进行持续集成,不妨考虑使用它来提升工作效率。许多企业已通过它实现了构建、测试和部署的自动化,让团队的开发周期大幅缩短。你可以在Jenkins官网找到丰富的资源和插件,轻松开始。

在使用Jenkins的过程中,我们不仅提升了项目的自动化水平,还通过不断优化流水线、合理配置插件和环境隔离,确保了团队的高效运作。掌握这些经验,不仅能提升个人的技术水平,也能为团队带来巨大的效能提升。

“持续集成的力量不在于自动化,而在于它让每一行代码的变更都得到及时的反馈和验证,推动项目不断向前!”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能在医疗健康领域的应用与展望

随着技术的发展,人工智能(Artificial Intelligence, AI)正逐渐渗透到各行各业之中,其中医疗健康领域因其对人类福祉的重要性而备受关注。AI技术的应用不仅能够提高医疗服务的质量和效率,还能促进医学研究的进步&#x…

【蓝桥杯选拔赛真题78】python电话号码 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python电话号码 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python电话号码 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

在xml 中 不等式 做转义处理的问题

对于这种要做转义处理&#xff0c;<![CDATA[ < ]]>

Golang | Leetcode Golang题解之第507题完美数

题目&#xff1a; 题解&#xff1a; func checkPerfectNumber(num int) bool {if num 1 {return false}sum : 1for d : 2; d*d < num; d {if num%d 0 {sum dif d*d < num {sum num / d}}}return sum num }

django restful API

文章目录 项目地址一、django环境安装1.1 安装python 3.10的虚拟环境1.2 创建django工程文件1.3 创建一个book app1.4 序列化1.4.1创建一个Models1.4.2 创建django的超级用户admin1.4.3 添加serializers.py生成序列化器1.4.4 在app里创建django 视图1.4.5 创建app的urls路由1.4…

《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 模块化基础篇》

从无到有&#xff0c;打造模块化项目。构建一个开箱即用的项目&#xff0c;从 Git 上拉取下来即可直接进行开发&#xff0c;其中涵盖路由通信、上下拉刷新、网络请求、事件通知、顶部tab封装等功能&#xff0c;项目里调用API为鸿洋大佬的wanAndroidAPI。后期将持续完善&#xf…

新华三H3CNE网络工程师认证—OSPF路由协议

OSPF是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的IGP协议之一。本博客将对OSPF路由协议进行总结。 OSPF目前针对IPv4协议使用的是OSPFVersion2(RFC2328)&#xff1b; 针对IPv6协议使用OSPFVersion3(RFC2740)。如无特殊说明本章后续所指的OSPF均为OSPF Versi…

使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画 在计算机图形学和动画领域&#xff0c;模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型&#xff0c;创建一个动态的3D海浪动画。通过叠加多个波浪&#xff0c;我们可以生成复…

行为设计模式 -命令模式- JAVA

命令模式 一.简介二. 案例2.1 接收者&#xff08;Receiver&#xff09;2.2 命令接口实现对象&#xff08;ConcreteCommand&#xff09;2.3 调用者&#xff08; invoker&#xff09;2.4 获取Receiver对象2. 5 装配者客户端测试 三. 结论3.1 要点3.2 示例 一.简介 百度百科&…

HarmonyOS第一课——HarmonyOS介绍

HarmonyOS第一课 HarmonyOS介绍 HarmonyOS是新一代的智能终端操作系统&#xff08;泛终端服务的载体&#xff09;&#xff1b; 智慧互联协同&#xff0c;全场景交互体验&#xff1b; 核心技术理念&#xff1a; 一次开发 多次部署&#xff1a; 预览 可视化开发UI适配 事件交…

Go 语言基础教程:6.条件判断

在这篇教程中&#xff0c;我们将通过一个简单的 Go 语言程序来学习条件判断结构的使用。以下是我们要分析的代码&#xff1a; package mainimport "fmt"func main() {if 7%2 0 {fmt.Println("7 is even")} else {fmt.Println("7 is odd")}if 8…

C++基础;来点人机交互

我们当然不能只满足单纯的输出&#xff0c;当打开一个编程的大门&#xff0c;宣告自己来时&#xff0c;我们更愿意看到它也能作出反应。 #include<iostream> #include<vector> #include<string> #include<algorithm> #include<cmath>using nam…

js基础入门篇

1.输出语句&#xff0c;内部样式&#xff0c;外部样式&#xff0c;数组定义 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

操作系统Linux指令

1.注册表文件是Windows操作系统中的一种特殊文件&#xff0c;主要用于存储系统设置和用户配置信息。 这些文件通过REG文件扩展名进行标识&#xff0c;用户可以通过双击REG文件将其内容导入注册表中&#xff0c;从而对系统设置进行修改。 REG文件的特点是功能强大、灵活&#xf…

Linux -- 进程间通信、初识匿名管道

目录 进程间通信 什么是进程间通信 进程间通信的一般规律 前言&#xff1a; 管道 代码预准备&#xff1a; 如何创建管道 -- pipe 函数 参数&#xff1a; 返回值&#xff1a; wait 函数 参数&#xff1a; 验证管道的运行&#xff1a; 源文件 test.c &#xff1a; m…

Python•for

很高兴认识你 for列表字典打印字典默认打印格式控制格式打印字典 定义输入与打印拓展 range()函数元组集合 加油站&#x1f970; 都是用示例帮助理解哦~ 代码都只给图片哦&#xff0c;本人亲身经历&#xff0c;自己手敲会注意到更多细节&#x1fae7; 一起进步吧&#x1f970; …

(二十二)、k8s 中的关键概念

文章目录 1、总体概览2、第一层&#xff1a;物理机、集群、Node、Pod 之间的关系2、第二层&#xff1a;命名空间 Namespace3、定义4、控制平面&#xff08;Control Plane&#xff09;5、特别的概念 Service6、Deployment 经过 之前几篇文章对 k8s 的实践&#xff0c;结合实践&…

立仪科技:光谱共焦传感器在玻璃领域的革命性突破

光谱共焦传感器&#xff0c;一种基于光谱共焦原理的高精度位移测量装置&#xff0c;近年来在玻璃等透明材料的厚度测量和表面形貌检测中展现出了巨大的应用潜力。立仪科技小编将深入探讨光谱共焦传感器在玻璃测量中的技术优势&#xff0c;并分析其解决方案。 一、光谱共焦传感器…

庆祝程序员节:聊一聊编程语言的演变

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

毕业设计 基于STM32单片机健康检测/老人防跌倒系统 心率角度检测GSM远程报警 (程序+原理图+元件清单全套资料)

文章目录 前言一、主要功能介绍二、硬件设计硬件实物展示 三、软件设计四、总结资料与实物获取方式 前言 近年来&#xff0c;毕业设计和答辩的要求与难度逐渐加大&#xff0c;传统的毕业设计题目往往缺乏创新性和亮点&#xff0c;难以满足毕业答辩的标准。 为了帮助大家顺利完…