Jenkins 版本升級與插件問題深度復盤:從 2.443 到 2.504.3 及功能恢復全解析

前言:問題溯源與升級必要性 在 Jenkins 持續集成體系中,插件生態是其強大功能的核心驅動力。然而,某次例行維護中,團隊對 Jenkins 2.443 環境的插件進行批量升級后,意外觸發連鎖反應 :

  • SSH Server 插件功能完全失效:表現為無法通過 SSH 遠程連接 Jenkins 執行命令,導致依賴此功能的部署任務全部失敗。
  • 任務列表異常:部分 Pipeline 任務在界面消失,但實際配置文件仍存在于 /var/lib/jenkins/jobs 目錄(開發同事們呼啦啦圍過來,一個個著急忙慌地問:“咱 Jenkins 里那流水線任務咋不見了?這是擱哪‘躲貓貓’去啦?快瞅瞅咋回事呀!”)。

經排查發現,這是由于 插件版本與 Jenkins 核心版本兼容性問題 引發的依賴沖突。SSH Server 插件在高版本中移除了對 Jenkins 2.443 某些 API 的支持,而 Jenkins 2.443 自帶的 JDK 8 環境又無法兼容最新插件的 Java 11+ 特性。因此,將 Jenkins 升級到 2.504.3 并同步調整 JDK 環境 成為解決問題的必經之路。

在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
開發同事們呼啦啦圍過來,一個個著急忙慌地問:“咱 Jenkins 里那流水線任務咋不見了?

一、Jenkins 版本升級全流程解析

(一)環境評估與準備

1. 系統信息收集
# 查看當前 Jenkins 版本  
curl -sSL http://localhost:8080/about/ | grep -i "version"  # 確認 JDK 版本  
java -version  # 檢查磁盤空間(升級過程需至少 2GB 可用空間)  
df -h /var/lib/jenkins  # 查看 Jenkins 服務狀態  
systemctl status jenkins  
2. 備份策略制定(黃金法則:先備份,后操作)
# 創建備份目錄(按日期分類存儲)  
mkdir -p /data/backup/jenkins/$(date +%Y%m%d)  # 完整備份 Jenkins 主目錄(含配置、插件、工作區)  
tar -czvf /data/backup/jenkins/$(date +%Y%m%d)/jenkins_full_backup.tar.gz /var/lib/jenkins  # 單獨備份關鍵配置(方便快速恢復)  
cp -r /var/lib/jenkins/{config.xml,jobs,secrets,users} /data/backup/jenkins/$(date +%Y%m%d)/  

(二)不遷移數據的升級方案(適合測試/開發環境)

核心特點:全新部署 Jenkins 2.504.3,不保留舊環境的任務、插件配置,僅用于功能驗證或搭建獨立測試環境。

步驟 1:卸載舊版本(清理軟件包,保留數據目錄備用)
# 停止 Jenkins 服務  
systemctl stop jenkins  # 卸載 Jenkins 軟件包(僅刪除程序文件,不刪除 /var/lib/jenkins 數據)  
apt-get purge jenkins -y  # 驗證殘留文件(確認程序文件已清理)  
find / -name "jenkins" 2>/dev/null | grep -v "/var/lib/jenkins"  
步驟 2:安裝 Jenkins 2.504.3 全新版本
# 添加 Jenkins 官方 GPG 密鑰  
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -  # 添加 Jenkins 軟件源  
echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list  # 更新包索引并安裝指定版本  
apt-get update  
apt-get install jenkins=2.504.3-1.1 -y  # 驗證安裝版本  
jenkins --version  
步驟 3:初始化全新環境(無舊數據遷移)
  1. 啟動服務:systemctl start jenkins
  2. 訪問初始化頁面:http://<IP>:8080
  3. /var/lib/jenkins/secrets/initialAdminPassword 獲取臨時密碼
  4. 選擇“安裝推薦插件”(需重新配置所有任務、節點及插件參數,與舊環境完全隔離)

(三)遷移數據的升級方案(生產環境首選)

