背景
在 CentOS 上搭建了 Jenkins 服务,为了防止意外丢失数据,我们需要定期备份 Jenkins 数据。本方案采用 FileZilla Server 作为 FTP 服务器,并使用 lftp 进行数据同步。
1. 安装配置 FileZilla Server(Windows)
在 Windows 上安装并配置 FileZilla Server 以接收 Jenkins 备份数据。
参考:FileZilla Server/Client 的简单使用-CSDN博客
1.1 下载并安装 FileZilla Server
- 下载 FileZilla Server 0.9.60.2 中文安装版
- 安装并启动 FileZilla Server,弹出配置窗口:
- 主机:
localhost
- 密码:留空,直接连接
- 主机:
1.2 配置 FTP 用户和共享目录
- 添加用户(用于 CentOS 连接 FTP 服务器上传文件)
- 设置共享目录,假设目录路径为
F:\FileZillaServer
,用于存放备份数据。
最终,FTP 服务器上的 Jenkins 备份目录路径为:
1 | F:\FileZillaServer\jenkins_home |
2. 安装并配置 FTP 客户端(CentOS)
2.1 在 CentOS 安装 lftp
1 | sudo yum update -y # 更新系统(CentOS 7/8) |
3. 编写 Jenkins 备份脚本
在 CentOS 服务器上创建 backup_jenkins_ftp.sh
,用于定期同步 Jenkins 数据到 FTP 服务器。
1 |
|
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 | sudo chmod +x backup_jenkins_ftp.sh |
5.3 FTP 连接失败
检查 FTP 服务器是否开启
1
telnet 172.22.212.25 21
如果连接失败,需检查 Windows 上 FileZilla Server 是否正常运行。
检查防火墙是否开放 21 端口
1
2sudo firewall-cmd --add-port=21/tcp --permanent
sudo firewall-cmd --reload
6. 总结
通过以上步骤,我们完成了 Jenkins 备份到 Windows FTP 服务器的自动化流程,主要包括:
- 在 Windows 上安装 FileZilla Server 作为 FTP 服务器。
- 在 CentOS 上安装 lftp 并编写同步脚本。
- 配置 Crontab 实现每日自动备份。
- 处理常见问题,确保备份流程稳定运行。
🎯 至此,Jenkins 数据将每日自动备份至 Windows FTP 服务器,确保数据安全可靠! 🚀
7. 使用备份数据
未来我重新使用 docker-compose.yml 搭建一个 jenkins 服务,使用备份的 jenkins_home 数据重建 Jenkins 服务,主要步骤如下:
首先编写 docker-compose.yml 文件,需要特别注意卷映射配置:
1 | version: '3.2' |
准备备份数据:
- 在 docker-compose.yml 同级目录下创建 jenkins_home 文件夹
- 将 Windows FTP 服务器上的备份数据(F:\FileZillaServer\jenkins_home 下的所有内容)复制到这个本地的 jenkins_home 文件夹中
设置正确的权限:
1 | # Jenkins 容器中的 jenkins 用户的 UID 通常是 1000 |
启动服务:docker-compose up -d
这样启动后,Jenkins 将会:
- 使用备份数据(包括所有的任务配置、插件、凭据等)
- 无需重新进行初始化设置
- 保持原有的所有配置和历史数据
注意事项:
- 确保新环境的 Jenkins 版本与备份时的版本兼容,最好使用相同版本
- 如果备份数据中包含了特定路径的配置(如工作目录、工具路径等),可能需要根据新环境进行调整
- 如果有自定义的环境变量或系统配置,也要在新环境中相应设置
- 首次启动可能会稍慢,因为 Jenkins 需要验证所有配置和插件
如果启动过程中遇到问题,可以:
- 检查 docker logs jenkins 查看详细日志
- 确认文件权限是否正确
- 验证所有必要的插件是否都在备份中
对于敏感数据(如凭据),最好再次检查确认是否需要更新或重新配置。
8. 其他
使用 lftp
的 mirror
命令。默认情况下,mirror
命令会进行增量同步,具体行为如下:
- 对于新文件:会被传输到目标目录
- 对于已存在的文件:
- 如果源文件(Centos上)比目标文件(Windows上)新,则会覆盖
- 如果文件未修改(时间戳和大小相同),则会跳过,不会重新传输
- 对于已删除的文件:
- 默认情况下,目标目录中对应的文件不会被删除
- 如果想删除目标目录中已不存在的文件,需要添加
--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 |