R26-1 R26-2 R26-3: 修复 env 注入并补部署校验与 smoke
这个提交包含在:
+50
-2
@@ -13,6 +13,8 @@ ENABLE_MINIO="${ENABLE_MINIO:-0}"
|
||||
SYNC_ENV="${SYNC_ENV:-0}"
|
||||
COMPOSE_FILE="deploy/trialrun/docker-compose.yml"
|
||||
LOCAL_ENV_FILE="deploy/trialrun/.env"
|
||||
ENV_CONTRACT_SCRIPT="deploy/trialrun/validate-env-contract.js"
|
||||
RUNTIME_SMOKE_SCRIPT="server/src/scripts/smoke-trialrun-runtime.js"
|
||||
|
||||
need_cmd() {
|
||||
command -v "$1" >/dev/null 2>&1 || {
|
||||
@@ -23,17 +25,31 @@ need_cmd() {
|
||||
|
||||
need_cmd rsync
|
||||
need_cmd ssh
|
||||
need_cmd node
|
||||
|
||||
if [[ ! -f "${ROOT_DIR}/${COMPOSE_FILE}" ]]; then
|
||||
echo "[ERROR] 缺少 ${COMPOSE_FILE}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${ROOT_DIR}/${ENV_CONTRACT_SCRIPT}" ]]; then
|
||||
echo "[ERROR] 缺少 ${ENV_CONTRACT_SCRIPT}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${ROOT_DIR}/${RUNTIME_SMOKE_SCRIPT}" ]]; then
|
||||
echo "[ERROR] 缺少 ${RUNTIME_SMOKE_SCRIPT}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "${SYNC_ENV}" == "1" && ! -f "${ROOT_DIR}/${LOCAL_ENV_FILE}" ]]; then
|
||||
echo "[ERROR] SYNC_ENV=1 但本地不存在 ${LOCAL_ENV_FILE}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ">>> 0. 校验部署环境契约"
|
||||
node "${ROOT_DIR}/${ENV_CONTRACT_SCRIPT}"
|
||||
|
||||
echo ">>> 1. 创建远端目录"
|
||||
ssh "${DEPLOY_SERVER}" "mkdir -p '${REMOTE_DIR}'"
|
||||
|
||||
@@ -67,7 +83,7 @@ else
|
||||
echo " 如果你确认本地 deploy/trialrun/.env 可直接上服务器,可用:SYNC_ENV=1 bash deploy/trialrun/deploy.sh"
|
||||
fi
|
||||
|
||||
echo ">>> 4. 在服务器执行部署"
|
||||
echo ">>> 4. 在服务器执行部署与 smoke"
|
||||
ssh "${DEPLOY_SERVER}" \
|
||||
"REMOTE_DIR='${REMOTE_DIR}' REMOTE_ENV_FILE='${REMOTE_ENV_FILE}' COMPOSE_FILE='${COMPOSE_FILE}' ENABLE_WORKER='${ENABLE_WORKER}' ENABLE_MINIO='${ENABLE_MINIO}' bash -s" <<'REMOTE'
|
||||
set -euo pipefail
|
||||
@@ -96,6 +112,10 @@ if [[ "$ENABLE_WORKER" == "1" ]]; then
|
||||
profile_args+=(--profile worker)
|
||||
fi
|
||||
|
||||
echo ">>> 4.1 校验远端 compose 配置"
|
||||
"${compose_cmd[@]}" "${profile_args[@]}" config >/dev/null
|
||||
|
||||
echo ">>> 4.2 启动基础服务"
|
||||
"${compose_cmd[@]}" up -d db
|
||||
if [[ "$ENABLE_MINIO" == "1" ]]; then
|
||||
"${compose_cmd[@]}" "${profile_args[@]}" up -d minio minio_init
|
||||
@@ -104,11 +124,39 @@ fi
|
||||
if [[ "$ENABLE_WORKER" == "1" ]]; then
|
||||
"${compose_cmd[@]}" "${profile_args[@]}" up -d worker
|
||||
fi
|
||||
"${compose_cmd[@]}" run --rm init
|
||||
|
||||
echo ">>> 4.3 执行 init"
|
||||
"${compose_cmd[@]}" run --rm -T init </dev/null
|
||||
|
||||
echo ">>> 4.4 等待 /ready"
|
||||
ready_ok=0
|
||||
for i in $(seq 1 60); do
|
||||
if curl -fsS http://127.0.0.1:3000/ready >/dev/null; then
|
||||
ready_ok=1
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
if [[ "$ready_ok" != "1" ]]; then
|
||||
echo "[ERROR] /ready 在超时时间内未通过" >&2
|
||||
"${compose_cmd[@]}" logs --tail=200 server || true
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ">>> 4.5 执行 runtime smoke"
|
||||
if ! "${compose_cmd[@]}" exec -T server node src/scripts/smoke-trialrun-runtime.js; then
|
||||
echo "[ERROR] runtime smoke 失败,输出最近 server 日志" >&2
|
||||
"${compose_cmd[@]}" logs --tail=200 server || true
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ">>> 4.6 当前服务状态"
|
||||
"${compose_cmd[@]}" ps
|
||||
REMOTE
|
||||
|
||||
echo ">>> 5. 部署完成"
|
||||
echo " 远端目录: ${REMOTE_DIR}"
|
||||
echo " 环境文件: ${REMOTE_ENV_FILE}"
|
||||
echo " 已自动执行:契约校验 + /ready + runtime smoke"
|
||||
echo " 请确认 Nginx 已把 OA 域名反代到 127.0.0.1:3000"
|
||||
|
||||
在新工单中引用
屏蔽一个用户