问题如下:
Caused by:java.io.IOException: No space left on device
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:345)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1793)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744)
at hudson.util.IOUtils.copy(IOTuils.java:40)
at hudson.FilePath.readFromTar(FilePath.java:2318)
背景:
出现这个问题,其实也有好一阵子了,查了硬盘空间之后发布是因为jenkins 当时在部署时,放在了/dev/mapper/centos-root盘,这个盘只有50G,后来项目越来越多,加上构建数太大,之前是保留最近7次构建数,这里提醒大家,jenkins 有提供了回滚功能,所以每个构建记录,其实里面都有保留了你的war包,可见下图:
举个例子,如果有10个项目,对应有10个实例,每个实例保存7个构建数,那个就有至少70个war包, 如果你war包一个几百m,那占用的内存可真的不小;
如果没有多余的硬盘,那只能通过把构建数的值,设小一些,只保留2次或者3次,如果有多余的硬盘空间,那么迁移到更大的硬盘,更能长远解决该问题,以下主要是介绍迁移jenkins 到新地址的操作步骤:
先查询硬盘占用内存:
#df -hl
红框标识的,是要迁移的目标硬盘;
通过查询jenkins 目录下各子目录占用内存大小,可知jobs 和worksapces 两个文件夹的占用量是比较大的
du -h --max-depth=1 /var/lib/jenkins/
以下是最终的目标:将var/lib/jenkins 迁移到 /home/ 目录下,并修改相应的配置;
具体步骤列举如下 ,供同样遇到该问题的人参考:
1、将/var/lib/jenkins 复制到目标目录 /home
cp -rp /var/lib/jenkins/ /home/
注意要加上 p, 代表保留源文件或目录的所有者和组,原封不动复制到目录位置了,如果不加的话,复制成功之后,文件会显示root用户;
当然也可以选择复制之后,再使用chown 命令更改所有者和组:
chown -R /home/jenkins
2、修改/etc/sysconfig/jenkins文件(主要就是修改jenkins 的主目录映射地址)
[root@localhost ]# vim /etc/sysconfig/jenkins
把原来的JENKINS_HOME注释掉,新添加
JENKINS_HOME="/home/jenkins"
3、修改/etc/passwd文件,搜索jenkins定位到位置
jenkins:x:991:986:Jenkins Automation Server:/var/lib/jenkins:/bin/false
改为
jenkins:x:991:986:Jenkins Automation Server:/home/jenkins:/bin/false
4、重新启动jenkins
service jenkins restart
至此,成功将jenkins 迁移到新的硬盘,温馨提醒,操作过程难免有风险,为了保险起见,迁移完成之后,要自己试一下“新建实例”和构建项目,看看是否一切正常,还有新建的实例,是否有在新的workspaces里生成实例文件目录,一切正常之后,才可删除原来的/var/lib/jenkins
5、验证主目录是否修改成功
进入jenkins,在系统管理==》系统设置里可看到主目录是否正确
迁移好之后的内存如下:
PS:
一开始解释这个问题的时候 ,想做这个迁移的工作,但是在修改主目录上费了不少时间和精力,其实就是上面的第二个步骤,原因是因为我从网上找到的教程,都是让我做以下的操作:
用root用户登录 编辑profile文件:vi /etc/profile 在最后加入:export JENKINS_HOME=xxxx 保存,退出后执行:source /etc/profile 让配置生效
本质上应该就是修改全局的环境变量,我通过命令
echo @JENKINS_HOME
确实是有打印出/home/jenkins的地址,但不知道为什么 ,在jenkins的系统设置里,主目录就是不生效,不知道是我操作有问题,还是什么原因,如果有懂的,欢迎讨论交流;