固化部署体检与备份合同刷新(08-02-deployment-preflight-backup-contract-refresh)

这个提交包含在:
2026-08-02 11:59:42 +08:00
父节点 ea985de975
当前提交 7138d2b85c
共修改 18 个文件,包含 1321 行新增和 34 行删除
+35 -18
查看文件
@@ -3,37 +3,35 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
DEPLOY_SERVER="${DEPLOY_SERVER:-}"
DEPLOY_REFRESH_SERVER="${DEPLOY_REFRESH_SERVER:-}"
DEPLOY_CONTRACT_UNIT="${DEPLOY_CONTRACT_UNIT:-hyb-oa-automatic-backup-daily.service}"
# shellcheck source=deployment-contract-lib.sh
source "$ROOT_DIR/deploy/trialrun/deployment-contract-lib.sh"
fail() {
echo "[deploy-existing][ERROR] $1" >&2
exit 1
}
[[ "$DEPLOY_SERVER" =~ ^([A-Za-z0-9._-]+@)?[A-Za-z0-9._-]+$ ]] \
deployment_contract_safe_ssh_target "$DEPLOY_SERVER" \
|| fail "必须显式提供安全的 DEPLOY_SERVER"
[[ "$DEPLOY_CONTRACT_UNIT" =~ ^[A-Za-z0-9_.@-]+\.service$ ]] \
deployment_contract_safe_ssh_target "$DEPLOY_REFRESH_SERVER" \
|| fail "必须显式提供安全的 DEPLOY_REFRESH_SERVER"
deployment_contract_safe_service "$DEPLOY_CONTRACT_UNIT" \
|| fail "DEPLOY_CONTRACT_UNIT 格式无效"
command -v ssh >/dev/null 2>&1 || fail "缺少 ssh"
unit_environment="$(ssh "$DEPLOY_SERVER" \
"systemctl show '${DEPLOY_CONTRACT_UNIT}' -p Environment --value")"
[[ -n "$unit_environment" ]] || fail "无法读取既有部署合同 unit"
declare -A contract=()
for entry in $unit_environment; do
key="${entry%%=*}"
value="${entry#*=}"
case "$key" in
REMOTE_DIR|REMOTE_ENV_FILE|COMPOSE_FILE|COMPOSE_PROJECT_NAME|POSTGRES_DATA_DIR|STORAGE_HOST_DIR)
contract["$key"]="$value"
;;
esac
done
echo "[deploy-existing] 开始只读聚合体检"
DEPLOY_SERVER="$DEPLOY_SERVER" \
DEPLOY_REFRESH_SERVER="$DEPLOY_REFRESH_SERVER" \
DEPLOY_CONTRACT_UNIT="$DEPLOY_CONTRACT_UNIT" \
bash "$ROOT_DIR/deploy/trialrun/check-existing-deployment.sh" \
|| fail "部署前聚合体检未通过"
for key in REMOTE_DIR REMOTE_ENV_FILE COMPOSE_FILE COMPOSE_PROJECT_NAME POSTGRES_DATA_DIR STORAGE_HOST_DIR; do
[[ -n "${contract[$key]:-}" ]] || fail "既有部署合同缺少 $key"
done
deployment_contract_load "$DEPLOY_SERVER" "$DEPLOY_CONTRACT_UNIT" contract \
|| fail "无法读取完整既有部署合同"
echo "[deploy-existing] 已读取受控 unit 合同;路径与标识不回显"
DEPLOY_SERVER="$DEPLOY_SERVER" \
@@ -44,5 +42,24 @@ COMPOSE_PROJECT_NAME="${contract[COMPOSE_PROJECT_NAME]}" \
POSTGRES_DATA_DIR="${contract[POSTGRES_DATA_DIR]}" \
STORAGE_HOST_DIR="${contract[STORAGE_HOST_DIR]}" \
DEPLOY_DATA_MODE=existing \
DEPLOY_DEFER_FINAL_SUCCESS=1 \
SYNC_ENV=0 \
bash "$ROOT_DIR/deploy/trialrun/deploy.sh"
refresh_output=""
refresh_status=0
if refresh_output="$(ssh "$DEPLOY_REFRESH_SERVER" refresh 2>/dev/null)"; then
if [[ "$refresh_output" != "[deployment-contract-refresh][PASS] refreshed" ]]; then
refresh_status=127
fi
else
refresh_status=$?
fi
refresh_category="$(deployment_contract_refresh_category "$refresh_status" "$refresh_output")"
if [[ "$refresh_category" != "success" ]]; then
echo "[deploy-existing][DEPLOYED_BUT_CONTRACT_REFRESH_FAILED] category=${refresh_category}" >&2
exit 1
fi
echo "[deploy-existing][PASS] 应用发布与备份合同刷新完整通过"