Appearance
线上 .env.pack strict 合并与 E2E Readonly
1. 合并 strict 到 .env.pack
deploy/docker/.env.pack 在 gitignore 中,须在部署机或本机操作,勿提交仓库。
方式 A:脚本(推荐,幂等)
bash
# 仓库根目录;需已有 .env.pack(含 DATABASE_URL 等)
chmod +x deploy/scripts/merge-env-pack-strict.sh
./deploy/scripts/merge-env-pack-strict.sh环境变量 ENV_PACK 可指向其它路径。
方式 B:手工
bash
# 尚无 .env.pack 时
cp deploy/docker/env.external-dbs.example deploy/docker/.env.pack
# 编辑数据库、域名、密钥…
# 追加 strict(或复制 env.pack.example 中的四行)
cat deploy/docker/snippets/permission-strict.env.snippet >> deploy/docker/.env.pack校验
bash
pnpm run check:env-pack
# 须 exit 0;失败则检查 ACC_ROUTE_GUARD_STRICT / SYS_ROUTE_GUARD_STRICT 是否为 true
pnpm run check:strict-matrix # staging 样例 + 本地 .env.pack(存在时)
pnpm run check:program-gates # 全仓 check + staging + env-pack(PR 等价)
pnpm run check:p0-release # 上式 + check:month-close(须 backend/.env DATABASE_URL)部署后
push-and-deploy/ 重启 gateway、sys、acc- 按 permission-staging-checklist.md §4、§4.2 手工验收并签字
2. GitHub Secrets(只读 E2E)
仓库 Settings → Secrets and variables → Actions → New repository secret:
| Secret | 说明 | 示例 |
|---|---|---|
E2E_ACCOUNT_READONLY | 仅 PC 读权限账号(无 btn_acc_*_write) | readonly_pc |
E2E_PASSWORD_READONLY | 对应密码 | — |
E2E_API_BASE_URL | 网关根 URL(非 Vite 5000) | http://120.26.80.246:3000 |
E2E_SITE_ID | 该账号可访问的站点 UUID | — |
E2E_ACCOUNT_WRITE / E2E_PASSWORD_WRITE | 具备 btn_acc_*_write 的账号(正向 E2E,可选) | — |
E2E_GOODS_RAW_ID | P2 入库冒烟固定原料(可选,未设则 goods/page 取首条原料) | 预发原料 UUID |
E2E_SUPPLIER_ID | P2 入库冒烟固定供应商(可选,未设则 suppliers/page 取首条) | 预发供应商 UUID |
E2E_OUTBOUND_ORDER_ID / E2E_OUTBOUND_LINE_ID | P2 部分退货冒烟固定出库行(可选,未设则自动找可退单) | 出库单/明细 UUID |
P2 正向冒烟(e2e/acc-stock-p2-smoke.spec.ts + acc-stock-p2-api.spec.ts):在 e2e-smoke job 中与只读用例一并执行;须 E2E_API_BASE_URL 指向可达的预发网关(非 Vite 5000)。本地全栈脚本:pnpm run smoke:acc-inbound / pnpm run smoke:acc-outbound-return(需 backend/.env + dev:backend)。
GitHub 仓库配置(一次性):Settings → Secrets and variables → Actions → 按上表新建 Secret;本地可跑 pnpm run check:e2e-secrets-hint 对照缺失项。未配置时 ci.yml 的 e2e-smoke 会 skip,不阻断 pnpm run check。
账号须能登录且至少能打开 /acc/inbound(有菜单读权限);否则用例会 skip 或失败。
3. 手动跑 E2E Readonly Stack
- GitHub → Actions → E2E Readonly Stack → Run workflow
- 日志中
acc-readonly-posting、acc-permission-denied-api、sys-permission-denied-api应全部 passed(或网关不可达时 skip) - 若 skipped:未配 Secrets 或
E2E_API_BASE_URL连不上网关(CI 无后端时登录失败会 skip)
本地等价:
bash
pnpm run dev:backend
pnpm run dev:web
E2E_ACCOUNT_READONLY=... E2E_PASSWORD_READONLY=... \
E2E_API_BASE_URL=http://127.0.0.1:3000 E2E_SITE_ID=... \
pnpm run test:e2e -- acc-readonly-posting acc-readonly-route-guard acc-permission-denied-api sys-permission-denied-apiacc-permission-denied-api:只读账号对入/出/生产/WIP 开单/结算/删客户等写接口须 403 + PERMISSION_DENIED(网关层)。
acc-readonly-route-guard:只读账号访问未分配菜单路由(如 /sys/users)须跳转 /no-permission(清单 #8)。
sys-permission-denied-api:只读账号对角色分配保存、用户 admin 保存、站点保存等 admin 接口须 403 + PERMISSION_DENIED(无需 X-Site-Id)。
Playwright 用例与 Secrets 说明见仓库根目录 e2e/README.md(该文件在 docs/ 外,勿在文档内写相对链接,否则 VitePress 构建会报 dead link)。