使用Jenkins持续集成的一些小经验
持续更新中...
修改 JVM 的内存配置
Jenkins 启动方式有两种方式,一种是以 Jdk Jar 方式运行,一种是将 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: 最大内存的永久保存区域大小这几个参数也不是配置越大越好,具体要根据所在机器实际内存和使用大小配置。
配置优化减少磁盘空间占用
Job 构建历史较多时,如果没有配置好清理策略的话,会导致占用大量磁盘空间,最终可能会因磁盘空间不够而导致构建失败。并且在加载项目配置时,Jenkins也需要花费时间分析历史构建记录,页面加载的耗时会相应的增加。
丢弃旧的构建配置
如上图,配置最大保持 2 天之内的构建,如果超过 2 天的构建,则会在Job 执行前被清理掉,同时配置了最大保持构建数量为 30 个,意思就是如果 2 天内构建次数如果超过 30 次,则最多保留最近执行的 30 个构建。
使用Disk Uasge插件
不建议,会导致服务器卡顿.
定时清理tomcat日志
默认情况下,tomcat每天都会生成新的日志文件,且某些情况下,产生的日志文件体积会非常大,如果长期不清理,日志文件会越来越多,占用很多磁盘空间。
目前的处理方法是在Jenkins新建了一个定时任务,专门用来删除tomcat产生的日志文件。
设置构建超时时间
有些 Job 在执行构建时,由于某些原因导致构建挂起,耗时比较长,而这些长时间挂起的 Job 会导致 Jenkins 内存占用比较大,性能下降,严重的会直接导致 Jenkins 挂掉。所以,我们需要设置构建超时时间来预防这种事情发生,一旦超过一定的时间,要让 Job 自动停止掉,如下:配置视图分类管理 Job
Jenkins 默认视图为 ALL ,即显示所有 Job 列表,如果 Job 比较多的话,找某个 Job 会不太方便,这时候可以通过新建视图的方式,对 Job 进行分类管理,如下,我新建了 “List View” 类型视图 “park”,然后再选择该视图所关联的 Job 就可以了。
image设置全局属性
适当设置全局属性,可以避免在 Job 中重复写一些固定值,例如输出日志地址、接口请求地址等等,而且当固定值需要修改时,只需要修改一次即可,不用去每个 Job 里面修改,方便维护。设置入口为: 系统管理 -> 系统配置-> 全局属性-> Environment variables ,如下图: image统一管理脚本
需要安装Managed script
插件,该插件是为了在管理文件时创建 Script 脚本文件,然后在 Job 中配置直接使用,方便脚本的统一管理和维护。插件安装完成后,进入“系统管理” —> “Managed files” ,点击 “Add a new Config” ,并选择 “Groovy file” 类型,创建一个新的 Groovy 脚本文件,然后输入我们要执行的脚本代码,如下:
这里的脚本可以使用一些 Jenkins 系统的环境变量参数, 如 上图中的
DATA_UPLOAD_PATH
变量就是在全局属性中设置的。
创建完毕后,我们在 Job 中构建处选择 “Execute managed script” 就可以使用这些脚本了。
轻量备份
使用ThinBackup
插件,允许我们对Jenkins配置信息进行全量或增量备份,由于插件不会保存构建历史和构建工件,所备份过程更为快捷,并且无需关闭Jenkins服务器。