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-centos7
    restart: always
    # user: root
    networks:
      - app
    environment:
      - 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.sock
    ports:
      - "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-lts
    restart: always
    # user: root
    networks:
      - app
    environment:
      - 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.sock
    ports:
      - "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-lts
    restart: always
    # user: root
    networks:
      - app
    environment:
      - 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.sock
    ports:
      - "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.tar

chown 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-lts
    restart: always
    # user: root
    networks:
      - app
    environment:
      - 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.sock
    ports:
      - "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 升级后还需要一段时间的磨合,你可能发现某个功能的写法的变化,某个功能因为安全原因需要增加额外设置或者按安全要求修改。
当然,容器化隔离提供了更安全的环境,各部分使用不同的镜像做到各司其职是更好的实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/800448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

作者:俊达 proxysql作为一个程序,本身也可能出现故障。部署proxysql的服务器也肯能出现故障。高可用架构的一个基本原则是消除单点。 可以在多个节点上部署proxysql,在proxysql之前再加一层负载均衡(如使用LVS或其他技术&#x…

Ubuntu 磁盘扩容

1.下载工具 sudo apt-get install gparted 2.调整大小

14、Python之super star:一颗星、两颗星,满天都是小星星

引言 关于Python系列的文章,已经通过两篇文章,介绍了Python中关于函数的简单使用,包括为什么要使用函数,以及函数中带默认值参数的使用注意事项。 之后,岔开函数的主题,通过几篇番外篇,重点谈…

什么是边缘计算技术和边缘计算平台?

随着物联网、5G技术和人工智能的不断发展,数据的规模和种类也在快速增加。在这种背景下,传统的云计算模式面临着一些问题,例如延迟高、网络拥塞等,这些问题限制了数据的处理速度和效率,降低了用户的使用体验。为了解决…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:consistency)可用性(A:Available)分区容错性(P:Partition Tolerance) 这三个基本要求,最多只能同时满足…

ZGC的流程图

GC标记过程 1、初始标记 扫描所有线程栈的根节点,然后再扫描根节点直接引用的对象并进行标记。这个阶段需要停顿所有的应用线程(STW),但由于只扫描根对象直接引用的对象,所以停顿时间很短。停顿时间高度依赖根节点的数…

Redis的使用(四)常见使用场景-缓存使用技巧

1.绪论 redis本质上就是一个缓存框架,所以我们需要研究如何使用redis来缓存数据,并且如何解决缓存中的常见问题,缓存穿透,缓存击穿,缓存雪崩,以及如何来解决缓存一致性问题。 2.缓存的优缺点 2.1 缓存的…

JMeter进行HTTP接口测试的技术要点

参数化 用户定义的变量 用的时候 ${名字} 用户参数 在参数列表中传递 并且也是${} csv数据文件设置 false 不忽略首行 要首行 从第一行读取 true 忽略首行 从第二行开始 请求时的参数设置: 这里的名称是看其接口需要的请求参数的名称 这里的变量名称就是为csv里面…

SpringBatch文件读写ItemWriter,ItemReader使用详解

SpringBatch文件读写ItemWriter,ItemReader使用详解 1. ItemReaders 和 ItemWriters1.1. ItemReader1.2. ItemWriter1.3. ItemProcessor 2.FlatFileItemReader 和 FlatFileItemWriter2.1.平面文件2.1.1. FieldSet 2.2. FlatFileItemReader2.3. FlatFileItemWriter 3…

低空经济持续发热,无人机培训考证就业市场及前景剖析

随着科技的不断进步和社会需求的日益增长,低空经济已成为全球及我国经济增长的新引擎。作为低空经济的重要组成部分,无人机技术因其广泛的应用领域和显著的经济效益,受到了社会各界的广泛关注。为满足市场对无人机人才的需求,无人…

【动态规划1】斐波那契数列模型篇

文章目录 声明动态规划介绍1137.第N个泰波那契数题目描述分析代码 面试题 08.01. 三步问题题目描述分析代码 746.使用最小花费爬楼梯题目描述分析代码 91.解码⽅法题目描述分析代码 声明 本篇博客为动态规的基础篇,从零开始学习动态规划,如有错误&#…

MATLAB quiver矢量图 设置colorbar

给三维矢量图按照不同高度设置箭头颜色 figure clf X surfaceuz(:,1); Y surfaceuz(:,2); Z surfaceuz(:,3); hold onzcolor jet; % qquiver3(X,Y,Z,X,Y,W) for i 1:length(surfaceuz)quiver3(X(i),Y(i),Z(i),X(i),Y(i), Z(i),...Color,zcolor(floor((Z(i) - -0.1) * 2…

408数据结构-图的应用3-有向无环图、拓扑排序 自学知识点整理

前置知识:表达式,图的遍历 有向无环图描述表达式 有向无环图:若一个有向图中不存在环,则称为有向无环图,简称 D A G DAG DAG图 。 (图片来自王道考研408数据结构2025) 由王道考研-咸鱼学长的讲…

深圳晶彩智能JC3636W518C开箱实现电脑副屏功能

深圳晶彩智能发布了JC3636W518C 这是一款中国制造的,铝合金外壳,价格非常震撼的开发板。原创是billbill的up播主萨纳兰的黄昏设计的ESP32太极小派,由深圳晶彩智能批量生产。 该款 LCD 模块采用 ESP32-S3R8 芯片作为主控,该主控是双核 MCU&…

Vulnhub:DC-1

1.环境搭建 靶机下载地址 将下载的靶机导入到Oracle VM VirtualBox中,设置仅主机模式,使用和kali相同的网卡 2.渗透过程 使用nmap工具进行主机发现扫描 nmap -sn 192.168.56.0/24 发现靶机ip地址,使用nmap工具进行靶机端口扫描 nmap -sS…

一文说透Springboot单元测试

你好,我是柳岸花开。 一、单元测试说明 1 单元测试的优点与基本原则 一个好的单元测试应该具备以下FIRST 原则和AIR原则中的任何一条: 单元测试的FIRST 规则 Fast 快速原则,测试的速度要比较快, Independent 独立原则,…

Qt 多窗体、复用窗口的使用

1.继承自QWidge的窗口的呈现,作为tabPage呈现,作为独立窗口呈现 2.继承自QMainWindow的窗口的呈现,作为abPage呈现,作为独立窗口呈现 1. 继承自QWidge的窗口的呈现 1.1 作为tabPage呈现 void MutiWindowExample::on_actWidgetI…

AI绘画入门实践|Midjourney 提示词的使用技巧

提示词长短 尽可能做到简洁明了。 提示词很短 MJ 出图的随机性更高,创造的内容更有想象力,更适合创意发散的图像生成。 a dog 提示词很长 MJ 出图会更加精准,但描述太过详细,有可能出现AI理解不到位的情况。 越到后面的提示词&…

风险评估:IIS的安全配置,IIS安全基线检查加固

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需…

Java面试八股之Redis集群Cluster

Redis集群Cluster Redis Cluster是一种基于数据分片(Sharding)的分布式缓存和存储系统,它实现了数据的水平扩展、高可用性和自动故障转移。以下是对Redis Cluster模式详细实现流程的描述: 1. 初始化与配置 部署节点&#xff1a…