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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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