159 lines
4.5 KiB
Bash
159 lines
4.5 KiB
Bash
#!/bin/bash
|
|
# patch_workflow.sh - 完整补丁管理工作流
|
|
|
|
set -euo pipefail
|
|
|
|
# SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
SCRIPT_DIR="/opt/patch-management"
|
|
|
|
# 颜色定义
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m'
|
|
|
|
log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"; }
|
|
error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
|
# 完整工作流
|
|
full_patch_workflow() {
|
|
local source_dir="$1"
|
|
local target_dir="$2"
|
|
local patch_name="$3" # 补丁文件路径
|
|
|
|
log "开始完整补丁管理工作流"
|
|
echo "========================================"
|
|
|
|
# 1. 生成补丁包
|
|
log "步骤1: 生成补丁包"
|
|
if ! "$SCRIPT_DIR/patch_generator.sh" "$source_dir" "$target_dir" "$patch_name"; then
|
|
error "补丁包生成失败"
|
|
return 1
|
|
fi
|
|
|
|
# 获取生成的补丁包路径
|
|
local patch_file=$(find "/opt/patches" -name "*${patch_name}*" -type f | head -1)
|
|
if [[ -z "$patch_file" ]]; then
|
|
error "未找到补丁包文件"
|
|
return 1
|
|
fi
|
|
|
|
# 2. 验证补丁包
|
|
log "步骤2: 验证补丁包"
|
|
if ! "$SCRIPT_DIR/patch_verifier.sh" "$patch_file" "pre-apply"; then
|
|
error "补丁包验证失败"
|
|
return 1
|
|
fi
|
|
|
|
# 3. 应用补丁包(干跑模式)
|
|
log "步骤3: 干跑模式应用补丁"
|
|
if ! "$SCRIPT_DIR/patch_applier.sh" "$patch_file" "dry-run"; then
|
|
error "干跑模式应用失败"
|
|
return 1
|
|
fi
|
|
|
|
# 4. 实际应用补丁包
|
|
read -p "是否继续实际应用补丁? (y/N): " confirm
|
|
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
|
log "步骤4: 实际应用补丁"
|
|
if ! "$SCRIPT_DIR/patch_applier.sh" "$patch_file"; then
|
|
error "补丁应用失败"
|
|
return 1
|
|
fi
|
|
else
|
|
log "操作取消"
|
|
return 0
|
|
fi
|
|
|
|
# 5. 应用后验证
|
|
log "步骤5: 应用后验证"
|
|
if ! "$SCRIPT_DIR/patch_verifier.sh" "$patch_file" "post-apply"; then
|
|
error "应用后验证失败"
|
|
return 1
|
|
fi
|
|
|
|
log "🎉 完整补丁管理工作流完成"
|
|
return 0
|
|
}
|
|
|
|
# 回滚工作流
|
|
rollback_workflow() {
|
|
local rollback_file="${1:-}"
|
|
|
|
log "开始回滚工作流"
|
|
echo "========================================"
|
|
|
|
# 1. 干跑模式回滚
|
|
log "步骤1: 干跑模式回滚"
|
|
if ! "$SCRIPT_DIR/patch_rollback.sh" "$rollback_file" "dry-run"; then
|
|
error "干跑模式回滚失败"
|
|
return 1
|
|
fi
|
|
|
|
# 2. 实际回滚
|
|
read -p "是否继续实际回滚? (y/N): " confirm
|
|
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
|
log "步骤2: 实际回滚"
|
|
if ! "$SCRIPT_DIR/patch_rollback.sh" "$rollback_file"; then
|
|
error "回滚失败"
|
|
return 1
|
|
fi
|
|
else
|
|
log "操作取消"
|
|
return 0
|
|
fi
|
|
|
|
log "✅ 回滚工作流完成"
|
|
return 0
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
case "${1:-}" in
|
|
"generate-full")
|
|
shift
|
|
full_patch_workflow "$@"
|
|
;;
|
|
"generate")
|
|
shift
|
|
"$SCRIPT_DIR/patch_generator.sh" "$@"
|
|
;;
|
|
"apply")
|
|
shift
|
|
"$SCRIPT_DIR/patch_applier.sh" "$@"
|
|
;;
|
|
"rollback")
|
|
shift
|
|
rollback_workflow "$@"
|
|
;;
|
|
"verify")
|
|
shift
|
|
"$SCRIPT_DIR/patch_verifier.sh" "$@"
|
|
;;
|
|
"batch-verify")
|
|
shift
|
|
"$SCRIPT_DIR/patch_verifier.sh" "$1" "standalone" "batch"
|
|
;;
|
|
*)
|
|
echo "用法: $0 <command> [args]"
|
|
echo "命令:"
|
|
echo " generate-full <旧目录> <新目录> [补丁名称] # 生成补丁"
|
|
echo " generate <旧目录> <新目录> [补丁名称] # 生成补丁"
|
|
echo " apply <补丁包路径> [dry-run] # 应用补丁"
|
|
echo " rollback [回滚包路径] # 回滚补丁"
|
|
echo " verify <补丁包路径> [验证类型] # 验证补丁"
|
|
echo " batch-verify <目录> # 批量验证"
|
|
echo ""
|
|
echo "示例:"
|
|
echo " 进入项目目录,然后执行"
|
|
echo " $0 generate /old/version /new/version"
|
|
echo " $0 apply /opt/patches/patch.tar.gz dry-run"
|
|
echo " $0 rollback /var/backups/patch/backup.tar.gz"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# 异常处理
|
|
trap 'error "脚本执行中断"; cleanup; exit 1' INT TERM
|
|
|
|
main "$@" |