提交 a7362ef7 authored 作者: 陈泽健's avatar 陈泽健

feat(update): 添加传统平台程序更新功能

- 实现 workdir 自动探测功能,适配解压多一层 update/ 目录的情况
- 添加 sync_overwrite_dir 函数,支持安全移动和覆盖目录内容
- 实现会议预定系统、运维集控系统、讯飞转录系统的更新逻辑
- 支持前端更新、后端更新、全量更新三种更新类型
- 集成 rsync 命令进行目录同步,提供降级的 cp 方案
- 添加详细的日志记录和错误处理机制
- 支持传统平台和新统一平台的架构
上级 4d48c21c
...@@ -156,6 +156,68 @@ case "$PLATFORM" in ...@@ -156,6 +156,68 @@ case "$PLATFORM" in
;; ;;
esac esac
# -------------------- workdir 自动探测(适配解压多一层 update/) --------------------
resolve_workdir() {
local base="${1%/}"
# 约定:检查这些候选目录(base 本身优先,其次常见子目录)
local candidates=(
"$base"
"$base/update"
"$base/Update"
"$base/package"
"$base/dist"
)
# 根据系统类型给出“应该存在的源目录名集合”,用于判定候选目录是否正确
local expected=()
case "$SYSTEM" in
"会议预定系统")
expected=("ubains-web-2.0" "ubains-web-admin" "api-java-meeting2.0" "external-meeting-api")
;;
"运维集控系统")
expected=("web-vue-rms" "cmdb" "UbainsDevOps")
;;
"讯飞转录系统")
expected=("web-vue-voice" "UbainsDevOps")
;;
*)
expected=()
;;
esac
local c hit
for c in "${candidates[@]}"; do
[[ -d "$c" ]] || continue
# 如果没有 expected(未知系统),就直接返回 base
if [[ ${#expected[@]} -eq 0 ]]; then
echo "$c"
return 0
fi
# 命中任意一个关键目录就认为是正确 workdir(更宽松,避免必须全部存在)
hit=0
for e in "${expected[@]}"; do
if [[ -d "$c/$e" ]]; then
hit=1
break
fi
done
if [[ "$hit" -eq 1 ]]; then
echo "$c"
return 0
fi
done
# 找不到就退回原始 base
echo "$base"
}
WORKDIR="$(resolve_workdir "$WORKDIR")"
log "WORKDIR_RESOLVED=$WORKDIR"
# 3.3 备份前端/后端(按更新类型) # 3.3 备份前端/后端(按更新类型)
if [[ "$UPDATE_TYPE" == "前端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then if [[ "$UPDATE_TYPE" == "前端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
mkdir -p "$BACKUP_DIR/frontend" mkdir -p "$BACKUP_DIR/frontend"
...@@ -209,6 +271,136 @@ backup_db() { ...@@ -209,6 +271,136 @@ backup_db() {
backup_db "$DB_NAME" backup_db "$DB_NAME"
# -------------------- 3.4 更新服务(传统平台) --------------------
# 安全移动:把 sourceDir 下内容覆盖到 targetDir
# 注意:按 PRD 是 mv * 覆盖;这里保持一致,但会做目录存在性/空目录校验
sync_overwrite_dir() {
local sourceDir="$1"
local targetDir="$2"
local label="$3"
if [[ ! -d "$sourceDir" ]]; then
log "ERROR: 更新源目录不存在:$sourceDir ($label)"
return 10
fi
mkdir -p "$targetDir"
if [[ -z "$(ls -A "$sourceDir" 2>/dev/null || true)" ]]; then
log "ERROR: 更新源目录为空:$sourceDir ($label)"
return 11
fi
log "UPDATE [$label]: $sourceDir -> $targetDir"
# 1) 优先 rsync(能真正“覆盖 + 删除多余旧文件”,最接近“覆盖操作”)
if command -v rsync >/dev/null 2>&1; then
rsync -a --delete "${sourceDir%/}/" "${targetDir%/}/"
return 0
fi
# 2) 无 rsync:退化方案
# 如果目标里存在同名目录且非空,cp -a 是可覆盖拷贝的,不需要删除目录;
# 但为了避免你遇到的 static 冲突残留问题,这里先删除常见冲突目录(仅删除目标的同名项)
# 注意:此处只会删除与源同名的一级条目,不会清空整个 targetDir。
local item base
shopt -s dotglob nullglob
for item in "$sourceDir"/*; do
base="$(basename "$item")"
if [[ -e "$targetDir/$base" ]]; then
rm -rf "$targetDir/$base"
fi
cp -a "$item" "$targetDir/"
done
shopt -u dotglob nullglob
}
# 依据系统+更新类型执行
do_update_traditional() {
case "$SYSTEM" in
"会议预定系统")
# workdir 里解压后的目录名按你 PRD 3.4 写的是 /home/Update/ubains-web-2.0 等
# 如果你的 zip 解压出来有一层 update/,请把 WORKDIR 调整为 /home/Update/update
local src_front1="${WORKDIR%/}/ubains-web-2.0"
local src_front2="${WORKDIR%/}/ubains-web-admin"
local src_back1="${WORKDIR%/}/api-java-meeting2.0"
local src_back2="${WORKDIR%/}/external-meeting-api"
local dst_front1="/var/www/java/ubains-web-2.0"
local dst_front2="/var/www/java/ubains-web-admin"
local dst_back1="/var/www/java/api-java-meeting2.0"
local dst_back2="/var/www/java/external-meeting-api"
if [[ "$UPDATE_TYPE" == "前端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
sync_overwrite_dir "$src_front1" "$dst_front1" "会议预定-前台前端"
sync_overwrite_dir "$src_front2" "$dst_front2" "会议预定-后台前端"
fi
if [[ "$UPDATE_TYPE" == "后端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
sync_overwrite_dir "$src_back1" "$dst_back1" "会议预定-对内后端"
sync_overwrite_dir "$src_back2" "$dst_back2" "会议预定-对外后端"
fi
;;
"运维集控系统")
local src_front="${WORKDIR%/}/web-vue-rms"
local src_back_cmdb="${WORKDIR%/}/cmdb"
local src_back_devops="${WORKDIR%/}/UbainsDevOps"
local dst_front="/var/www/html/web-vue-rms"
local dst_back_root="/var/www/html"
if [[ "$UPDATE_TYPE" == "前端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
sync_overwrite_dir "$src_front" "$dst_front" "运维集控-前端"
fi
if [[ "$UPDATE_TYPE" == "后端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
# PRD 写的是 mv * /var/www/html/(覆盖操作),这里按子目录覆盖到 /var/www/html/cmdb 和 /var/www/html/UbainsDevOps
sync_overwrite_dir "$src_back_cmdb" "${dst_back_root%/}/cmdb" "运维集控-后端-cmdb"
sync_overwrite_dir "$src_back_devops" "${dst_back_root%/}/UbainsDevOps" "运维集控-后端-UbainsDevOps"
fi
;;
"讯飞转录系统")
# 按 4.1 映射表:web-vue-voice + UbainsDevOps
local src_front="${WORKDIR%/}/web-vue-voice"
local src_back_devops="${WORKDIR%/}/UbainsDevOps"
local dst_front="/var/www/html/web-vue-voice"
local dst_back_root="/var/www/html"
if [[ "$UPDATE_TYPE" == "前端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
sync_overwrite_dir "$src_front" "$dst_front" "讯飞转录-前端"
fi
if [[ "$UPDATE_TYPE" == "后端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
sync_overwrite_dir "$src_back_devops" "${dst_back_root%/}/UbainsDevOps" "讯飞转录-后端-UbainsDevOps"
fi
;;
*)
log "ERROR: Unsupported system for traditional platform: $SYSTEM"
return 20
;;
esac
}
case "$PLATFORM" in
"传统平台")
log "Start update (传统平台): system=$SYSTEM update=$UPDATE_TYPE workdir=$WORKDIR"
do_update_traditional
log "Update done (传统平台)."
;;
"新统一平台")
log "ERROR: 新统一平台 3.4 更新规则 PRD 未提供(目前仅实现传统平台)。"
exit 30
;;
*)
log "ERROR: Unsupported platform: $PLATFORM"
exit 31
;;
esac
# 打包备份目录 # 打包备份目录
log "Packing backup to: $BACKUP_TAR" log "Packing backup to: $BACKUP_TAR"
tar -czvf "$BACKUP_TAR" "$BACKUP_DIR" >/dev/null tar -czvf "$BACKUP_TAR" "$BACKUP_DIR" >/dev/null
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论