迁移目标

把原服务器上的 Jenkins(含插件与凭据)、Docker(镜像/容器/卷/配置)、Maven、JDK 及相关配置平移到一台新服务器,迁移后各工具可无感继续使用,尽量减少停机。

适用对象:基于 Linux 的常见安装(OpenJDK、Apache Maven、Docker CE、OpenSSH、Jenkins LTS)。
假设你能获取到旧机上的数据盘或通过网络把关键目录拷到新机;若旧机彻底不可用,见文末“无可用备份的重建策略”。


一、总体思路(先并行、后切换,保留回滚)

  1. 建立新服务器(相同或兼容的发行版/架构)。
  2. 在新机安装相同主版本的 JDK/Maven/Docker/Jenkins(或先装低版本,恢复后再逐步升级)。
  3. 从旧机拷贝关键数据目录到新机(重点是 JENKINS_HOME、Maven 设置、Docker 卷/Compose 文件等)。
  4. 在新机启动服务做“影子验证”(先不要对外暴露或用临时端口/内网访问)。
  5. 冻结旧机(停止 Jenkins/Docker)、做最终增量同步。
  6. 切换 DNS/反向代理/防火墙到新机。
  7. 验证并观察;保留旧机/快照一段时间以便回滚。

二、需要迁移的关键资产清单

  • Jenkins
    • 目录:$JENKINS_HOME(常见 /var/lib/jenkins)包含:jobs、plugins、users、credentials、secrets、config.xml、节点配置等
    • 外挂脚本、构建工具缓存:/var/lib/jenkins/.m2/var/lib/jenkins/.npm
    • 反代/证书:Nginx/Apache 配置与证书文件(若有)
  • Docker
    • Compose 文件、部署脚本目录(如 /opt/*, /srv/*, 仓库脚本)
    • 数据卷(named volumes)与绑定目录数据
    • Docker 守护进程配置 /etc/docker/daemon.json
    • 私有镜像仓库登录凭据(/root/.docker 或运行账号的 ~/.docker
  • Maven
    • 全局或 Jenkins 用户的 settings.xmlsettings-security.xml
    • 本地仓库缓存(可选)~/.m2/repository
    • Maven 安装目录(若是手动安装,如 /opt/maven
  • JDK
    • 安装目录(包管理安装可重装;手动安装如 /opt/java/* 需要复制)
  • SSH/凭据
    • Jenkins 凭据已经包含在 $JENKINS_HOMEcredentials.xmlsecrets/(务必与 secret.key 一起迁移)
    • 任何部署密钥、Webhook token、机器人账号等

三、信息盘点与导出(旧机仍可访问时)

在旧机执行,收集版本与插件清单,便于新机对齐与追踪。

# 1) 版本信息
uname -a
cat /etc/os-release || lsb_release -a
java -version
mvn -v
docker version
jenkins_ver=$(grep -A1 "<version>" /var/lib/jenkins/config.xml 2>/dev/null | head -n1); echo "$jenkins_ver"

# 2) Jenkins 插件清单(离线也可)
ls -1 /var/lib/jenkins/plugins/*.jpi /var/lib/jenkins/plugins/*.hpi \
  | xargs -n1 basename | sed -E 's/\.(jpi|hpi)$//' > /tmp/jenkins-plugins.txt

# 3) Docker 资产列表
docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}' > /tmp/docker-containers.txt
docker images --format 'table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.Size}}' > /tmp/docker-images.txt
docker volume ls > /tmp/docker-volumes.txt

# 4) 关键配置备份(打包但不含大数据卷)
sudo tar czf /tmp/jenkins_home_meta.tgz \
  --warning=no-file-changed \
  -C /var/lib jenkins \
  --exclude='jenkins/workspace/*/target' \
  --exclude='jenkins/workspace/*/.git' \
  --exclude='jenkins/fingerprints' \
  --exclude='jenkins/cache'

sudo tar czf /tmp/docker_etc.tgz -C / etc/docker
sudo tar czf /tmp/maven_cfg.tgz -C /var/lib/jenkins .m2 || true

把这些文件抄存下来(或随全量数据一起传走)。


四、在新机准备运行环境

先创建同名用户/组,保持路径一致,可减少权限问题。

# 1) 系统准备
sudo useradd -m -s /bin/bash jenkins || true
sudo usermod -aG docker jenkins || true  # 安装 Docker 后再执行

# 2) 安装基础环境(示例:RHEL/CentOS Stream/AlmaLinux)
sudo dnf install -y java-17-openjdk java-17-openjdk-devel
sudo dnf install -y maven git curl wget unzip

# Docker(CE)
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker

# Jenkins(按旧版本或 LTS,对齐更稳妥)
# 参考官方仓库;如需精确版本,可下载相应 rpm/deb 安装

若 Jenkins 通过 Docker 运行,也可以直接用容器方案(见“可选:容器化 Jenkins”)。


五、迁移 Jenkins(文件级恢复,最稳)

  1. 在新机先安装 Jenkins 服务但不要启动,或启动后立即停止:
sudo systemctl stop jenkins || true
  1. 将旧机的 $JENKINS_HOME 完整复制到同一路径(常见 /var/lib/jenkins):
  • 若仍可网络同步(推荐 rsync,支持断点/增量):
# 在新机上执行,从旧机拉数据
sudo rsync -aHAX --delete --numeric-ids -e "ssh -p <PORT>" \
  root@old-server:/var/lib/jenkins/ /var/lib/jenkins/
  • 若通过离线包/磁盘:
sudo tar xzf /path/to/jenkins_home_full.tgz -C /
  1. 权限修正并启动:
sudo chown -R jenkins:jenkins /var/lib/jenkins
sudo find /var/lib/jenkins -type d -exec chmod 755 {} \;
sudo systemctl start jenkins
sudo systemctl status jenkins --no-pager
  1. 登录 Jenkins,核对:
  • 插件是否加载、作业/视图是否在、凭据可用(能拉代码、能推镜像)。
  • Global Tool Configuration 中的 JDK/Maven/Docker 路径是否存在。
  • Manage Nodes & Clouds:代理节点是否在线(如果有,更新控制器地址或入站连接)。
  • 系统设置中的 Jenkins URL、Webhook 回调地址更新为新机域名/IP。

只要 $JENKINS_HOME 连同 secrets/secret.key 一并迁移,凭据会保持可用。


六、迁移 Maven 与 JDK

  • Maven
    • 复制 Jenkins 账号的 .m2(含 settings.xmlsettings-security.xml):
      sudo rsync -a root@old:/var/lib/jenkins/.m2/ /var/lib/jenkins/.m2/
      sudo chown -R jenkins:jenkins /var/lib/jenkins/.m2
      
    • 若旧机是手动安装 Maven 到 /opt/maven,也复制过去并在 Jenkins 工具里指向同路径,或改用包管理版本。
  • JDK
    • 若 Jenkins 工具里是“自动安装”,联网环境下可直接同版本安装;
    • 若是手动目录(如 /opt/java/jdk-17),复制过去并在 Jenkins 全局工具中指向。

七、迁移 Docker(应用与数据)

  • 配置
    • 拷贝 /etc/docker/daemon.json(如含镜像加速、insecure registries),然后 systemctl restart docker
  • 数据
    • 如仅用于构建镜像并推送远端仓库,通常无需迁移 /var/lib/docker(体积大、可重新拉取)。
    • 若本机运行长期容器并有数据卷,需要迁移 Compose 文件与卷数据。

示例:导出/导入 named volume(以 mydata 为例):

# 旧机导出
docker run --rm -v mydata:/data -v $(pwd):/backup alpine \
  tar czf /backup/mydata.tgz -C / data

# 新机导入
docker run --rm -v mydata:/data -v $(pwd):/backup alpine \
  sh -c "cd / && tar xzf /backup/mydata.tgz"

Compose 项目迁移(推荐把所有部署写成 Compose):

# 复制 compose 目录
rsync -a root@old:/opt/myapp/ /opt/myapp/
cd /opt/myapp && docker compose up -d

八、网络与入口

  • 保持与旧机相同的对外端口与路径(Nginx/Apache 反代配置复制)。
  • 切换时优先改 DNS/负载均衡/反代指向新机,而不是改客户端配置。
  • 防火墙/安全组放行新机端口:80/443/8080/50000(Jenkins 代理端口)等。

九、切换与验证清单(可打印)

  • 旧机:停止 Jenkins 与相关容器,确保数据静止
    sudo systemctl stop jenkins
    docker compose -f /opt/*/docker-compose.yml down   # 按需
    
  • 增量同步一次 Jenkins 和卷数据(rsync 再跑一遍)
  • 新机:启动 Jenkins、应用容器
  • 验证
    • Jenkins 首页打开、登录 OK
    • 任一典型流水线完整跑通:拉代码、构建、单测、打包、制品上传、镜像构建推送、部署
    • Webhook 到达新机(检查 GitLab/GitHub 回调 200)
    • 凭据有效(Git/Docker/制品库)
    • 节点在线(若有分布式 Agent)
  • 切换 DNS/反代到新机;观察 1–2 小时
  • 记录变更与打快照;保留旧机只读 7–14 天

十、回滚方案

  • 保留旧机快照或数据包,DNS/反代指回旧机即可回退。
  • Jenkins 若已经产生新数据,回滚需确认流水线与制品的一致性(必要时做只进不退方案:仅在新机继续)。

十一、可选:把 Jenkins 容器化以便未来迁移

使用 Docker 运行 Jenkins,可把迁移简化为“移动一个卷”:

docker run -d --name jenkins \
  -p 8080:8080 -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:lts

迁移时仅需导出 jenkins_home 卷并在新机导入,或使用外部存储/NFS。


十二、旧机已彻底不可用且无备份时的重建思路

  • 新装 Jenkins LTS + JCasC(Configuration as Code),以 YAML 管理 Jenkins 配置与插件版本;
  • 依据项目仓库中的 Jenkinsfile 逐个导入任务;
  • 重新创建凭据(从安全密码库/运维处);
  • Maven/JDK/Docker 安装与镜像仓库配置按本文执行;
  • 后续务必建立定时备份(如下)。

十三、备份与灾备建议(迁移后立刻配置)

  • Jenkins
    • 每日 rsync/tar 备份 $JENKINS_HOME 到对象存储或远端
    • 额外使用 “ThinBackup” 或 “JCasC” + 插件锁版本
  • Docker
    • Git 管理所有 Compose/部署脚本,数据卷定期快照/备份
  • 系统
    • 关键配置 (/etc/*, /opt/*) Git 化或打包
    • 数据盘快照策略:日快照保留 7 天,周快照保留 4 周

附:最小可执行的迁移指令模板

把旧机的 Jenkins 平移到新机(网络可通场景):

# 旧机:暂停 Jenkins,确保一致性
sudo systemctl stop jenkins

# 新机:准备路径与权限
sudo mkdir -p /var/lib/jenkins
sudo chown -R jenkins:jenkins /var/lib/jenkins

# 新机:从旧机拉取
sudo rsync -aHAX --delete --numeric-ids -e "ssh -p 22" \
  root@<old-ip>:/var/lib/jenkins/ /var/lib/jenkins/

# 权限修复并启动
sudo chown -R jenkins:jenkins /var/lib/jenkins
sudo systemctl start jenkins

若还有 Docker Compose 项目及卷,参考第七节的卷迁移与 Compose 启动命令逐个恢复即可。

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务

更多推荐