Jenkins 离线升级
1. 环境说明
环境 A:
- jenkins 版本:2.253
- 使用 systemctl 管理的 jenkins 服务
环境 B:
可以上网的机器,装有 docker-compose
docker 和 docker-compose 安装,这里都略了。
2. 安装旧版本
2.1 环境 A jenkins 目录打包文件
打包需要的文件放在 /tmp 目录下待下载:
/home/jenkins/ # jenkins 数据目录
tar -cvf jenkins.tar --exclude='caches' --exclude='jobs' --exclude='logs' --exclude='nodes' --exclude='workspace' *
mv jenkins.tar /tmp/
然后把 jenkins.tar
下载,并传输到 B 环境机器上。
2.2 环境 B 机器安装旧版本 jenkins
在 B 环境机器上,上传下载的 jenkins.tar
到 /tmp/
下,解压准备好 jenkins_home
。
mkdir -p /data/tmp/jenkins/data
cd /data/tmp/jenkins/data
tar -xvf /tmp/jenkins.tar
cd ../..
chown 1000.1000 -R jenkins/
使用 docker-compose 安装旧版本 jenkins。
/data/tmp/docker-compose.yml
:
version: '3.1'
networks:app:services:jenkins:image: harbor.ygqygq2.com/proxy/jenkins/jenkins:2.253-centos7restart: always# user: rootnetworks:- appenvironment:- TZ=Asia/Shanghai- JAVA_OPTS=-Duser.timezone=Asia/Shanghai- JENKINS_ARGS="--sessionTimeout=86400"volumes:- ./jenkins/sudoers.d:/etc/sudoers.d- ./jenkins/data:/var/jenkins_home#- ./jenkins/war:/usr/share/jenkins- ./jenkins/caches:/caches- /var/run/docker.sock:/var/run/docker.sockports:- "8090:8080"
启动,并浏览器登录 B 环境,注意端口
cd /data/tmp
docker-compose up -d
docker-compose ps
使用环境 A 的 jenkins 管理员用户密码,在浏览器登录后,滑到最底部查看 jenkins 版本,看是否和旧版本一致。
3. 环境 B jenkins 升级插件
前面登录 jenkins 后,如果版本和旧版本一致,则成功启动。进入插件升级管理界面,先选择 “全选” 插件升级,但不勾选 “安装完成后重启Jenkins”。
然后编辑 /data/tmp/docker-compose.yml
,修改镜像 tag 为当前最新稳定版,比如当前为 2.452.3-lts
version: '3.1'
networks:app:services:jenkins:image: harbor.ygqygq2.com/proxy/jenkins/jenkins:2.452.3-ltsrestart: always# user: rootnetworks:- appenvironment:- TZ=Asia/Shanghai- JAVA_OPTS=-Duser.timezone=Asia/Shanghai- JENKINS_ARGS="--sessionTimeout=86400"volumes:- ./jenkins/sudoers.d:/etc/sudoers.d- ./jenkins/data:/var/jenkins_home#- ./jenkins/war:/usr/share/jenkins- ./jenkins/caches:/caches- /var/run/docker.sock:/var/run/docker.sockports:- "8090:8080"
重启容器:
cd /data/tmp
docker-compose up -d
docker-compose ps
4. 环境 B jenkins 问题处理
docker logs -f
查看日志,并且看浏览器是否能访问和登录。
- 如果遇到访问和登录问题,一般是插件不兼容,查看日志,把不兼容的插件文件从
/data/tmp/jenkins/data/plugins/
插件目录中移出去,并且使用 docker 命令手动重启容器,直到能登录并且能更新插件为止;- 根据移出去的插件名再从插件管理界面搜索安装;
- 最后把插件再升级到兼容版本最新;
- 看看插件管理界面有什么提示和未启动的插件原因;
比如:
因为 LTS 的版本更新较慢,插件是跟着最新版本的,有时候会不兼容 LTS 版本。所以,使用 war 包方式将 jenkins 升级。
先把原 war 包目录拷出来备份
# 56 是 docker ps 看到的容器 id
docker cp 56:/usr/share/jenkins jenkins/war_bak
下载最新版本 jenkins war包到 /data/tmp/jenkins/war/
下
mkdir -p /data/tmp/jenkins/war/ref
wget https://updates.jenkins.io/download/war/2.467/jenkins.war -O /data/tmp/jenkins/war/jenkins.war
chown 1000.1000 -R /data/tmp/jenkins/war/
取消 /data/tmp/docker-compose.yml
中 war 目录那行的注释,让最新 war 包挂载进去。
version: '3.1'
networks:app:services:jenkins:image: harbor.ygqygq2.com/proxy/jenkins/jenkins:2.452.3-ltsrestart: always# user: rootnetworks:- appenvironment:- TZ=Asia/Shanghai- JAVA_OPTS=-Duser.timezone=Asia/Shanghai- JENKINS_ARGS="--sessionTimeout=86400"volumes:- ./jenkins/sudoers.d:/etc/sudoers.d- ./jenkins/data:/var/jenkins_home- ./jenkins/war:/usr/share/jenkins- ./jenkins/caches:/caches- /var/run/docker.sock:/var/run/docker.sockports:- "8090:8080"
重启容器:
cd /data/tmp
docker-compose up -d
docker-compose ps
这时候基本没什么插件问题了,把弃用的插件卸载。
后面就是流水线和设置等的调整测试了。
5. 升级 A 环境 jenkins
5.1 升级 A 环境 jenkins master
环境 B 机器打包 jenkins 目录
cd /data/tmp/
tar -cvf jenkins.tar jenkins/
然后下载 jenkins.tar
上传到环境 A 机器 /tmp
下
因为前面环境 A 机器打包过滤了这些目录,这些为任务、节点和工作目录,所以新版本的 jenkins 目录,把这几个目录拷贝过来先放好。--exclude='caches' --exclude='jobs' --exclude='logs' --exclude='nodes' --exclude='workspace'
mkdir -p /data/docker/jenkins/data
rsync -avz /home/jenkins/{caches,jobs,logs,nodes,workspace} /data/docker/jenkins/data/# 解压 /tmp/jenkins.tar
cd /data/docker/
tar -xvf /tmp/jenkins.tarchown 1000.1000 -R /data/docker/jenkins
在 docker-compose 配置中添加上 jenkins 相关配置,注意这里使用的是 8090 端口,目的是不影响现有的 jenkins 8080 端口,等 8090 测试 ok 后,再关掉原来的 8080 端口,替换 8090 成 8080 端口完成升级。
/data/docker/docker-compose.yml
version: '3.1'
networks:app:services:jenkins:image: harbor.ygqygq2.com/proxy/jenkins/jenkins:2.452.3-ltsrestart: always# user: rootnetworks:- appenvironment:- TZ=Asia/Shanghai- JAVA_OPTS=-Duser.timezone=Asia/Shanghai- JENKINS_ARGS="--sessionTimeout=86400"volumes:- ./jenkins/sudoers.d:/etc/sudoers.d- ./jenkins/data:/var/jenkins_home- ./jenkins/war:/usr/share/jenkins- ./jenkins/caches:/caches- /var/run/docker.sock:/var/run/docker.sockports:- "8090:8080"
镜像传到环境 A 机器可以通过导出导入方式,或者传到内网镜像仓库,从内网镜像仓库拉,目的是保证环境 A 机器上有这个最新的 jenkins 镜像。
启动容器:
cd /data/tmp
docker-compose up -d
docker-compose ps
报错
原因是 docker 版本较旧,升级 docker 版本,或者增加参数:
security_opt:- seccomp:unconfined
现在应该可以启动了。
5.2 升级 A 环境 jenkins node
登录 jenkins 后,可以看到 Node 已经连不上。
先更新 node 的 jdk,更新为 openjdk17,下载链接
环境变量
JAVA_HOME=/opt/java/jdk
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
jdk 放好
cd /tmp
wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/17.0.11+9/openlogic-openjdk-17.0.11+9-linux-x64.tar.gz
tar -zxvf openlogic-openjdk-17.0.11+9-linux-x64.tar.gz
mv /tmp/openlogic-openjdk-17.0.11+9-linux-x64 /opt/java/openjdk-17.0.11
ln -s /opt/java/openjdk-17.0.11 /opt/java/jdk
然后节点设置指定这个 jdk 就可以启动了。
因为我们 jenkins master 是使用 docker 方式启动的,流水线中不少步骤还是使用原来的宿主机。我们添加一个 agent,宿主机作为 master agent,而真正的 master 则不添加标签,以此作为过度阶段。
比如
- 通过在 Jenkins 的管理界面中,进入“系统配置”或“全局安全配置”;
- 确保已经启用了代理的安全配置,比如“TCP 端口用于 JNLP 代理”选项不是设置为“禁用”;
- 使用固定端口 50000,因为 docker-compose 也得暴露出来;
- 这个
local-host
节点的标签设置为 master; - Built-In Node 节点的标签设置为空;
在使用 ssh 的地方,还有个安全设置要注意,比如使用 ssh 方式检出代码,如果不设置成 “No verification” 可能会导致无法检出代码。
6. 小结
Jenkins 升级涉及到的东西较多,用的插件、功能越多,流水线依赖越多,升级难度越大。
Jenkins 方案方式的变化也会引起流水线使用的变化,比如很多原来直接使用 master 运行的部分,随着 master 的容器化,里面很多命令和工具都没了,这部分要权衡好,当然像我上面一样将宿主机作为 master 标签也是一个办法。
Jenkins 升级后还需要一段时间的磨合,你可能发现某个功能的写法的变化,某个功能因为安全原因需要增加额外设置或者按安全要求修改。
当然,容器化隔离提供了更安全的环境,各部分使用不同的镜像做到各司其职是更好的实践。
相关文章:

