R30-1 R30-9: 建立零人工发布门禁并补齐高频回归

这个提交包含在:
2026-03-23 10:00:26 +08:00
父节点 c17a72830c
当前提交 994d98e74c
共修改 22 个文件,包含 1189 行新增和 41 行删除
+26 -8
查看文件
@@ -13,7 +13,7 @@
- [ ] 已将 OA Nginx 配置放到 `/etc/nginx/sites-available/hyb-oa`
- [ ] 已上传 OA 域名证书到 `/etc/nginx/ssl/<oa-domain>/`
- [ ] 已执行 `nginx -t && systemctl reload nginx`
- [ ] 已从本地执行 `bash deploy/trialrun/deploy.sh`
- [ ] 已从本地执行 `bash scripts/qa/run-release-gate.sh all` 或至少执行 `bash deploy/trialrun/deploy.sh`
- [ ] 已通过 `https://<oa-domain>/ready` 或首页登录完成最小探活
- [ ] 首次上线先执行系统初始化(migration + seed),不要直接导入旧库整库备份
- [ ] 若要导数据,仅准备最小主数据:部门、员工、角色、在用资产、活跃项目、合同元数据
@@ -23,6 +23,8 @@
- [ ] 确认当前版本已打 tag:`git tag -a trialrun-YYYYMMDD-NN -m "trialrun release"`
- [ ] 本地门禁:`./scripts/check-minimal.sh`
- [ ] 部署契约校验:`node deploy/trialrun/validate-env-contract.js`
- [ ] 网页 smoke 门禁:`bash scripts/qa/run-web-gates.sh smoke-local`
- [ ] 网页 full 门禁(建议发版前执行):`bash scripts/qa/run-web-gates.sh full-local`
- [ ] 全量回归(建议):`cd server && RUN_AUDIT_REGRESSION=1 RUN_OCR_REGRESSION=1 ./scripts/regression-all.sh`
- [ ] 备份(DB + 文件存储):
- [ ] `set -a && source deploy/trialrun/.env && set +a`
@@ -38,17 +40,18 @@
- [ ] `curl -fsS http://127.0.0.1:3000/ready`
- [ ] Runtime smoke:
- [ ] `docker compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env exec -T server node src/scripts/smoke-trialrun-runtime.js`
- [ ] 登录验证(管理员账号):
- [ ] 访问 `http://127.0.0.1:3000`
- [ ] 登录成功,菜单权限正确
- [ ] external deps smoke:
- [ ] `docker compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env exec -T server node src/scripts/smoke-external-deps.js`
- [ ] 登录验证已由 live smoke 与 release gate 覆盖;仅首次接入或第三方后台配置变更时补做人工确认
## C. 发布后(Post-check)
- [ ] 关键链路手工验证(建议至少一次):
- [ ] 员工:新建报销 → 上传票据 → 绑定 → 提交
- [ ] 经理:待办审批(approve)
- [ ] 财务:付款(含凭证字段)
- [ ] 公网 live smoke(只读,不做写操作):`bash scripts/qa/run-web-gates.sh smoke-live`
- [ ] 若本地已配置 `LIVE_SMOKE_*`,确认 `bash deploy/trialrun/deploy.sh` 输出中包含 live smoke 结果
- [ ] 已确认 release gate / live smoke 结果为通过;关键链路不再作为每次发布的手工必做项
- [ ] 查看 server 日志(无异常错误风暴):
- [ ] `docker logs --tail=200 hyb-oa-trialrun-server`
- [ ] 已确认 smoke 账号为独立账号(`smoke-admin` / `smoke-employee`),且不参与真实业务
- [ ] 已确认 live smoke 仅检查 `/ready`、登录、Portal、项目、公告、个人设置和企微配置状态
## D. 回滚(Rollback)
> 原则:如果涉及迁移,最快回滚通常是 “恢复备份 + 回到上个 tag”。
@@ -120,3 +123,18 @@
- [ ] 已验证:Portal 首屏第一排卡片顺序符合员工 / 管理员视角设计
- [ ] 已验证:备用模块默认折叠,不干扰主导航
- [ ] 已验证:企业微信通知仍保持脱敏,不包含涉密正文与金额明细
## R29 前端设计系统与工作台体验检查
- [ ] 主导航已稳定收敛为 `Portal / 团队 / 请假 / 报销 / 资产 / 周报 / 待办 / 公告 / 项目`
- [ ] 管理入口已单独分区,`备用模块` 默认折叠
- [ ] 登录页在普通浏览器与企业微信 WebView 场景下都只保留一个主 CTA
- [ ] 登录页未再展示测试账号暗示,错误提示贴近操作区
- [ ] `Portal` 员工第一屏已优先显示:待办 / 今日状态 / 周报 / 项目
- [ ] `Portal` 管理第一屏已优先显示:审批 / 团队状态 / 周报缺口 / 需协助员工
- [ ] `个人设置` 不再直出 `部门 ID / 上级 ID` 等内部标识
- [ ] `topbar` 仅在企业微信 WebView 场景显示“当前通过企业微信进入”轻提示
- [ ] 已执行 `cd client && npm run typecheck`
- [ ] 已执行 `cd client && npm run build`
- [ ] 已执行 `bash scripts/qa/run-web-gates.sh smoke-local`
- [ ] 发版前建议执行 `bash scripts/qa/run-web-gates.sh full-local`
+33 -4
查看文件
@@ -15,6 +15,7 @@ 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"
EXTERNAL_DEPS_SMOKE_SCRIPT="server/src/scripts/smoke-external-deps.js"
need_cmd() {
command -v "$1" >/dev/null 2>&1 || {
@@ -42,6 +43,11 @@ if [[ ! -f "${ROOT_DIR}/${RUNTIME_SMOKE_SCRIPT}" ]]; then
exit 1
fi
if [[ ! -f "${ROOT_DIR}/${EXTERNAL_DEPS_SMOKE_SCRIPT}" ]]; then
echo "[ERROR] 缺少 ${EXTERNAL_DEPS_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
@@ -144,19 +150,42 @@ if [[ "$ready_ok" != "1" ]]; then
exit 1
fi
echo ">>> 4.5 执行 runtime smoke"
echo ">>> 4.5 执行 external deps smoke"
if ! "${compose_cmd[@]}" exec -T server node src/scripts/smoke-external-deps.js; then
echo "[ERROR] external deps smoke 失败,输出最近 server 日志" >&2
"${compose_cmd[@]}" logs --tail=200 server || true
exit 1
fi
echo ">>> 4.6 执行 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 当前服务状态"
echo ">>> 4.7 当前服务状态"
"${compose_cmd[@]}" ps
REMOTE
echo ">>> 5. 部署完成"
LIVE_SMOKE_READY=1
for required_key in LIVE_SMOKE_ADMIN_IDENTIFIER LIVE_SMOKE_ADMIN_PASSWORD LIVE_SMOKE_EMPLOYEE_IDENTIFIER LIVE_SMOKE_EMPLOYEE_PASSWORD; do
if [[ -z "${!required_key:-}" ]]; then
LIVE_SMOKE_READY=0
break
fi
done
if [[ "$LIVE_SMOKE_READY" == "1" ]]; then
echo ">>> 5. 执行部署后 live smoke"
bash "${ROOT_DIR}/scripts/qa/run-web-gates.sh" smoke-live
else
echo ">>> 5. 跳过部署后 live smoke(未提供完整 LIVE_SMOKE_* 凭据)"
fi
echo ">>> 6. 部署完成"
echo " 远端目录: ${REMOTE_DIR}"
echo " 环境文件: ${REMOTE_ENV_FILE}"
echo " 已自动执行:契约校验 + /ready + runtime smoke"
echo " 已自动执行:契约校验 + /ready + external deps smoke + runtime smoke"
echo " 若本地已配置 LIVE_SMOKE_*,部署后会自动补跑网页 live smoke"
echo " 请确认 Nginx 已把 OA 域名反代到 127.0.0.1:3000"
+35 -2
查看文件
@@ -11,7 +11,7 @@
1. 服务器以 root 执行 `bash deploy/trialrun/setup-server.sh`
2. 手工创建 `deploy/trialrun/.env`
3. 手工放置 OA 的 Nginx 站点配置和证书
4. 本地执行 `bash deploy/trialrun/deploy.sh`
4. 本地执行 `bash scripts/qa/run-release-gate.sh all`(或至少执行 `bash deploy/trialrun/deploy.sh`)
## 0. 前置条件
- Docker + Docker Compose(v2)
@@ -88,7 +88,9 @@ docker compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/
```
说明:
- `deploy/trialrun/deploy.sh` 现已自动执行 `validate-env-contract.js`、`/ready` 探活与 `smoke-trialrun-runtime.js`。
- `deploy/trialrun/deploy.sh` 现已自动执行 `validate-env-contract.js`、`/ready` 探活、`smoke-external-deps.js` 与 `smoke-trialrun-runtime.js`。
- 若本地存在完整 `LIVE_SMOKE_*` 环境变量,部署脚本会继续执行 `client npm run test:e2e:live`,用于公网只读 smoke。
- 推荐直接执行 `bash scripts/qa/run-release-gate.sh all`,让 static / local smoke / full-local / deploy / live smoke 形成单一放行链。
- 若再出现“数据库开了但功能被环境硬关”的情况,部署会直接失败,不再等到手工点页面才发现。
浏览器访问:
@@ -141,6 +143,17 @@ curl -fsS http://127.0.0.1:3000/ready
建议版本化方式:
- 每次发布打 tag,例如 `trialrun-2026-02-08-01`
### 2.1 网页自动化门禁(R28)
发布前后统一使用三层网页自动化:
- `bash scripts/qa/run-web-gates.sh smoke-local`:本地/PR 快速门禁,只覆盖登录、Portal、导航、企微入口 UI。
- `bash scripts/qa/run-web-gates.sh full-local`:本地/main/夜间全量门禁,串联 server 回归、client build 与全部 Playwright E2E。
- `bash scripts/qa/run-web-gates.sh smoke-live`:发布后公网只读 smoke,只检查 `/ready`、登录、Portal、团队、请假、项目、公告、个人设置、管理页只读入口与企微配置状态。
约束:
- live smoke 必须使用独立账号:`smoke-admin`、`smoke-employee`。
- live smoke 禁止新建报销、提交审批、付款、导入、资产流转、项目写操作。
- 若本地已配置完整 `LIVE_SMOKE_*`,`bash deploy/trialrun/deploy.sh` 会在远端部署完成后自动补跑 live smoke。
步骤:
1) 先做备份(见 E14 脚本)
2) 拉取代码:`git pull` / `git checkout <tag>`
@@ -316,3 +329,23 @@ docker compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/
- 客户沟通影响项目时 `24h` 内回填
- 私聊可继续发生,但项目状态不能只留在聊天里
5. 进入真实 4 周试点前,至少保留一次通过记录:后端测试、前端 build、E2E 全绿截图或日志。
## 8. R29 前端设计系统与工作台体验验收
### 8.1 视觉与交互核对顺序
1. 登录页:先确认当前场景只有一个主 CTA,并验证错误提示、企微回退文案可理解。
2. Portal:确认员工与管理员两套第一屏都先回答“今天要做什么”。
3. 导航:确认主导航 9 项稳定、管理入口独立、备用模块默认折叠。
4. 个人设置:确认只展示员工可理解的信息,企微绑定卡状态清晰。
### 8.2 自动化建议
- 本地快速验收:`bash scripts/qa/run-web-gates.sh smoke-local`
- 发版前完整验收:`bash scripts/qa/run-web-gates.sh full-local`
- 公网只读验收:`bash scripts/qa/run-web-gates.sh smoke-live`
### 8.3 设计 QA 口径
- 一个场景只允许一个主 CTA。
- 首页先动作,后报表;公告与最近访问降到第二阅读层。
- 空状态必须给下一步建议,不只显示“暂无数据”。
- 移动 / WebView 首屏避免横向滚动和过宽表格。
- 状态色只表达语义,不把品牌色滥用成所有强调色。