chore(aihr): harden release evidence checks
This commit is contained in:
@@ -8,6 +8,8 @@
|
||||
更新时间:2026-07-14
|
||||
|
||||
- 2026-07-14 22:16 BRD 生产发布完成:基于 `HEAD=ee261568` 在隔离干净 worktree 重新构建并发布管理端、`mobile-uni` H5 和 `ruoyi-admin` 后端;远端备份为 `/opt/wygj/backups/release-20260714221321`。发布后远端资源已与本地产物一致:管理端 `assets/index-B9T505HT.js`(SHA-256 `66a827a7b3e5d794ae9da54c6e2276080995614fa52f54d49f746087663f8c94`)、H5 `assets/index-CDn6TrX8.js`(SHA-256 `eecb4820f3887aceb952efe3e6f2210bab325be8b03f2813e6ec304c68b26f08`)、后端 `/opt/wygj/app/ruoyi-admin.jar`(SHA-256 `e2941cf1e2a31e22c979cea77a12b2e6ef2e5430409398dbde0918a1ab00f437`);`wygj-aihr.service` 重启后为 `active`,根站、`/h5/`、租户列表和员工首页 API 均返回 `200`,发布后 `RELEASE_VERIFY_REMOTE_MATCH=true` 预检通过。Chrome 匿名打开 H5 后标题为“今日”、员工端四个 tab 和最新主 JS 均正常加载;生产 `13900001111 + 123456` 登录被服务端按生产验证码策略拒绝,随后验证码发送触发号码天级限流,因此本轮未完成认证态浏览器回归,也未把匿名渲染当作登录/主管权限验收。未写入业务数据;正式主管组织映射、真实试点数据和认证态回归仍未完成。
|
||||
- 2026-07-14 BRD 发布预检后端证据补强:`release-preflight.sh` 新增可选 `RELEASE_VERIFY_REMOTE_BACKEND=true`,通过 SSH 比对远端 `ruoyi-admin.jar` SHA-256;该开关未同时启用远端资源比对时现在直接失败,不再静默跳过。远端只读业务检查同时覆盖租户列表和移动端员工首页;默认发布路径仍为 `/opt/wygj/app/ruoyi-admin.jar`,可用 `RELEASE_REMOTE_BACKEND_PATH` 覆盖。本轮未重新发布业务包。
|
||||
- 2026-07-14 BRD 验收脚本执行一致性修复:`scripts/tests/pilot-export-contract.test.mjs` 新增 Node shebang 并恢复可执行权限,直接运行与 `node` 运行结果一致,5/5 通过;同时保留 `release-preflight.sh` 的后端 hash 配置误用门禁。该批次只修工具与证据链,不改业务数据或生产包。
|
||||
- 2026-07-14 22:03 BRD 发布证据复核:基于当前 `HEAD=ab10e565` 重新构建管理端、`mobile-uni` H5 和 `ruoyi-admin` 后端产物均成功;本地产物为管理端 `assets/index-B9T505HT.js`(SHA-256 `66a827a7b3e5d794ae9da54c6e2276080995614fa52f54d49f746087663f8c94`)、H5 `assets/index-CDn6TrX8.js`(SHA-256 `eecb4820f3887aceb952efe3e6f2210bab325be8b03f2813e6ec304c68b26f08`),后端 jar SHA-256 `bdbd50be0b5e6aaa05504726fee7016a712c3138494ac84c4d4dfbe669aa6379`;线上仍加载管理端 `assets/index-CJZ3Ax3Z.js`(SHA-256 `8b9278a26ccb760abce489b12a20b221748c64d4c4153613d2511777bb9677bc`)与 H5 `assets/index-D4-NrEpb.js`(SHA-256 `ab15bfd17cabe58e2f34b0ac61ee198a837128ed85dc6bb0ddf77bc3e22dcd9c`),当前分支修复尚未发布。`RELEASE_VERIFY_REMOTE_MATCH=true ./scripts/release-preflight.sh` 在工作区卫生检查阶段因两份用户未提交 Figma 文档停止;本轮未执行生产静态同步、后端重启或业务数据写入。
|
||||
- 2026-07-14 21:28 BRD 发布只读复核:生产根站、`/h5/` 和 `/prod-api/auth/tenant/list` 均返回 `200`;线上管理端仍加载 `assets/index-CJZ3Ax3Z.js`(SHA-256 `8b9278a26ccb760abce489b12a20b221748c64d4c4153613d2511777bb9677bc`),H5 仍加载 `assets/index-D4-NrEpb.js`(SHA-256 `ab15bfd17cabe58e2f34b0ac61ee198a837128ed85dc6bb0ddf77bc3e22dcd9c`)。本地最新提交 `d2b0035e` 的租户隔离修复尚未发布;本轮仅做 GET/hash 核验,未执行生产静态同步、后端重启或业务数据写入。
|
||||
- 2026-07-14 BRD G3 多租户动态上下文修复:候选资料、案例、仪表盘、面试、组织同步和陪练服务此前从 `LoginHelper` 读取租户,后台 `TenantHelper.dynamic(...)` 场景可能回退到 `000000`;现统一改用 `TenantHelper.getTenantId()`,保留案例服务的 `LoginHelper` 仅用于当前操作人身份,并新增源码契约测试与 `demo-check` marker。未修改业务数据;正式多租户环境仍需跨租户 HTTP 回归。
|
||||
|
||||
@@ -171,6 +171,8 @@ RELEASE_REMOTE_URL=https://peilian.njzhmj.top RELEASE_VERIFY_REMOTE_MATCH=true .
|
||||
RELEASE_REMOTE_URL=https://peilian.njzhmj.top RELEASE_VERIFY_REMOTE_MATCH=true RELEASE_VERIFY_REMOTE_BACKEND=true ./scripts/release-preflight.sh
|
||||
```
|
||||
|
||||
`RELEASE_VERIFY_REMOTE_BACKEND=true` 必须与 `RELEASE_VERIFY_REMOTE_MATCH=true` 同时使用;远端后端默认核对 `/opt/wygj/app/ruoyi-admin.jar`,如发布路径不同可通过 `RELEASE_REMOTE_BACKEND_PATH` 覆盖。
|
||||
|
||||
带 `RELEASE_REMOTE_URL` 时,预检同时校验租户接口 JSON 的业务 `code=200`;HTTP 200 但业务返回 401/405 会判定失败。
|
||||
|
||||
发布时必须保留 preflight 输出、远端备份目录和发布后浏览器回归结果;回滚优先使用对应备份目录恢复,再重启后端服务,不能直接覆盖当前线上目录而不留证据。
|
||||
|
||||
@@ -49,6 +49,10 @@ require_file "$frontend_asset_path"
|
||||
require_file "$mobile_asset_path"
|
||||
grep -q '/h5/' "$mobile_index" || fail "mobile H5 index does not contain the /h5/ base path"
|
||||
|
||||
if [[ "${RELEASE_VERIFY_REMOTE_BACKEND:-false}" == "true" && "${RELEASE_VERIFY_REMOTE_MATCH:-false}" != "true" ]]; then
|
||||
fail "RELEASE_VERIFY_REMOTE_BACKEND=true requires RELEASE_VERIFY_REMOTE_MATCH=true"
|
||||
fi
|
||||
|
||||
head_epoch="$(git show -s --format=%ct HEAD)"
|
||||
|
||||
file_epoch() {
|
||||
@@ -102,6 +106,7 @@ if [[ -n "${RELEASE_REMOTE_URL:-}" ]]; then
|
||||
curl -fsS --max-time 15 "$remote/" >/dev/null || fail "remote root check failed: $remote/"
|
||||
echo "remote_root=200 $remote/"
|
||||
require_remote_business_success "remote_tenant_list" "$remote/prod-api/auth/tenant/list"
|
||||
require_remote_business_success "remote_mobile_home" "$remote/prod-api/api/aihr/mobile/home/user"
|
||||
|
||||
if [[ "${RELEASE_VERIFY_REMOTE_MATCH:-false}" == "true" ]]; then
|
||||
remote_frontend_asset="$(curl -fsS --max-time 15 "$remote/" | sed -nE 's/.*src="(\/assets\/[^" ]+\.js)".*/\1/p' | head -n 1)"
|
||||
@@ -124,7 +129,7 @@ if [[ -n "${RELEASE_REMOTE_URL:-}" ]]; then
|
||||
if [[ "${RELEASE_VERIFY_REMOTE_BACKEND:-false}" == "true" ]]; then
|
||||
command -v ssh >/dev/null 2>&1 || fail "ssh is required for remote backend verification"
|
||||
remote_ssh="${RELEASE_REMOTE_SSH:-YCWY}"
|
||||
remote_backend_path="/opt/wygj/app/ruoyi-admin.jar"
|
||||
remote_backend_path="${RELEASE_REMOTE_BACKEND_PATH:-/opt/wygj/app/ruoyi-admin.jar}"
|
||||
remote_backend_sha256="$(ssh -o BatchMode=yes -o ConnectTimeout=10 "$remote_ssh" "sha256sum '$remote_backend_path'" | awk '{print $1}')" || fail "remote backend hash check failed: $remote_ssh:$remote_backend_path"
|
||||
[[ "$remote_backend_sha256" =~ ^[0-9a-f]{64}$ ]] || fail "remote backend hash is invalid: $remote_ssh:$remote_backend_path"
|
||||
local_backend_sha256="$(sha256 "$backend_jar")"
|
||||
|
||||
Regular → Executable
+2
@@ -1,3 +1,5 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user