ci / 质量门禁 (push) Canceled after 0s
背景: - 本轮部门管理联调后执行了 pnpm db:reset 清理测试数据,清空本地库, 导致用户手工改过的登录密码被重置回 lingxi2026; - 之前只保证了 ./dev.sh / pnpm dev / pnpm db:init 不会重置数据, db:reset 本身仍可被脚本或助手无提示执行,问题没有真正兜住。 改动: - 新增 scripts/db-reset.mjs:默认拒绝执行并打印影响;只有显式 ALLOW_DB_RESET=1 才调用 prisma migrate reset --force; - package.json 的 db:reset 指向该脚本; - README / AGENTS §6 §11 / e2e README / A1 实施报告同步: 日常迁移补种子只用 pnpm db:init,验证/联调中禁止 db:reset; e2e 会改写 actor 密码,需使用专用账号或独立测试库。 影响面: - 确需清库时多一步显式确认;迁移、启动、单测、int 测试不受影响。 回滚方式: - 回滚本提交即恢复 db:reset 直接执行 prisma migrate reset --force。 验证证据: - pnpm db:reset 无 ALLOW_DB_RESET 时退出码 1,并打印拦截说明; - pnpm format:check / lint 通过;node --check scripts/db-reset.mjs 通过。
40 lines
1.3 KiB
JavaScript
40 lines
1.3 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* 清库重建的显式闸门。
|
||
*
|
||
* `prisma migrate reset --force` 会清空全部表并重新 seed,所有账号密码都会
|
||
* 回到初始值;开发/联调中误执行会直接丢掉本地改过的密码与业务数据。
|
||
* 因此必须显式设置 ALLOW_DB_RESET=1 才放行,日常初始化请用 `pnpm db:init`。
|
||
*/
|
||
import { spawnSync } from 'node:child_process';
|
||
|
||
const allowed = process.env.ALLOW_DB_RESET === '1';
|
||
|
||
if (!allowed) {
|
||
console.error(`
|
||
⛔ 已阻止 pnpm db:reset。
|
||
|
||
该命令会清空本地数据库并重新 seed,所有账号密码都会回到初始密码
|
||
(admin / jiang.lan 等种子账号 → lingxi2026,且 must_change_password=true)。
|
||
|
||
- 日常迁移 + 幂等种子(不改已有密码):pnpm db:init
|
||
- 确实需要清库时,显式执行:
|
||
ALLOW_DB_RESET=1 pnpm db:reset
|
||
`);
|
||
process.exit(1);
|
||
}
|
||
|
||
console.warn('⚠️ ALLOW_DB_RESET=1:即将清空数据库并重新 seed,所有账号密码会重置为初始值。');
|
||
|
||
const command = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm';
|
||
const result = spawnSync(command, ['exec', 'prisma', 'migrate', 'reset', '--force'], {
|
||
stdio: 'inherit',
|
||
});
|
||
|
||
if (result.error) {
|
||
console.error('执行 prisma migrate reset 失败:', result.error.message);
|
||
process.exit(1);
|
||
}
|
||
|
||
process.exit(result.status ?? 1);
|