核心特點:保留舊環境的任務配置、構建歷史、插件數據,通過覆蓋升級實現平滑過渡,確保業務連續性。

步驟 1:備份舊數據(關鍵命令復用)
# 停止服務并備份完整數據(默認路徑通用化)  
systemctl stop jenkins  
tar -czvf /data/backup/jenkins_backup_$(date +%Y%m%d).tar.gz /var/lib/jenkins  
步驟 2:替換 Jenkins 核心程序(WAR 包覆蓋)
# 下載 2.504.3 版本 WAR 包(覆蓋舊版本)  
wget https://get.jenkins.io/war-stable/2.504.3/jenkins.war -O /usr/share/jenkins/jenkins.war  # 調整文件權限(確保 Jenkins 服務用戶可訪問)  
chown jenkins:jenkins /usr/share/jenkins/jenkins.war  
chmod 644 /usr/share/jenkins/jenkins.war  
步驟 3:數據兼容性處理(避免遷移后異常)
# 修復目錄權限(新版本對權限要求更嚴格)  
find /var/lib/jenkins -type d -exec chmod 755 {} \;  
find /var/lib/jenkins -type f -exec chmod 644 {} \;  # 敏感目錄單獨加固(密鑰、證書等)  
chmod 700 /var/lib/jenkins/secrets  
chmod 600 /var/lib/jenkins/secrets/*  
步驟 4:啟動并驗證數據遷移結果
# 啟動服務并監控日志(觀察數據加載情況)  
systemctl start jenkins  
journalctl -u jenkins -f  # 驗證版本及數據完整性  
# 1. 版本檢查  
curl -sSL http://localhost:8080/about/ | grep -i "version"  
# 2. 界面檢查:訪問 Jenkins 確認任務列表、構建歷史是否完整  
步驟 5:數據回滾準備(異常時緊急恢復)

若遷移后出現不可修復的錯誤,可通過備份回滾至舊版本:

# 停止新服務  
systemctl stop jenkins  
# 刪除當前數據目錄  
rm -rf /var/lib/jenkins  
# 從備份恢復舊數據  
tar zxf /data/backup/jenkins_backup_$(date +%Y%m%d).tar.gz -C /  
# 還原舊版本 WAR 包并啟動  
wget https://get.jenkins.io/war-stable/2.443/jenkins.war -O /usr/share/jenkins/jenkins.war  
systemctl start jenkins  

二、插件升級與依賴沖突修復

(一)SSH Server 插件問題復現與分析

在 Jenkins 2.443 環境中,SSH Server 插件高版本(如 1.10+)會出現以下錯誤:

java.lang.NoClassDefFoundError: org/apache/commons/exec/ExecuteException  at hudson.plugins.sshslaves.SSHLauncher.launch(SSHLauncher.java:856)  ...  
Caused by: java.lang.ClassNotFoundException: org.apache.commons.exec.ExecuteException  

這是因為 Jenkins 2.443 自帶的 commons-exec 庫版本過低,新插件依賴更高版本導致沖突。

(二)插件修復全流程

1. 插件兼容性矩陣查詢

訪問 Jenkins 插件官網,搜索 SSH Server 插件,查看版本兼容表:

Jenkins 版本SSH Server 兼容版本
2.443≤ 1.9
2.504.31.10+
2. 分步修復操作
停止 Jenkins
備份插件目錄
刪除沖突插件文件
啟動 Jenkins
通過 UI 重新安裝插件
驗證功能
3. 實操命令
# 1. 停止服務并備份插件目錄  
systemctl stop jenkins  
cp -r /var/lib/jenkins/plugins /data/backup/jenkins/$(date +%Y%m%d)/plugins_backup  # 2. 刪除沖突插件(SSH Server 及依賴)  
rm -rf /var/lib/jenkins/plugins/{ssh-slaves*,ssh-server*,publish-over-ssh*}  # 3. 啟動 Jenkins(自動重建插件依賴)  
systemctl start jenkins  # 4. 界面操作:  
#    - 訪問 http://<IP>:8080/pluginManager/available  
#    - 搜索并安裝 "SSH Slaves" "SSH Server" "Publish Over SSH" 最新兼容版  
#    - 重啟 Jenkins 生效  

三、JDK 版本升級與適配

(一)Jenkins 2.504.3 對 JDK 的要求

根據 官方文檔:

  • 最低要求:JDK 11
  • 推薦配置:JDK 17(性能優化更佳)

(二)JDK 17 安裝與配置

# 1. 添加 Adoptium 軟件源(獲取最新 LTS JDK)  
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc  
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print $2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list  # 2. 安裝 JDK 17  
apt-get update  
apt-get install temurin-17-jdk -y  # 3. 配置 Jenkins 使用新 JDK  
echo "JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64" >> /etc/default/jenkins  # 4. 重啟 Jenkins 服務  
systemctl restart jenkins  

(三)驗證 JDK 切換結果

# 查看 Jenkins 運行時 JDK 版本  
ps -ef | grep jenkins | grep java  # 或通過 Jenkins 腳本控制臺驗證  
# 訪問 http://<IP>:8080/script  
# 執行:println System.getProperty("java.version")  

四、Jenkins 與 JDK 版本對應關系詳解

(一)官方版本矩陣(截至 2025 年 7 月)

Jenkins 版本范圍最低 JDK 要求推薦 JDK 版本關鍵說明
2.361.x 及以下JDK 8JDK 8最后支持 JDK 8 的版本系列,2025 年后不再維護
2.362.x - 2.460.xJDK 11JDK 11過渡版本,部分插件仍兼容 JDK 8,但推薦遷移至 JDK 11
2.461.x 及以上JDK 11JDK 17全面支持 JDK 17,部分新特性依賴 JDK 17 功能(如 GraalVM 優化)

(二)版本兼容性查詢工具

  1. Jenkins 官方兼容性頁面:https://www.jenkins.io/doc/administration/requirements/java/
  2. 插件兼容性檢查器:在 Jenkins 界面執行腳本:
    import jenkins.model.*  
    def jenkins = Jenkins.getInstance()  
    jenkins.getPluginManager().getPlugins().each { plugin ->  println "${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}"  println "  Required Jenkins Version: ${plugin.getRequiredCoreVersion()}"  
    }  
    

五、問題復盤與預防措施

(一)故障根因分析

  1. 插件升級策略失誤:未遵循“先升級 Jenkins 核心,再升級插件”的原則
  2. 版本兼容性檢查缺失:未驗證 SSH Server 插件高版本與 Jenkins 2.443 的兼容性
  3. JDK 環境過時:Jenkins 2.443 默認使用 JDK 8,無法支持新插件的 Java 11+ 特性

(二)預防措施清單

  1. 升級前檢查清單

    • 查閱 Jenkins 版本升級指南
    • 使用 Plugin Compatibility Tool 掃描環境
    • 在測試環境完全復現生產環境配置后再升級
  2. 漸進式升級策略

    生產環境升級流程:  
    測試環境驗證 → 小范圍灰度發布 → 全量升級 → 72 小時觀察期  
    
  3. 監控與告警優化

    • 在 Jenkins 中安裝 Monitoring 插件
    • 配置關鍵指標告警(如插件加載失敗、系統日志異常)

六、總結與經驗教訓

本次升級事故暴露出持續集成系統維護中的三大痛點:

  1. 版本管理復雜性:Jenkins 生態中,核心版本、插件版本、JDK 版本需三維協同
  2. 依賴排查困難:插件間隱性依賴關系難以通過單一工具完全識別
  3. 回滾機制缺失:未預先準備可快速回滾的備份策略

通過本次實踐,我們建立了標準化的 Jenkins 升級流程,特別是針對插件依賴沖突的檢測與修復機制。后續將通過自動化工具(如 Jenkins Job DSL)實現升級過程的可重復驗證,確保持續集成體系的穩定性。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914493.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ribbon實戰

一、前置知識 1.1 負載均衡定義 負載均衡指的是將網絡請求通過不同的算法分配到不同的服務器上的技術&#xff0c;從而提升系統的性能。 1.2 負載均衡工具 負載均衡工具可以分分為客戶端負載均衡工具和服務端負載均衡工具&#xff0c;它們的區別如下。 表1-1 負載均衡工具…

cs285學習筆記(一):課程總覽

根據 Fall 2023 學期的官方課程日程&#xff0c;這里是 CS?285 全課程的 Lecture 大綱及內容摘要&#xff0c;詳細對應周次和主題&#xff0c;方便你快速定位每節課要點、相關作業與視頻資源 &#x1f3af; 官方課程地址 YouTobe 視頻地址 blibli視頻(帶中文字幕) &#x…

OkHttp SSE 完整總結(最終版)

1. SSE 基礎概念 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09;是一種 Web 標準&#xff0c;允許服務器向客戶端推送實時數據。 核心特點 單向通信&#xff1a;服務器 → 客戶端 基于 HTTP 協議&#xff1a;使用 GET 請求 長連接&#xff1a;連…

聚寬sql數據庫傳遞

自建數據庫從聚寬到Q-MT自動化交易實戰 從接觸聚寬以來一直都是手動跟單&#xff0c;在網上看到許多大佬的自動交易文章&#xff0c;心里也不禁十分癢癢。百說不如一練&#xff0c;千講不如實干。經過一番努力&#xff0c;終于成功實盤了&#xff0c;效果還可以&#xff0c;幾…

es里為什么node和shard不是一對一的關系

提問&#xff1a; 既然多個shard會被分配到同一個node上&#xff0c;那么為什么不把多個shard合并成一個然后存在當前node上呢&#xff0c;簡而言之也就是讓node和shard形成一對一的關系呢 &#xff1f;非常好的問題&#xff0c;這正是理解Elasticsearch分片&#xff08;shard…

淺談npm,cnpm,pnpm,npx,nvm,yarn之間的區別

首先做一個基本的分類 名稱描述npm,cnpm,yarn,pnpm都是Javascript包管理器nvm是Node.js版本控制器npx命令行工具 I.npm,cnpm,yarn,pnpm npm (Node Package Manager) npm是Node.js默認的包管理器&#xff0c;隨Node.js的安裝會一起安裝。使用npm可以安裝&#xff0c;發布&…

滑動窗口-76.最小覆蓋子串-力扣(LeetCode)

一、題目解析1.不符合要求則返回空串("")2.子串中重復字符的數量要不少于t中該字符的數量二、算法原理解法1&#xff1a;暴力枚舉哈希表這里的暴力枚舉也可以優化&#xff0c;即在包含t中元素處枚舉&#xff0c;如在A、B和C處開始枚舉&#xff0c;減少不必要的枚舉 解…

從零構建搜索引擎 build demo search engine from scratch

從零構建搜索引擎 build demo search engine from scratch 我們每天都會使用搜索引擎&#xff1a;打開google等搜索引擎&#xff0c;輸入關鍵詞&#xff0c;檢索出結果&#xff0c;這是一次搜索&#xff1b;當打開歷史記錄旁邊的&#x1f50d;按鈕&#xff0c;輸入關鍵詞&#…

pytorch小記(二十九):深入解析 PyTorch 中的 `torch.clip`(及其別名 `torch.clamp`)

pytorch小記&#xff08;二十九&#xff09;&#xff1a;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;一、函數簽名二、簡單示例三、廣播支持四、與 Autograd…

快速分頁wpf

/*沒有在xaml設置上下文window.context是因為 命名空間一直對應不上 所以在xaml.cs 里面綁定*/ <Window x:Class"DataGrid.views.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft…

