R66 A1-A6:小团队试点收敛与上线验收
这个提交包含在:
@@ -10,7 +10,7 @@ mkdir -p "$ARTIFACT_ROOT"
|
||||
|
||||
usage() {
|
||||
cat <<USAGE
|
||||
Usage: bash scripts/qa/run-release-gate.sh <all|static|smoke-local|full-local|deploy|ci-release|help>
|
||||
Usage: bash scripts/qa/run-release-gate.sh <all|static|smoke-local|full-local|deploy|ci-release|r66-trialrun|help>
|
||||
|
||||
说明:
|
||||
static 运行部署契约、server Prisma 校验、client typecheck/build
|
||||
@@ -19,6 +19,7 @@ Usage: bash scripts/qa/run-release-gate.sh <all|static|smoke-local|full-local|de
|
||||
deploy 调用 deploy/trialrun/deploy.sh,内部会串联 /ready、external deps、runtime smoke 与 live smoke
|
||||
all 依次执行 static -> smoke-local -> full-local -> deploy
|
||||
ci-release 依次执行 static -> full-local -> deploy
|
||||
r66-trialrun R66 小团队试点门禁:static -> server regression-all -> smoke-local
|
||||
|
||||
可选环境变量:
|
||||
RELEASE_GATE_ARTIFACT_DIR 失败产物输出目录
|
||||
@@ -73,6 +74,13 @@ stage_full_local() {
|
||||
bash "$ROOT_DIR/scripts/qa/run-web-gates.sh" full-local
|
||||
}
|
||||
|
||||
stage_server_regression_all() {
|
||||
(
|
||||
cd "$ROOT_DIR/server"
|
||||
./scripts/regression-all.sh
|
||||
)
|
||||
}
|
||||
|
||||
stage_deploy() {
|
||||
bash "$ROOT_DIR/deploy/trialrun/deploy.sh"
|
||||
}
|
||||
@@ -98,6 +106,11 @@ case "$MODE" in
|
||||
run_stage full-local stage_full_local
|
||||
run_stage deploy stage_deploy
|
||||
;;
|
||||
r66-trialrun)
|
||||
run_stage static stage_static
|
||||
run_stage server-regression-all stage_server_regression_all
|
||||
run_stage smoke-local stage_smoke_local
|
||||
;;
|
||||
all)
|
||||
run_stage static stage_static
|
||||
run_stage smoke-local stage_smoke_local
|
||||
|
||||
+77
-6
@@ -14,6 +14,9 @@ QA_DB_PORT="${QA_DB_PORT:-5432}"
|
||||
QA_DB_USER="${QA_DB_USER:-hyboa_user}"
|
||||
QA_DB_PASSWORD="${QA_DB_PASSWORD:-hyboa_password}"
|
||||
QA_DB_ADMIN_DB="${QA_DB_ADMIN_DB:-postgres}"
|
||||
QA_DB_CLIENT="${QA_DB_CLIENT:-host}"
|
||||
QA_DB_DOCKER_CONTAINER="${QA_DB_DOCKER_CONTAINER:-hyb-oa-trialrun-db}"
|
||||
QA_DOCKER_USE_SG="${QA_DOCKER_USE_SG:-0}"
|
||||
QA_DB_PREFIX="${QA_DB_PREFIX:-hyb_oa_webgate}"
|
||||
QA_KEEP_DB="${QA_KEEP_DB:-0}"
|
||||
QA_SERVER_LOG="${QA_SERVER_LOG:-/tmp/hyb-oa-web-gates-server.log}"
|
||||
@@ -38,11 +41,65 @@ Usage: bash scripts/qa/run-web-gates.sh <smoke-local|full-local|smoke-live>
|
||||
可选环境变量:
|
||||
QA_PORT / QA_HOST
|
||||
QA_DB_HOST / QA_DB_PORT / QA_DB_USER / QA_DB_PASSWORD / QA_DB_ADMIN_DB
|
||||
QA_DB_CLIENT=host|docker
|
||||
QA_DB_DOCKER_CONTAINER / QA_DOCKER_USE_SG=1
|
||||
QA_DB_PREFIX / QA_DB_NAME / QA_KEEP_DB
|
||||
LIVE_SMOKE_BASE_URL / LIVE_SMOKE_ADMIN_* / LIVE_SMOKE_EMPLOYEE_* / LIVE_EXPECT_WECOM_STATUS
|
||||
USAGE
|
||||
}
|
||||
|
||||
qa_join_command() {
|
||||
local command="$1"
|
||||
shift
|
||||
local rendered="$command"
|
||||
local arg
|
||||
local quoted
|
||||
|
||||
for arg in "$@"; do
|
||||
printf -v quoted '%q' "$arg"
|
||||
rendered+=" $quoted"
|
||||
done
|
||||
|
||||
printf '%s' "$rendered"
|
||||
}
|
||||
|
||||
qa_docker() {
|
||||
if [[ "$QA_DOCKER_USE_SG" == "1" ]]; then
|
||||
local command
|
||||
command="$(qa_join_command docker "$@")"
|
||||
sg docker -c "$command"
|
||||
return
|
||||
fi
|
||||
|
||||
docker "$@"
|
||||
}
|
||||
|
||||
qa_require_db_client() {
|
||||
case "$QA_DB_CLIENT" in
|
||||
host)
|
||||
qa_require_cmd psql
|
||||
qa_require_cmd createdb
|
||||
qa_require_cmd dropdb
|
||||
;;
|
||||
docker)
|
||||
qa_require_cmd docker
|
||||
if [[ "$QA_DOCKER_USE_SG" == "1" ]]; then
|
||||
qa_require_cmd sg
|
||||
fi
|
||||
|
||||
if ! qa_docker inspect "$QA_DB_DOCKER_CONTAINER" >/dev/null 2>&1; then
|
||||
echo "[ERROR] PostgreSQL 容器不可用: $QA_DB_DOCKER_CONTAINER" >&2
|
||||
echo "[ERROR] 请确认容器运行,或设置 QA_DB_DOCKER_CONTAINER=<container>。" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "[ERROR] QA_DB_CLIENT 仅支持 host 或 docker,当前: $QA_DB_CLIENT" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
qa_port_in_use() {
|
||||
python3 - "$QA_HOST" "$QA_PORT" <<'PY'
|
||||
import socket, sys
|
||||
@@ -129,10 +186,22 @@ qa_wait_ready() {
|
||||
}
|
||||
|
||||
qa_psql() {
|
||||
if [[ "$QA_DB_CLIENT" == "docker" ]]; then
|
||||
qa_docker exec -e "PGPASSWORD=$QA_DB_PASSWORD" "$QA_DB_DOCKER_CONTAINER" \
|
||||
psql -v ON_ERROR_STOP=1 -U "$QA_DB_USER" -d "$QA_DB_ADMIN_DB" "$@"
|
||||
return
|
||||
fi
|
||||
|
||||
PGPASSWORD="$QA_DB_PASSWORD" psql -v ON_ERROR_STOP=1 -h "$QA_DB_HOST" -p "$QA_DB_PORT" -U "$QA_DB_USER" -d "$QA_DB_ADMIN_DB" "$@"
|
||||
}
|
||||
|
||||
qa_createdb() {
|
||||
if [[ "$QA_DB_CLIENT" == "docker" ]]; then
|
||||
qa_docker exec -e "PGPASSWORD=$QA_DB_PASSWORD" "$QA_DB_DOCKER_CONTAINER" \
|
||||
createdb -U "$QA_DB_USER" "$QA_DB_NAME"
|
||||
return
|
||||
fi
|
||||
|
||||
PGPASSWORD="$QA_DB_PASSWORD" createdb -h "$QA_DB_HOST" -p "$QA_DB_PORT" -U "$QA_DB_USER" "$QA_DB_NAME"
|
||||
}
|
||||
|
||||
@@ -143,6 +212,12 @@ qa_dropdb() {
|
||||
fi
|
||||
|
||||
qa_psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${QA_DB_NAME}' AND pid <> pg_backend_pid();" >/dev/null || true
|
||||
if [[ "$QA_DB_CLIENT" == "docker" ]]; then
|
||||
qa_docker exec -e "PGPASSWORD=$QA_DB_PASSWORD" "$QA_DB_DOCKER_CONTAINER" \
|
||||
dropdb --if-exists -U "$QA_DB_USER" "$QA_DB_NAME" >/dev/null || true
|
||||
return
|
||||
fi
|
||||
|
||||
PGPASSWORD="$QA_DB_PASSWORD" dropdb --if-exists -h "$QA_DB_HOST" -p "$QA_DB_PORT" -U "$QA_DB_USER" "$QA_DB_NAME" >/dev/null || true
|
||||
}
|
||||
|
||||
@@ -343,9 +418,7 @@ qa_run_live_smoke() {
|
||||
case "$MODE" in
|
||||
smoke-local)
|
||||
qa_require_cmd curl
|
||||
qa_require_cmd psql
|
||||
qa_require_cmd createdb
|
||||
qa_require_cmd dropdb
|
||||
qa_require_db_client
|
||||
qa_require_cmd node
|
||||
qa_require_cmd npm
|
||||
trap qa_cleanup EXIT
|
||||
@@ -353,9 +426,7 @@ case "$MODE" in
|
||||
;;
|
||||
full-local)
|
||||
qa_require_cmd curl
|
||||
qa_require_cmd psql
|
||||
qa_require_cmd createdb
|
||||
qa_require_cmd dropdb
|
||||
qa_require_db_client
|
||||
qa_require_cmd node
|
||||
qa_require_cmd npm
|
||||
trap qa_cleanup EXIT
|
||||
|
||||
在新工单中引用
屏蔽一个用户