R66 A1-A6:小团队试点收敛与上线验收

这个提交包含在:
2026-04-26 13:24:24 +08:00
父节点 8353efcbd7
当前提交 a15bbcbadb
共修改 19 个文件,包含 462 行新增和 56 行删除
+14 -1
查看文件
@@ -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