如何徹底禁用 Chrome 自動更新

如何徹底禁用 Chrome 自動更新 隨著谷歌將 Chrome 瀏覽器版本升級至 138&#xff0c;它即將徹底拋棄對 Manifest V2 擴展的支持。許多用戶希望將瀏覽器版本鎖定在 138&#xff0c;以繼續使用 uBlock Origin、Tampermonkey 等常用擴展。 本文總結了四種有效方法&#xff0c;幫助…

流批一體的“奧卡姆剃刀”:Apache Cloudberry 增量物化視圖應用解析

引言&#xff1a;流批一體&#xff0c;理想與現實的鴻溝 在數據驅動的今天&#xff0c;“實時”二字仿佛擁有魔力&#xff0c;驅使著無數企業投身于流批一體架構的建設浪潮中。我們渴望實時洞察業務變化&#xff0c;實時響應用戶需求。以 Apache Flink 為代表的流處理引擎&…

C# 入門教程(三):詳解字段、屬性、索引器及各類參數與擴展方法

文章目錄一、字段、屬性、索引器、常量1.字段2.屬性2.1 什么是屬性2.2 屬性的聲明2.3 屬性與字段的關系3 索引器4. 常量二、傳值 輸出 引用 數組 具名 可選參數&#xff0c;擴展方法2.1 傳值參數2.1.1 值類型 傳參2.1.2 引用類型 傳參2.2 引用參數2.2.1 引用參數-值類型 傳參2.…