Jenkins 离线升级
1. 环境说明 环境 A: jenkins 版本:2.253使用 systemctl 管理的 jenkins 服务 环境 B: 可以上网的机器,装有 docker-compose docker 和 docker-compose 安装,这里都略了。 2. 安装旧版本 2.1 环境 A jenkins 目录打包文件 …...

Unty 崩溃问题(Burst 1.8.2)
错误代码: Assertion failed on expression: exception SCRIPTING_NULL UnityEngine.StackTraceUtility:ExtractStackTrace () Unity.Burst.BurstCompiler:SendRawCommandToCompiler (string Unity版本:2021.3.17F1,Burst 1.8.2 表现&…...

【大型实战】企业网络实验(华为核心交换、ESXI7.0vmware虚拟机、DHCP中继、服务端网络及用户端网络配置)
需求 实验 vmware网络配置(企业内部一般为ESXI) 这样服务器虚拟机使用192.168.200.X网段才能与用户侧互通 vmware虚拟机配置(DHCP服务器网络配置) 打开网络管理页面 nmtui重置一下网络连接(重启网卡) …...
vue2路由跳转是异步的
在 Vue 2 中,如果你在路由跳转函数中通过路由路径判断路径时,发现路径还是上一个路径,这是因为路由跳转是异步的。为了确保在路由跳转完成后进行判断,你可以使用路由的导航守卫或者 nextTick 来确保获取到最新的路由路径。 使用 …...
第一阶段面试题总结
1. 线程和进程的概念,区别、以及什么时候用线程什么时候用进程 1.1 线程概念 线程是进程中的一个执行单元,一个进程可以包含多个线程 线程是一个轻量级的进程 线程是CPU任务调度的最小单元 1.2 进程概念 进程是一个程序的运行实例,它包含了…...
设计模式(工厂模式,模板方法模式,单例模式)
单例模式: 确保一个类只有一个实例,并提供全局访问点。 单例模式举例: 配置信息类:用于存储应用程序的全局配置信息,例如数据库连接信息、日志配置等。 日志类:用于记录应用程序运行时的日志信息&#x…...
ES6 对象的新增方法(十四)
1. Object.assign(target, …sources) 特性:将一个或多个源对象的所有可枚举属性复制到目标对象。 用法:用于对象属性的合并。 const obj1 { a: 1, b: 2 }; const obj2 { b: 3, c: 4 }; Object.assign(obj1, obj2);console.log(obj1); // 输出&#…...
Spring Boot 学习总结(34)—— spring-boot-starter-xxx 和 xxx-spring-boot-starter 区别?
一、Spring Starter 简介 Spring Starter 是 Spring Boot 提供的一种便捷方式,帮助开发者快速集成和配置 Spring 应用中所需的依赖。每个 Starter 都是一个预配置的依赖集,可以自动配置应用的一部分或特定功能。这些 Starter 旨在消除手动编写大量样板代码和配置的需求。 1…...
昇思训练营打卡第二十五天(RNN实现情感分类)
RNN,即循环神经网络(Recurrent Neural Network),是一种深度学习模型,特别适用于处理序列数据。以下是对RNN的简要介绍: RNN的特点: 记忆性:与传统的前馈神经网络不同,R…...

昇思25天学习打卡营第02天|张量 Tensor
一、什么是张量 Tensor 张量是一种特殊的数据结构,与数组和矩阵非常相似。张量(Tensor)是MindSpore网络运算中的基本数据结构。 张量可以被看作是一个多维数组,但它比普通的数组更加灵活和强大,因为它支持在GPU等加速…...

权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例
近日,2024全球数字经济大会——数字安全生态建设专题论坛(以下简称“论坛”)在京成功举办。由全球数字经济大会组委会主办,中国信息通信研究院及公安部第三研究所共同承办,论坛邀请多位专家和企业共同参与。 会上颁发…...
24.7.10|暑假-数组题目:实现整数的数字反转【学习记录】
1、题目: 32位有符号整数,将整数每位上的数字进行反转 输入:123 输出:321 输入:-123 输出:-321 输入:120 输出:21 !) 问题 怎么把整数转换成字符串ÿ…...
【ceph】ceph集群-添加/删除mon
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
Django ORM中的Q对象
Q 对象在 Django ORM 中用于构建复杂的查询条件,特别是当你需要使用逻辑运算符(如 AND、OR、NOT)时。以下是一些使用 Q 对象进行复杂查询的实际例子。 Q对象使用 模型 假设我们有一个包含员工信息的模型 Employee: from djang…...

