fix(deploy): 修复组件版本解析和安装升级验收流程

This commit is contained in:
2026-10-18 00:18:00 +08:00
parent 895d92317e
commit b99eb849b4
30 changed files with 1579 additions and 270 deletions
+18 -66
View File
@@ -114,22 +114,6 @@ if [ -n "${UPDATE_RELEASE_VERSION:-}" ] && ! [[ "$UPDATE_RELEASE_VERSION" =~ ^[0
exit 1
fi
# 配套服务可独立更新;固定版本不得改变未选中服务的环境。
for option in UPDATE_GATEWAY_VERSION UPDATE_UPDATER_VERSION; do
value="${!option:-}"
[ -n "$value" ] || continue
if ! [[ "$value" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]{8}(\.[0-9]+)?$ ]]; then
echo "❌ $option 格式不正确;尚未修改配置或容器" >&2
exit 1
fi
service=ws-gateway
[ "$option" != UPDATE_UPDATER_VERSION ] || service=easyai-updater
if ! [[ " ${UPDATE_SERVICES:-} " == *" $service "* ]]; then
echo "❌ $option 要求在 UPDATE_SERVICES 中指定 $service;尚未修改配置或容器" >&2
exit 1
fi
done
# 拉取整个仓库更新
if [ "$SKIP_REPO_UPDATE" = false ]; then
echo ""
@@ -137,11 +121,12 @@ if [ "$SKIP_REPO_UPDATE" = false ]; then
echo "📥 拉取仓库最新代码"
echo "==========================="
if [ ! -d .git ]; then
echo "❌ 当前目录不是 Git 仓库,无法执行 git pull"
echo " 请使用 git clone 克隆项目后即可使用 update.sh 更新"
echo " 克隆命令: git clone https://git.51easyai.com/wangbo/easyai && cd easyai"
exit 1
if [ "$(git rev-parse --show-toplevel 2>/dev/null || true)" != "$SCRIPT_DIR" ]; then
if [ "${UPDATE_ADOPT_LEGACY_CONFIG:-0}" != 1 ] || [ "$SOURCE_DIR" = "$SCRIPT_DIR" ]; then
echo '❌ 旧部署包尚未接入 Git。请使用 README 中的原目录迁移入口;不要删除或改名现有数据目录。' >&2
exit 1
fi
python3 "$SOURCE_DIR/scripts/adopt-deployment-directory.py" "$SCRIPT_DIR" "$SOURCE_DIR"
fi
before_revision="$(git rev-parse HEAD)"
@@ -189,7 +174,11 @@ fi
# shellcheck source=scripts/init-security-env.sh
. ./scripts/init-security-env.sh
. ./scripts/init-application-version-env.sh
if [ -z "$(read_env_value .env SYSTEM_UPDATE_MODE)" ] && docker inspect easyai-server >/dev/null 2>&1 && ! docker inspect easyai-updater >/dev/null 2>&1; then
export EASYAI_UPDATE_MODE_HINT=legacy_watchtower
fi
plan_application_versions .env
python3 ./scripts/backup-deployment-config.py
if [ -z "$(read_env_value .env SYSTEM_UPDATE_MODE)" ] && docker inspect easyai-server >/dev/null 2>&1 && ! docker inspect easyai-updater >/dev/null 2>&1; then
write_env_value .env SYSTEM_UPDATE_MODE legacy_watchtower
fi
@@ -206,6 +195,7 @@ init_security_env .env upgrade
bash ./scripts/init-infrastructure-update-env.sh "$SCRIPT_DIR"
apply_application_versions .env
init_deployment_release_source .env
# 在更新镜像和重建服务前迁移并校验后端公开 API 地址。
# shellcheck source=scripts/init-public-api-base-url.sh
@@ -272,52 +262,11 @@ $DOCKER_COMPOSE_CMD version
echo "🎉 Docker 和 Docker Compose 已就绪!"
# Installation and update share image/public-access and health checks.
. ./scripts/deployment-runtime.sh
init_deployment_docker_config .env
wait_for_core_services() {
local timeout_seconds="${UPDATE_HEALTH_TIMEOUT_SECONDS:-300}"
local deadline=$((SECONDS + timeout_seconds))
local services=(easyai-server ws-gateway easyai-web)
if [ "${#UPDATE_SERVICE_LIST[@]}" -gt 0 ]; then
services=("${UPDATE_SERVICE_LIST[@]}")
elif printf '%s\n' "$AVAILABLE_SERVICES" | grep -qx 'model-conversion-worker'; then
services+=(model-conversion-worker)
fi
local service container_id state running health all_ready
if ! [[ "$timeout_seconds" =~ ^[1-9][0-9]*$ ]]; then
echo "❌ UPDATE_HEALTH_TIMEOUT_SECONDS 必须是正整数,当前为: $timeout_seconds"
return 1
fi
echo "⏳ 正在等待核心服务恢复可用(最长 ${timeout_seconds} 秒)..."
while (( SECONDS < deadline )); do
all_ready=true
for service in "${services[@]}"; do
container_id="$(sudo $DOCKER_COMPOSE_CMD ps -q "$service" 2>/dev/null || true)"
if [ -z "$container_id" ]; then
all_ready=false
continue
fi
state="$(sudo docker inspect --format '{{.State.Running}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "$container_id" 2>/dev/null || true)"
running="${state%%|*}"
health="${state#*|}"
if [ "$running" != "true" ] || { [ "$health" != "none" ] && [ "$health" != "healthy" ]; }; then
all_ready=false
fi
done
if [ "$all_ready" = true ]; then
echo "✅ 核心服务已恢复可用"
return 0
fi
sleep 5
done
echo "❌ 更新后核心服务未在 ${timeout_seconds} 秒内恢复可用"
echo " 当前状态:"
sudo $DOCKER_COMPOSE_CMD ps "${services[@]}" || true
echo " 请运行 '$DOCKER_COMPOSE_CMD logs --tail=100 ${services[*]}' 查看原因"
return 1
wait_for_deployment_services "$DOCKER_COMPOSE_CMD" "${UPDATE_HEALTH_TIMEOUT_SECONDS:-600}" "${UPDATE_SERVICE_LIST[@]}"
}
# 必须在拉取/重建前确认服务名称,防止拼写错误扩大更新范围。
@@ -333,7 +282,9 @@ if [ -n "${UPDATE_SERVICES:-}" ]; then
done
fi
check_deployment_storage "$DOCKER_COMPOSE_CMD" "${UPDATE_SERVICE_LIST[@]}"
verify_application_version_images .env "$DOCKER_COMPOSE_CMD"
verify_deployment_images "$DOCKER_COMPOSE_CMD" "${UPDATE_SERVICE_LIST[@]}"
# 只检查本次会重建的 Redis;--no-deps 更新其他服务不会修改其旧数据位置。
if [ "${#UPDATE_SERVICE_LIST[@]}" -eq 0 ] || printf '%s\n' "${UPDATE_SERVICE_LIST[@]}" | grep -qx 'redis'; then
@@ -348,6 +299,7 @@ if ! sudo $DOCKER_COMPOSE_CMD pull "${UPDATE_SERVICE_LIST[@]}"; then
echo " 请检查网络、镜像仓库权限和服务器磁盘空间后重试"
exit 1
fi
verify_pulled_release "$DOCKER_COMPOSE_CMD" "${UPDATE_SERVICE_LIST[@]}"
UP_ARGUMENTS=(-d)
if [ "${#UPDATE_SERVICE_LIST[@]}" -gt 0 ]; then
UP_ARGUMENTS+=(--no-deps "${UPDATE_SERVICE_LIST[@]}")