Jenkins 数据备份到 Windows FTP 服务器

背景

在 CentOS 上搭建了 Jenkins 服务,为了防止意外丢失数据,我们需要定期备份 Jenkins 数据。本方案采用 FileZilla Server 作为 FTP 服务器,并使用 lftp 进行数据同步。


1. 安装配置 FileZilla Server(Windows)

在 Windows 上安装并配置 FileZilla Server 以接收 Jenkins 备份数据。

参考:FileZilla Server/Client 的简单使用-CSDN博客

1.1 下载并安装 FileZilla Server

1.2 配置 FTP 用户和共享目录

  1. 添加用户(用于 CentOS 连接 FTP 服务器上传文件)
  2. 设置共享目录,假设目录路径为 F:\FileZillaServer,用于存放备份数据。

最终,FTP 服务器上的 Jenkins 备份目录路径为:

1
F:\FileZillaServer\jenkins_home

2. 安装并配置 FTP 客户端(CentOS)

2.1 在 CentOS 安装 lftp

1
2
sudo yum update -y  # 更新系统(CentOS 7/8)
sudo yum install -y lftp

3. 编写 Jenkins 备份脚本

在 CentOS 服务器上创建 backup_jenkins_ftp.sh,用于定期同步 Jenkins 数据到 FTP 服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

# FTP 配置
FTP_HOST="xxx.22.212.xx"
FTP_USER="autotest"
FTP_PASS="autotest"
FTP_TARGET_DIR="jenkins_home" # Windows FTP 服务器上的目标目录(映射到 F:\FileZillaServer\jenkins_home)

# Jenkins 数据目录(CentOS)
SOURCE_DIR="/var/jenkins_home"

# 日志文件
LOG_FILE="/var/log/jenkins_ftp_backup.log"

# 使用 lftp 进行文件同步
lftp -u $FTP_USER,$FTP_PASS $FTP_HOST <<EOF
set ftp:ssl-allow no # 如果 FTP 服务器不支持 SSL,则禁用 SSL
mirror -R $SOURCE_DIR $FTP_TARGET_DIR # 递归同步 Jenkins 目录到 FTP 服务器
quit
EOF

# 记录日志
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - 备份成功" >> $LOG_FILE
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - 备份失败" >> $LOG_FILE
fi

3.1 赋予执行权限

1
chmod +x backup_jenkins_ftp.sh

3.2 测试执行

1
sudo ./backup_jenkins_ftp.sh

4. 配置定时任务(Crontab)

为了实现自动备份,我们使用 crontab 定时执行脚本。

4.1 编辑 Crontab 任务

1
crontab -e

添加以下任务,每天凌晨 2 点执行备份:

1
0 2 * * * /home/xxx/jenkins/backup_jenkins_ftp.sh

4.2 重启 Crontab 服务(适用于部分系统)

1
sudo systemctl restart crond

4.3 确认定时任务是否生效

1
crontab -l

5. 可能遇到的问题及解决方案

5.1 脚本执行时报

'': command not found 该问题通常是由于脚本文件包含 Windows 换行符 (\r\n),而 Linux 只支持 \n 造成的。

解决方法:转换文件格式

1
dos2unix backup_jenkins_ftp.sh

如果 dos2unix 未安装,可用 sed 命令处理:

1
sed -i 's/\r$//' backup_jenkins_ftp.sh

5.2 权限问题

若执行时遇到权限不足的错误,可尝试:

1
2
sudo chmod +x backup_jenkins_ftp.sh
sudo chmod 666 /var/log/jenkins_ftp_backup.log

5.3 FTP 连接失败

  1. 检查 FTP 服务器是否开启

    1
    telnet 172.22.212.25 21

    如果连接失败,需检查 Windows 上 FileZilla Server 是否正常运行。

  2. 检查防火墙是否开放 21 端口

    1
    2
    sudo firewall-cmd --add-port=21/tcp --permanent
    sudo firewall-cmd --reload

6. 总结

通过以上步骤,我们完成了 Jenkins 备份到 Windows FTP 服务器的自动化流程,主要包括:

  1. 在 Windows 上安装 FileZilla Server 作为 FTP 服务器。
  2. 在 CentOS 上安装 lftp 并编写同步脚本。
  3. 配置 Crontab 实现每日自动备份。
  4. 处理常见问题,确保备份流程稳定运行。

🎯 至此,Jenkins 数据将每日自动备份至 Windows FTP 服务器,确保数据安全可靠! 🚀


7. 使用备份数据

未来我重新使用 docker-compose.yml 搭建一个 jenkins 服务,使用备份的 jenkins_home 数据重建 Jenkins 服务,主要步骤如下:

首先编写 docker-compose.yml 文件,需要特别注意卷映射配置:

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.2'
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
ports:
- "8080:8080"
- "50000:50000"
volumes:
# 这里的 ./jenkins_home 就是你要放置备份数据的本地目录
- ./jenkins_home:/var/jenkins_home
restart: always

准备备份数据:

  • 在 docker-compose.yml 同级目录下创建 jenkins_home 文件夹
  • 将 Windows FTP 服务器上的备份数据(F:\FileZillaServer\jenkins_home 下的所有内容)复制到这个本地的 jenkins_home 文件夹中

设置正确的权限:

1
2
# Jenkins 容器中的 jenkins 用户的 UID 通常是 1000
sudo chown -R 1000:1000 ./jenkins_home

启动服务:docker-compose up -d

这样启动后,Jenkins 将会:

  • 使用备份数据(包括所有的任务配置、插件、凭据等)
  • 无需重新进行初始化设置
  • 保持原有的所有配置和历史数据

注意事项:

  1. 确保新环境的 Jenkins 版本与备份时的版本兼容,最好使用相同版本
  2. 如果备份数据中包含了特定路径的配置(如工作目录、工具路径等),可能需要根据新环境进行调整
  3. 如果有自定义的环境变量或系统配置,也要在新环境中相应设置
  4. 首次启动可能会稍慢,因为 Jenkins 需要验证所有配置和插件

如果启动过程中遇到问题,可以:

  1. 检查 docker logs jenkins 查看详细日志
  2. 确认文件权限是否正确
  3. 验证所有必要的插件是否都在备份中

对于敏感数据(如凭据),最好再次检查确认是否需要更新或重新配置。


8. 其他

使用 lftpmirror 命令。默认情况下,mirror 命令会进行增量同步,具体行为如下:

  1. 对于新文件:会被传输到目标目录
  2. 对于已存在的文件:
    • 如果源文件(Centos上)比目标文件(Windows上)新,则会覆盖
    • 如果文件未修改(时间戳和大小相同),则会跳过,不会重新传输
  3. 对于已删除的文件:
    • 默认情况下,目标目录中对应的文件不会被删除
    • 如果想删除目标目录中已不存在的文件,需要添加 --delete 参数

可以在脚本中添加一些参数来更精确地控制同步行为,例如:

1
mirror -R --only-newer --ignore-time --size-only $SOURCE_DIR $FTP_TARGET_DIR
  • --only-newer: 只传输新文件或修改过的文件
  • --ignore-time: 忽略时间戳比较,只比较文件大小
  • --size-only: 只比较文件大小来决定是否需要更新
  • --delete: 删除目标目录中在源目录不存在的文件
  • -v: 显示详细的传输信息

如果想在日志中看到具体哪些文件被传输或跳过,可以添加 -v 参数:

1
mirror -R -v $SOURCE_DIR $FTP_TARGET_DIR
0%