相控阵雷达原理详解
相控阵,即相位控制阵列,通过控制阵列各个单元的馈电相位来改变波束指向。 相控阵雷达的原理可以清晰地归纳为以下几点: 1. 基本构成: - 相控阵雷达,即相位控制电子扫描阵列雷达(Phased Array Radar, PAR&a…...

算法项目报告:物流中的最短路径问题
问题描述 物流问题 有一个物流公司需要从起点A到终点B进行货物运输,在运输过程中,该公司需要途径多个不同的城市,并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间,该公司需要确定经过哪些配送站点ÿ…...
linux中 crontab 定时器用法
*/10 * * * * python3 /home/code/haha2.py Crontab 当然,以下是一个简短的博客,介绍了 Cron 和 Crontab 的用法: --- # 简介:使用 Cron 和 Crontab 在 Linux 中进行定时任务调度 在 Linux 系统中,Cron 是一个用于…...
java算法day16
java算法day16 112 路径总和404 左叶子之和513 找树左下角的值 112 路径总和 题型判定为自顶向下类型,并且为路径和类型。 那就套模板。 自顶向下就是从上到下处理,那么就是前序遍历的思想。 class Solution {boolean res false;public boolean hasP…...

华为HCIP Datacom H12-821 卷41
1.多选题 以下关于BGP Atomic_Aggregate和Aggregator的描述,正确的是哪些项? A、Aggregator属性属于可选过渡属性 B、Atomic_Aggregate属于公认任意属性 C、收到携带Atomic_Aggregate属性的路由表示这条路由不能再度明细化 D、 Agregator表示某条路由可能出现…...

【React Hooks原理 - forwardRef、useImperativeHandle】
概述 上文我们聊了useRef的使用和实现,主要两个用途:1、用于持久化保存 2、用于绑定dom。 但是有时候我们需要在父组件中访问子组件的dom或者属性/方法,而React中默认是不允许父组件直接访问子组件的dom的,这时候就可以通过forwa…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...