a3a1319a11
一次性把本地与 CI 的门禁收成一条命令:make verify = python3 scripts/ci_checks.py。 两边跑的是同一份逻辑,不再各写一套步骤(两边各写一套的结局是迟早只改一边)。 14 项必需检查:identity(检出 == 事件完整 SHA,只在 CI 必需)、commits、deps-install、 format、static-go、static-web、build-go、build-web、tests-go、tests-web、contracts、 security-secrets、security-deps、manifests-locked。make list 打印清单。 三条判据写死在代码里: - 失败即停,但剩下的记 not_run 并如实写进报告;aggregate() 只认 success, 未运行/被跳过都不算通过(不适用要在清单里声明 required_in,不许运行时悄悄 skip)。 - 工具缺失、依赖没按锁装、输出解析不了 ⇒ 失败,不当成"检查通过"。 - 测试必须真跑:go test 加 -count=1 并盘点通过/跳过数;前端读 vitest 的 JSON 报告, 空套件不算通过。跳过原因会打进报告(当前 72 个集成用例因缺 TEST_DATABASE_URL 跳过)。 新增四个自带反向自检的脚本(--self-test 故意弄坏必须红): scripts/check_format.py(Go 判输出而非退出码 + 前端只能减的基线)、 scripts/check_secrets.py(只打印位置与类别,绝不打印值)、 scripts/check_deps_vuln.py(govulncheck 锁 v1.1.4 + npm audit 分级 + 到期例外)、 scripts/ci_checks.py(门禁 + 汇总)。 验证(本机实跑,全部为真实退出码): make verify → 总体 success(档案 local),identity=skipped 已在清单里声明为 CI 必需; tests-go 执行 31 个包、通过 549 / 失败 0 / 跳过 72;tests-web 106 个套件、191 个用例全过; security-deps:govulncheck v1.1.4 0 命中、npm audit 生产与全量均 0。
18 lines
1.1 KiB
JSON
18 lines
1.1 KiB
JSON
{
|
||
"_doc": [
|
||
"依赖漏洞**例外**登记表。判据与分级在 scripts/check_deps_vuln.py,CI 会跑它。",
|
||
"只有 high/critical(以及 govulncheck 的任何命中)才需要例外;moderate 及以下只记录。",
|
||
"一条例外要**全部**字段齐全才算有效,缺一个就当成没有例外:",
|
||
" tool : govulncheck | npm-audit",
|
||
" id : 漏洞编号(govulncheck 用 GO-xxxx-yyyy,npm 用 GHSA-xxxx-xxxx-xxxx)",
|
||
" package : 包名(给 npm 用;govulncheck 填模块名)",
|
||
" severity : critical | high(govulncheck 的命中填空字符串)",
|
||
" scope : prod | dev | build",
|
||
" reason : 为什么这个风险在本仓不适用 / 不可修",
|
||
" owner : 谁负责在到期前处理",
|
||
" approved_by : 谁批准的(必须是**人**;写 TBD/pending/self 一律判为无效)",
|
||
" expires_on : YYYY-MM-DD,过期当天即失效 —— 过期不是\"继续有效\",是\"重新走一遍审批\"",
|
||
"纪律:例外是记账,不是免检。到期没人处理 ⇒ 门禁红 ⇒ 必须有人做决定。"
|
||
],
|
||
"exceptions": []
|
||
} |