7a9d51cc70
按要求补三项(本轮不推、不打真实 tag、不部署;全部用临时仓库与假对象验):
1) 正式构建身份不能只认 --release:
- 新增 release_evidence():核①完整 40 位 SHA ②**指向该提交的注释 tag** v<版本号>
③该提交里 CHANGELOG 顶部版本一致。缺任一条 ⇒ rc=2,身份退回 development 并把
release_blocked 的原因写进 JSON(给机器读,也给人看)。
- version.py --self-test:六条负例(有版本无 tag / unknown SHA / 短 SHA / tag 指错提交 /
轻量 tag / 版本不一致)+ 证据齐正例,**tag 全部在 mktemp 临时仓库里创建**。
- Go 侧新增 TestReleaseBuildRequiresEvidence:release 构建必须 CommitSHA 完整且
v<ReleaseVersion> 是**注释 tag** 并指向该提交(独立于 Python 的二次复核)。
2) 发布预检区分"准备建议"与"发布就绪":
- 新增纯函数 readiness(facts) → (是否就绪, 阻塞项, 建议);输出分两段。
- **就绪要求候选版本已写进目标提交**(version_in_commit:查 git show <sha>:CHANGELOG.md,
工作区写了没提交不算);首发按**显式指定版本**处理,**不把"记录里有这个版本"当已发布**
(已发布的证据是 tag,不是记录条目)。
- 预检**不执行、也不在输出里推荐自动发布路径**(正式发版由人按 docs/RELEASE_RUNBOOK.md)。
3) CI 就绪判据:必需 context 集合来自 .gitea/required-contexts.txt(缺失/为空 ⇒ 没有策略 ⇒
阻断,不用观察到的状态顶替);**全部 success 才通过**,失败/缺项/pending/查询异常一律阻断。
Release 查询加 release_state():**只有 HTTP 404 才算不存在**,403/5xx/超时算查询异常 ⇒ 阻断。
验证:version.py --self-test 绿;release_preflight --self-test 绿(就绪判定 19 个分支 +
临时仓库验证 git show 语义 + 五个 HTTP 码语义);go test 三态(未注入 SKIP / 开发 PASS /
自称正式 RED);反向夹具 83/0(含临时仓库 go test 六例、预检"记录未进提交"两态);
make verify 15/15 success。
59 lines
3.1 KiB
JSON
59 lines
3.1 KiB
JSON
{
|
||
"_doc": [
|
||
"测试范围声明:**哪些跳过是允许的**。judge 在 scripts/ci_checks.py 里读这个文件。",
|
||
"极性是『默认必需』:没在这里声明的测试,一旦被 SKIP / PENDING ⇒ 门禁红(必需项不能报通过)。",
|
||
"只有『确实需要外部环境、本仓拿不到』的集成/外部依赖用例才写进来,每条必须写清理由。",
|
||
"package 级条目 = 该包里所有 skip 都算『可选未运行』(例如整个包都依赖 TEST_DATABASE_URL)。",
|
||
"test 级条目 = 只豁免那一个用例(包里其它用例仍是必需的)。",
|
||
"报告里会把这些『可选未运行』的条数与原因如实列出 —— 记录,不等于通过。",
|
||
"⚠️ 文件缺失或解析不了 ⇒ 门禁红:范围声明不出来时,不许默认放行。"
|
||
],
|
||
"optional": [
|
||
{
|
||
"package": "knowledge-governance/internal/platform/postgres",
|
||
"reason": "整个包的集成用例都要 TEST_DATABASE_URL 指向可销毁测试库;本仓不连生产库,CI 无库 ⇒ 跳过(补验路径:起一次性 PG 后设 TEST_DATABASE_URL)"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/internal/releaseadapter/v071",
|
||
"reason": "v0.7.1 源/目标库与 MinIO 集成环境;无环境即跳过"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/cmd/pp-ledger-import",
|
||
"reason": "导入器集成用例需要 TEST_DATABASE_URL"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/cmd/release-worker",
|
||
"reason": "release runtime 集成用例需要受限文件与运行时环境变量"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/internal/monitoring",
|
||
"reason": "真实服务健康矩阵 / 指标窗口用例需要外部服务可达"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/internal/httpapi",
|
||
"test": "TestUISettingsWriteReadBackIntegration",
|
||
"reason": "系统设置写回读用例需要一个运行中的实例"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/internal/httpapi",
|
||
"test": "TestUISettingsWriteReadBackWithLiveVerification",
|
||
"reason": "同上(带实时校验的那条)"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/internal/version",
|
||
"test": "TestNumberMatchesChangelog",
|
||
"reason": "未注入版本号时按设计 SKIP(本地跑全量测试不该被迫先构建);**它的强制点在 contracts 项**:那里带 -ldflags 跑它并断言真的 PASS、且出现 SKIP 就判红"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/internal/version",
|
||
"test": "TestDevBuildDoesNotClaimRelease",
|
||
"reason": "构建身份未注入时按设计 SKIP(本地跑全量测试不该被迫先构建);**它的强制点在 contracts 项**:那里带 -ldflags 跑它并断言真的 PASS、且出现 SKIP 就判红"
|
||
},
|
||
{
|
||
"package": "knowledge-governance/internal/version",
|
||
"test": "TestReleaseBuildRequiresEvidence",
|
||
"reason": "构建身份未注入时按设计 SKIP(本地跑全量测试不该被迫先构建);**它的强制点在 contracts 项**:那里带 -ldflags 跑它并断言真的 PASS、且出现 SKIP 就判红"
|
||
}
|
||
]
|
||
}
|