删除Jenkins旧的构建来释放磁盘空间

删除Jenkins旧的构建来释放磁盘空间

前言

随着Jenkins build的次数增多,JENKINS_HOME目录会占用越来越多的磁盘空间(可以通过du -sh * 命令查看磁盘空间)。

对非容器安装的Jenkins可以通过ps -ef | grep jenkins 查看JENKINS_HOME,对容器化安装的Jenkins可以通过docker inspect jenkins | grep JENKINS_HOME 查看JENKINS_HOME。

这个时候就需要考虑如何删除Jenkins旧的build了。

Jenkins 提供了“Discard old builds”的选项可以配置保留几天/最多几个的build 和 artifacts,缺省这个选项不会勾上。不勾选时,默认值为365,显然这个值过大了。

另外,我们也可以通过命令行在Jenkins server上直接删除旧的build来立即释放磁盘空间。

配置Discard old builds选项

打开一个Jenkins job的Configure页面,勾选上”Discard old builds”,填入Day of keep builds (保留几天的build记录)和Max# of builds to keep (保留最多几个build记录)。

点击Advanced按钮,还可以填入Days of keep artifacts (保留几天的artifact)和 Max# of builds to keep with artifacts (保留最多几个artifacts)。

通常来讲,如果磁盘空间足够,这4个选项设置为15就可以了(也就是两周 + 1天)。

如果磁盘空间不足时,可以将这4个选项都设置为3。

Jenkins job在每次build结束后(无论成功还是失败)都会自动执行discard old builds,这样当下次执行build后,这个job占用的磁盘空间就会被释放。

$JENKINS_HOME/jobs/[JOB_NAME]/builds 目录存储了该Jenkins job的全部构建记录(目录名为Build Number)。

$JENKINS_HOME/jobs/[JOB_NAME]/builds/BUILD_NUMBER/artifacts 目录存储了该次构建的artifact。

用Configuration Slicing插件批量配置Discard old builds选项

如果已经配置了很多Jenkins job,逐个来修改Discard old builds,非常费时费力。好在Jenkins有Configuration Slicing plugin可以批量来配置Jenkins job。

安装好 Configuration Slicing plugin 后,重启Jenkins。

然后打开Manage Jenkins -> Configuration Slicing,分别打开以下菜单,在左边的“Configured Value”中填入新的值。

  • Discard Old Builds Slicer - Days to keep artifacts
  • Discard Old Builds Slicer - Days to keep builds
  • Discard Old Builds Slicer - Max # of builds to keep
  • Discard Old Builds Slicer - Max # of builds to keep with artifacts

比如要配置“Days to keep artifacts”为3天,就在对应Job的那一行的左边的”Configured Value”填入3。

打开Jenkins job的Configure页面,可以看到”Discard old builds”选项的值已经被修改。

亲测Configuration Slicing插件(1.47)可以对Free style类型的Jenkins job进行修改;但是不能对Pipeline类型的Jenkins job进行修改,在配置界面找不到Pipeline类型的Job,手工输入Job名称也无法修改。

在Jenkins Server上手工删除旧的build

如果想立即释放磁盘空间,可以在Jenkins Server上手工删除旧的build。

比如在$JENKINS_HOME/jobs/[JOB_NAME]/builds 目录下删除30天之前的构建记录:

find [1-9]* -type d -mtime +30 -exec rm -rf {} \;

比如在$JENKINS_HOME/jobs/[JOB_NAME]/builds 目录下删除Build Number为1到7的构建记录:

find [1-7] -type d -exec rm -rf {} \;

移走和JENKINS_HOME相同磁盘分区的目录

如果其它磁盘分区还有空间,可以考虑将和JENKINS_HOME相同磁盘分区的其它目录移动到其它磁盘分区(可以通过df -h 查看磁盘分区使用情况)。

比如Maven local repository目录和JENKINS_HOME在同一个磁盘分区,可以考虑将Maven local repository目录移动到另一个磁盘分区,并相应地修改Maven settings.xml中的localRepository。

删除没用的Docker镜像

在用Jenkins调用Docker打镜像后,日积月累,Jenkins server上会累积越来越多的Docker镜像缓存,会占用大量的磁盘空间。

查看Docker镜像缓存占用磁盘空间

通常Docker镜像缓存在/var/lib/docker/overlay ,其中/var/lib/docker 为Docker root directory,overlday 为Storage Driver。

可以运行docker info | egrep -i 'root|storage' 查看Docker root directory和Storage Driver。

运行du -sh /var/lib/docker/overlay 查看Docker镜像缓存占用的磁盘空间大小。

删除全部Docker镜像

如果Jenkins server只是用Docker打镜像,并没有运行容器,可以执行以下命令删除全部Docker镜像:

docker rmi $(docker images -a -q)

在每次构建后删除指定的Docker镜像

在Jenkins Pipeline中最后加入一个”Clean Up”的stage,执行类似以下的命令删除指定的Docker镜像:

# Remove specific image
# docker images | grep ${IMAGE_NAME}  | grep ${IMAGE_TAG} | awk '{print $3}' | xargs docker rmi
docker images | grep 'busybox'  | grep 'latest' | awk '{print $3}' | xargs docker rmi

参考文档

猜你喜欢

转载自blog.csdn.net/nklinsirui/article/details/80847925
今日推荐