一、系统概述
1.1 系统作用
bip_patch_deploy.sh 是一款专为 BIP 系统 设计的补丁批量部署与回滚工具。该脚本实现了补丁上传、自动解压、文件备份、安全部署、服务重启的全流程自动化管理,有效提升了运维人员部署补丁的效率和安全性。
1.2 核心功能
| 功能模块 | 描述 |
|---------|------|
| 补丁部署 | 支持批量上传 .zip 格式补丁包,自动识别并部署其中的 fbip 目录内容 |
| 自动备份 | 部署前自动备份待替换的原始文件到指定备份目录 |
| 批量处理 | 一次性处理 patch_upload 目录下的所有补丁包 |
| 回滚机制 | 支持按部署顺序逆序回滚,可恢复单个文件或整个批次 |
| 彩色日志 | 彩色终端输出 + 日志文件双记录,便于问题排查 |
| 服务管理 | 自动停止服务、部署完成后自动重启服务 |
1.3 目录结构
脚本依赖以下目录结构:
bip_home/
└── fbip_deploy_patch/
├── patch_upload/ # 补丁包上传目录
├── patch_collection/ # 已部署补丁归档目录
├── patch_backup/ # 原文件备份目录
├── patch_temp/ # 临时工作目录
├── patch_unzip/ # 补丁解压目录
└── patch_logs/
└── patch_deploy.log # 部署日志
二、技术逻辑详解
2.1 整体流程图

2.2 效果展示
2.2.1 补丁部署

2.2.2 补丁回滚

2.3 核心函数逻辑
2.3.1 echo_color() - 彩色日志函数
# 支持五种日志级别,使用 ANSI 转义码实现彩色输出
# f* → 红底闪烁(致命错误)
# e* → 红色(执行错误)
# w* → 黄色(警告)
# s* → 绿色(成功)
# i* → 蓝色(信息)
- 设计亮点 :同时输出到终端和日志文件,通过
tee -a实现双重记录
2.3.2 get_patch() - fbip目录递归查找
# 核心逻辑:支持3层嵌套目录结构查找 fbip 目录
# source_dir/xxx/fbip/... → 支持
# source_dir/xxx/yyy/fbip/... → 支持
# source_dir/xxx/yyy/zzz/fbip/... → 支持
- 设计亮点:兼容不同压缩包内部结构的补丁包
2.3.3 patch_rollback() - 逆序回滚机制
# 读取 patch_record.txt,按逆序(tac)处理
# 处理顺序:deploy → backup → patch → batch
# 每回滚一条记录即删除对应日志行
2.3.4 deploy_log() - 部署记录
# 格式:时间戳:操作类型:文件路径
# 例如:202405081030:deploy:/bip_home/module/config.json
2.4 数据流设计
补丁包 (.zip)
│
▼
patch_upload/ ──→ 解压 ──→ patch_unzip/
│ │
│ get_patch()
│ │
▼ ▼
patch_temp/ ←────────────────┘
│
├── 备份原文件 ──→ patch_backup/{日期}/
│
└── 部署新文件 ──→ bip_home/
│
▼
patch_collection/ (归档)
三、技术实现难点
3.1 嵌套目录递归查找
问题 :get_patch() 函数需在不同深度的目录层级中查找 fbip 文件夹。
实现方案 :三层嵌套 for 循环 + if 判断,逐层遍历。
代码示例:
shell
for dir1 in $(ls $target_dir);do
if [ "$dir1" == 'fbip' ]; then
cp -a $source_dir/* $target_dir
break
else
for dir2 in $(ls "$source_dir/$dir1");do
if [ "$dir2" == "fbip" ]; then
# 第二层找到
else
for dir3 in $(ls "$source_dir/$dir1/$dir2");do
if [ "$dir3" == "fbip" ]; then
# 第三层找到
局限性:
-
仅支持最多 3 层嵌套
-
依赖目录名精确匹配
fbip -
使用
ls命令在空目录会报错
3.2 路径处理与字符串操作
问题 :从 patch_temp 的相对路径提取实际文件路径。
实现方案:
bak_file=/patch_temp/fbip/core/config.json
# 使用 ${bak_file#*/} 去掉前缀
# 结果:fbip/core/config.json
风险点:
-
bak_file#*/仅删除第一个/前的字符 -
路径包含特殊字符可能导致问题
3.3 服务停止与重启原子性
问题:kill 服务后若部署失败,需要完整的回滚机制。
实现方案:
shell
# 停止服务
ps -ef | grep $fbip82_home | grep -v grep | awk '{print $2}' | xargs kill -9
# 部署失败时触发回滚
if [ $? -ne 0 ]; then
patch_rollback
exit 1
fi
缺陷:
kill -9强制终止,可能导致数据不一致
3.4 重复部署检测
问题:防止同一补丁包被重复部署。
实现方案:
shell
if [[ -f $patch_collection/$file ]]; then
echo_color error "$file --已经部署过了"
rm -rf $patch_upload/$file
continue
fi
局限:
- 仅检测补丁文件名,未校验内容 hash
3.5 回滚顺序控制
问题:回滚需严格按部署逆序进行。
实现方案:
shell
# 使用 tac 逆序读取日志
for pinfo in `cat $patch_record | tac | sed -n '1,/:batch:/p'`;do
IFS=: read -a fields <<< "$pinfo"
# 处理每种操作类型
风险:
-
patch_record.txt被逐行删除(sed -i '$d') -
并行部署时日志顺序可能混乱
四、安全注意事项
-
权限控制:确保脚本仅限管理员用户可执行
bashchmod 700 fbip82_patch_deploy.sh chown root:root fbip82_patch_deploy.sh -
路径注入防护:对用户输入的路径进行校验
bashif [[ "$file" =~ ^[a-zA-Z0-9_-]+\.zip$ ]]; then # 允许部署 fi -
备份验证:回滚前验证备份文件完整性
-
日志脱敏:避免在日志中记录敏感信息
五、总结
bip_patch_deploy.sh 是一个功能完整的补丁部署解决方案,通过自动化流程显著提升了部署效率。其核心优势包括:
-
✅ 批量处理能力
-
✅ 自动备份与回滚
-
✅ 彩色日志实时反馈
后续可通过参数化支持、事务机制、并行处理等优化进一步提升其健壮性和可维护性。
文档编写时间:2026年
维护者:aihmt