草庐IT

是不是Jenkins大神,看这几个技巧就够

爱吃 香菜 2024-04-26 原文

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服务器。

还原备份:

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以加入我们的QQ群:746506216,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。


资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

有关是不是Jenkins大神,看这几个技巧就够的更多相关文章

  1. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  2. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  3. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  4. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  5. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e

  6. ruby-on-rails - Rails 格式验证——字母数字,但不是纯数字 - 2

    什么是测试格式验证的最佳方法让我们说一个用户名,使用字母数字的正则表达式,但不是纯数字?我一直在我的模型中使用以下验证validates:username,:format=>{:with=>/^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i}数字用户名(例如“342”)通过了验证,这是我不想要的。 最佳答案 您想“向前看”一封信:/\A(?=.*[a-z])[a-z\d]+\Z/i 关于ruby-on-rails-Rails格式验证——字母数字,但不是纯数字,我们在Sta

  7. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

  8. ruby - 更改 $LOAD_PATH 时,为什么使用 unshift 而不是 push? - 2

    我发现ruby加载路径是一个数组,很多项目都是这样使用的:$:.unshift(File.expand_path("../../lib",__FILE__))可以将本地文件添加到ruby路径数组的前面,方便我们require或者load。所以,我希望知道为什么我们不使用push将文件添加到数组的末尾? 最佳答案 假设您有一个“date.rb”文件(为什么不呢)并且您想要加载这个文件,而不是标准库日期。如果您使用追加,当您调用require'date'时您的文件将永远不会被加载,因为它位于数组的末尾并且标准日期会在之前找到。因此,如果

  9. ruby - 如何排序不是简单的哈希(哈希的哈希) - 2

    我有一个这样的哈希{55=>{:value=>61,:rating=>-147},89=>{:value=>72,:rating=>-175},78=>{:value=>64,:rating=>-155},84=>{:value=>90,:rating=>-220},95=>{:value=>39,:rating=>-92},46=>{:value=>97,:rating=>-237},52=>{:value=>73,:rating=>-177},64=>{:value=>69,:rating=>-167},86=>{:value=>68,:rating=>-165},53=>{:va

  10. ruby - Unicorn 使用 `reload` 而不是 `restart`? - 2

    我在这里对我的部署策略有点困惑,在什么情况下部署时我想向unicorn发送reload信号?例如在我的例子中它会是这样的:sudokill-sUSR2`cat/home/deploy/apps/my_app/current/tmp/pids/unicorn.pid`我一直在通过杀死那个pid来部署我的应用程序,然后通过类似的东西再次启动unicorn:bundleexecunicorn-cconfig/unicorn/production.rb-Eproduction-D我只是想知道为什么要使用重新加载?我可以通过这样做获得部署的任何性能吗? 最佳答案

随机推荐