1. 程式人生 > >刪除Jenkins舊的構建來釋放磁碟空間

刪除Jenkins舊的構建來釋放磁碟空間

刪除Jenkins舊的構建來釋放磁碟空間
前言
配置Discard old builds選項
用Configuration Slicing外掛批量配置Discard old builds選項
在Jenkins Server上手工刪除舊的build
移走和JENKINS_HOME相同磁碟分割槽的目錄
刪除沒用的Docker映象
參考文件
刪除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 {} \;
1
比如在$JENKINS_HOME/jobs/[JOB_NAME]/builds 目錄下刪除Build Number為1到7的構建記錄:

find [1-7] -type d -exec rm -rf {} \;
1
移走和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)
1
在每次構建後刪除指定的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
1
2
3
參考文件
https://support.cloudbees.com/hc/en-us/articles/215549798-Deleting-Old-Builds-Best-Strategy-for-Cleanup-and-disk-space-management
https://stackoverflow.com/questions/31389483/find-and-delete-file-or-folder-older-than-x-days
https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes
--------------------- 
作者:nklinsirui 
來源:CSDN 
原文:https://blog.csdn.net/nklinsirui/article/details/80847925 
版權宣告:本文為博主原創文章,轉載請