前言:在 Jenkins 持續集成過程中,構建記錄、工作空間、產物包會不斷積累,既占用磁盤空間,也會讓構建歷史變得臃腫。Jenkins 自帶的“丟棄舊的構建”功能和 Discard Old Build
插件,是兩種常見的構建清理方案。本文將詳細對比兩者,并通過實操演示幫助你選擇最適合的策略。
一、核心對比:Jenkins 自帶功能 vs Discard Old Build 插件
特性 | Jenkins 自帶功能(丟棄舊的構建) | Discard Old Build 插件 |
---|---|---|
安裝依賴 | 無需安裝,Jenkins 默認自帶 | 需要手動安裝(額外維護成本) |
配置難度 | 簡單,Job 配置中直接勾選配置 | 稍復雜,需學習插件專屬策略配置 |
清理策略 | 僅支持 按「構建數量」或「天數」 清理 | 支持更多維度: - 按構建狀態(成功/失敗/不穩定) - 按分支/標簽過濾 - 按磁盤空間閾值觸發 - 多條件組合邏輯 |
實時清理 | 否,需等待新構建觸發后執行清理 | 否,仍需構建觸發,但可結合條件更靈活觸發 |
適用場景 | 單一規則(如 保留最近 3 次構建) | 復雜場景(多分支管理、磁盤保護、差異化保留特定構建) |
風險 | 無額外風險,官方原生功能 | 插件版本更新不及時可能引發 Jenkins 兼容性問題 |
維護成本 | 低(無需關注插件版本) | 中等(需關注插件更新與兼容性) |
二、決策流程圖:如何選擇清理方案?
三、實操:Jenkins 自帶“丟棄舊的構建”功能(簡單場景 + 發布包參數詳解)
場景范例:某項目需實現兩個核心目標:
- 構建記錄層面:僅保留最近 3 次構建記錄,不通過“天數”額外限制;
- 發布包層面:僅保留“最近 1 天內 + 最近 1 次構建”生成的發布包(如
jar
/war
等部署產物),且不刪除最新一次構建的發布包。
步驟 1:進入任務配置頁
- 登錄 Jenkins 平臺,找到目標任務(如截圖中的任務),點擊進入任務詳情頁。
- 點擊左側菜單欄的 “配置” 選項,進入任務配置界面。
步驟 2:配置“構建記錄”的核心保留規則
在配置頁面中,找到并勾選 “丟棄舊的構建”(啟用自動清理功能),然后設置基礎規則:
- 保持構建的天數:清空輸入框(表示“不按‘天數’限制構建記錄的保留周期”)。
- 保持構建的最大個數:輸入
3
(表示“僅保留最近 3 次構建記錄”)。
步驟 3:詳解“發布包專屬參數”(對應截圖中3個參數)
在“丟棄舊的構建”區域,點擊 “高級” 展開發布包配置,以下是對3個參數的詳細解釋:
1. 發布包保留天數
- 作用:僅針對“發布包文件”,按“時間周期”控制保留時長。
- 配置邏輯:若填寫非空值(如當前配置為
1
),則生成超過 1 天的發布包會被自動刪除,但該次構建的日志、操作歷史、測試報告等“非產物類記錄”會被保留。 - 場景匹配:填
1
后,“發布包生成超過 1 天”就會觸發清理,而構建記錄本身(如構建編號、日志)仍由上方“保持構建的最大個數(3)”規則管理。
2. 發布包最大保留#個構建
- 作用:僅針對“發布包文件”,按“構建次數”控制保留數量。
- 配置邏輯:若填寫非空值(如當前配置為
1
),則只保留最近 1 次構建生成的發布包,更早構建的發布包會被自動清理(但不影響構建記錄的保留)。 - 場景匹配:填
1
后,“不管發布包生成多久,僅留最近 1 次構建的發布包”;與“發布包保留天數(1)”形成**“或邏輯”**——發布包“超過 1 天”或“不是最近 1 次構建的”,都會被清理。
3. Remove last build(是否刪除最后一次構建)
- 作用:控制“最新一次構建”的發布包(及關聯資源)是否會被清理規則影響。
- 配置邏輯:
- 選 “是”:最新一次構建的發布包、日志等所有資源,都可能被清理規則刪除(不推薦,會丟失最新版本的追溯性)。
- 選 “否”(當前選中狀態):最新一次構建的發布包、日志等資源不會被清理,僅清理更早的構建相關資源。
- 場景匹配:選“否”,確保“最新一次構建的發布包”始終保留,方便緊急回滾或版本驗證。
步驟 4:保存配置
點擊頁面底部的 “Save” 按鈕,使“構建記錄保留 + 發布包保留”的所有配置生效。
效果驗證邏輯
- 構建記錄:新構建觸發后,若歷史構建數超過 3 次,最舊的構建記錄會被自動清理,最終僅保留最近 3 次。
- 發布包:
- 超過 1 天的發布包,會被“發布包保留天數(1)”清理;
- 非最近 1 次構建的發布包,會被“發布包最大保留#個構建(1)”清理;
- 最新一次構建的發布包,因“Remove last build = 否”,始終保留。
步驟 5:效果驗證
配置保存后,后續每次新構建觸發時,Jenkins 會自動執行分層清理邏輯:
- 構建記錄維度:若歷史構建數量超過 3 次,最舊的構建記錄會被自動刪除,最終僅保留最近 3 次構建的完整元數據(包括構建日志、操作歷史、測試報告等)。
- 發布包維度:
- 生成時間超過 1 天的發布包,會被“發布包保留天數(1)”規則清理;
- 不是“最近 1 次構建”生成的發布包,會被“發布包最大保留#個構建(1)”規則清理;
- 最新一次構建生成的發布包,因“Remove last build = 否”,會始終保留(方便緊急回滾、版本驗證等場景)。
這套配置既通過 構建個數限制 控制了歷史記錄的整體規模,又通過 發布包專屬規則 精細化管理了部署產物的存儲占用,最終實現 輕量化存儲 + 關鍵版本可追溯 的平衡。
四、實操:Discard Old Build 插件(復雜場景)
場景范例:某多分支項目需“保留 main
分支最近 5 次成功構建,其他分支僅保留最近 2 次構建;且當磁盤占用超 80% 時,強制清理所有分支的舊構建”。
步驟 1:安裝 Discard Old Build 插件
- 進入 Jenkins 首頁,點擊左側 “Manage Jenkins” → “插件管理”。
- 切換到 “可選插件” 標簽頁,在搜索框輸入
Discard Old Build
。 - 找到插件后,勾選左側復選框,點擊 “直接安裝”(或“下載待重啟后安裝”,根據 Jenkins 狀態選擇)。
- 等待安裝完成(頁面會顯示安裝進度,完成后可查看“已安裝插件”確認)。
步驟 2:進入任務配置頁
同“自帶功能”步驟 1,進入目標任務(如 MultiBranch-Project
)的配置界面。
步驟 3:配置 Discard Old Build 策略
-
下拉頁面,找到 “構建后操作” 區域,點擊 “添加構建后操作” → 選擇 “Discard old builds (advanced)”(插件提供的高級清理選項)。
-
配置核心策略(以場景需求為例):
- General Settings(通用設置):
Days to keep builds
:留空(不按天數全局限制)。Max # of builds to keep
:留空(不按全局個數限制,改為分支級控制)。
- Branch-Specific Rules(分支特定規則):
點擊 “Add Branch Rule”,配置main
分支規則:Branch Name
:輸入main
(匹配主分支)。Days to keep builds for this branch
:留空。Max # of builds to keep for this branch
:輸入5
。Only keep builds that were successful
:勾選(僅保留成功構建)。
再點擊 “Add Branch Rule”,配置其他分支規則:Branch Name
:輸入.*
(正則表達式,匹配所有分支)。Max # of builds to keep for this branch
:輸入2
。
- Disk Space Trigger(磁盤空間觸發):
勾選Enable disk space trigger
,設置:Free disk space threshold
:輸入20
(表示“剩余磁盤空間 < 20% 時觸發清理”)。- 觸發時的清理規則:可選擇“刪除所有超過 1 天的構建”等(根據需求細化)。
- General Settings(通用設置):
步驟 4:保存配置
點擊頁面底部 “保存” 按鈕,插件配置生效。
效果:
main
分支僅保留最近 5 次成功構建;- 其他分支僅保留最近 2 次構建;
- 當 Jenkins 所在磁盤剩余空間 < 20% 時,自動觸發額外清理邏輯。
五、總結與最佳實踐
- 優先用自帶功能:若需求是“簡單的數量/天數保留”,直接用 Jenkins 自帶功能,無需額外插件,穩定且易維護。
- 插件用于復雜場景:當需要“按狀態、分支、磁盤空間等多維度控制”時,再安裝
Discard Old Build
插件,發揮其靈活性。 - 定期Review:無論用哪種方案,建議每月檢查 Jenkins 工作空間和構建歷史,確保清理策略符合實際存儲需求。
通過本文的對比和實操,你可以根據項目場景,精準選擇構建清理方案,既保證歷史可追溯,又能有效控制磁盤占用~