《美術教育研究》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答&#xff1a;問&#xff1a;《美術教育研究》是不是核心期刊&#xff1f;答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。問&#xff1a;《美術教育研究》級別&#xff1f;答&#xff1a;省級。主管單位&#xff1a; 安徽出版集團有限責任公司 主辦…

每日算法刷題Day47:7.13:leetcode 復習完滑動窗口一章,用時2h30min

思考: 遇到子數組/子字符串可以考慮能不能用滑動窗口&#xff0c; 定長:逆向思維,答案不定 最大長度/最小長度:一般求長度 越長越合法/越短越合法/恰好:一般求數量 主要思考窗口條件成立&#xff0c; 判斷條件是符合窗口條件(最小長度/越長越合法還是不符合(最大長度/越短越合法…

電流驅動和電壓驅動的區別

理解電流驅動和電壓驅動的區別對電路設計至關重要&#xff0c;尤其在高速、高抗噪要求的場景&#xff08;如LVDS&#xff09;。以下是兩者的核心對比&#xff1a;一、電壓驅動 (Voltage Drive) 核心原理&#xff1a; 驅動器輸出一個受控的電壓&#xff08;與負載阻抗無關&#…

宿舍電費查詢——以ZUA為例

宿舍電費查詢——以ZUA為例0. 安裝抓包環境手機端桌面端1. 登錄1.1 開啟抓包后進入繳費頁面&#xff1a;1.2 分析請求1.3 編寫登錄代碼2. 獲取樓棟及房間ID2.1 獲取樓棟ID2.2 編寫獲取樓棟ID代碼2.3 獲取房間ID2.4 編寫獲取房間ID代碼3. 獲取剩余電費&#xff1a;3.1 選擇房間號…

vue中計算屬性的介紹

Vue.js 中的計算屬性是基于它的響應式系統來實現的&#xff0c;它可以根據 Vue 實例的數據狀態來動態計算出新的屬性值。在 Vue 組件中&#xff0c;計算屬性常用于對數據進行處理和轉換&#xff0c;以及動態生成一些需要的數據。一、使用方式1.定義計算屬性&#xff1a; 在Vue組…

MFC UI控件CheckBox從專家到小白

文章目錄CheckBox勾選框控件控件與變量綁定控件點擊消息映射互斥CheckBox勾選框控件 控件與變量綁定 方案一&#xff1a; BOOL m_bEnable1; BOOL m_bEnable2; void A::DoDataExchange(CDataExchange* pDX) {DDX_Check(pDX, IDC_CK_1, m_bEnable1);DDX_Check(pDX, IDC_CK_2, …

阿爾卡特ACT 250 ATP 150 AND ATP 400 分子泵控制器TURBOMOLECULAR PUMP CONTROLLER ALCATEL

阿爾卡特ACT 250 ATP 150 AND ATP 400 分子泵控制器TURBOMOLECULAR PUMP CONTROLLER ALCATEL