当前位置: 首页 > news >正文

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 查看日志,并且看浏览器是否能访问和登录。

  1. 如果遇到访问和登录问题,一般是插件不兼容,查看日志,把不兼容的插件文件从 /data/tmp/jenkins/data/plugins/ 插件目录中移出去,并且使用 docker 命令手动重启容器,直到能登录并且能更新插件为止;
  2. 根据移出去的插件名再从插件管理界面搜索安装;
  3. 最后把插件再升级到兼容版本最新;
  4. 看看插件管理界面有什么提示和未启动的插件原因;

比如:
弃用插件

插件不兼容

无法安装

因为 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” 可能会导致无法检出代码。
ssh host key

6. 小结

Jenkins 升级涉及到的东西较多,用的插件、功能越多,流水线依赖越多,升级难度越大。
Jenkins 方案方式的变化也会引起流水线使用的变化,比如很多原来直接使用 master 运行的部分,随着 master 的容器化,里面很多命令和工具都没了,这部分要权衡好,当然像我上面一样将宿主机作为 master 标签也是一个办法。
Jenkins 升级后还需要一段时间的磨合,你可能发现某个功能的写法的变化,某个功能因为安全原因需要增加额外设置或者按安全要求修改。
当然,容器化隔离提供了更安全的环境,各部分使用不同的镜像做到各司其职是更好的实践。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【排序算法】—— 归并排序
  • 海事无人机解决方案
  • 前端开发(基础)
  • 对B-树的理解
  • bug定位策略
  • python连接kafka生产者发送消息
  • Memcached vs Redis——Java项目缓存选择
  • 数据结构-C语言-排序(2)
  • excel系列(二) - 利用 easypoi 快速实现 excel 文件导入导出
  • QQ频道导航退出
  • CV09_深度学习模块之间的缝合教学(4)--调参
  • 自定义 Java ClassLoader:深入探索
  • 13 IP层协议-网际控制报文协议ICMP
  • 人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解
  • 【正点原子i.MX93开发板试用连载体验】录音小程序采集语料
  • Git的一些常用操作
  • Git同步原始仓库到Fork仓库中
  • GraphQL学习过程应该是这样的
  • JS专题之继承
  • Map集合、散列表、红黑树介绍
  • PV统计优化设计
  • Python中eval与exec的使用及区别
  • Sass Day-01
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue 个人积累(使用工具,组件)
  • 编写高质量JavaScript代码之并发
  • 那些年我们用过的显示性能指标
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 使用common-codec进行md5加密
  • MyCAT水平分库
  • 如何用纯 CSS 创作一个货车 loader
  • 如何在招聘中考核.NET架构师
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #13 yum、编译安装与sed命令的使用
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #include
  • (1)Jupyter Notebook 下载及安装
  • (windows2012共享文件夹和防火墙设置
  • (差分)胡桃爱原石
  • (力扣)循环队列的实现与详解(C语言)
  • (十二)Flink Table API
  • (转) Face-Resources
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • *1 计算机基础和操作系统基础及几大协议
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 8 跨平台高性能边缘采集网关
  • .Net IOC框架入门之一 Unity
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 提取注释生成API文档 帮助文档
  • .NET 药厂业务系统 CPU爆高分析
  • .Net 执行Linux下多行shell命令方法
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET的数据绑定