test(r39): 真实HTTP发布单场景闭环 + CI 补取 before 重试修复 #14

Open
zheromiku wants to merge 3 commits from test/publish-http-single-scenario into feat/cloud-test-release-executor
Owner

已实现

  • 12b3769:r39 正式发布单场景(真实 HTTP 发布成功闭环 + 同请求幂等)测试夹具与用例,本机以真实
    HTTP/队列/工作器跑通,证据根 r38-publish-http-20261102T090221(61 项断言、失败 0、168 个 raw 文件)。
  • d2ff089:.gitea/scripts/ci_checkout.sh 补取事件 before 失败时重试一次,并把最后一次错误打进日志。
    只改这一处;范围选择、判红口径、fail-closed 语义未动。

为什么改 CI 脚本(缺陷证据)

浅克隆里 fetch --depth 取未公开对象(改写推送后的旧提交)时,git 中途重写 .git/shallow 后中止:
fatal: shallow file has changed since we read it。后果是 before 不在克隆里 → commits 检查算不出范围 → 流水线红,
红的原因与代码质量无关。

  • 真实 CI:run 305–317 共 13 次(含 317 原地重跑 attempt 2)全部停在这一步;
  • 同一仓库里紧接着重试同一条命令即成功;
  • 用同一 runner 镜像在容器里按真实事件负载跑 bootstrap + --post-checkout 复现该 fatal;改后输出
    ✅ 已补取事件 before eaf389e506f5,ci_gate 算出 事件 Git 范围 eaf389e..12b3769|1 条提交 并通过。

真跑过的测试

  • CI:run 318 / job 333,head d2ff089b9554708dff7c473d3f25246920fadac0,build / build (push) success,
    16 项全部 success(identity/commits/deps-install/format/static-go/static-web/build-go/build-web/tests-go/
    tests-web/contracts/takeover-log-contract/version/security-secrets/security-deps/manifests-locked),
    tests-go 执行 65 包、用例 1355 通过 / 0 失败 / 402 跳过(402 全为已声明的可选集成,必需 0)。
  • 报告核对:16 项、档案 ci、SHA d2ff089b9554、总体 success(与报告自称一致);静态预览已发布,两个地址实测 200。
  • 本地 make verify:16 项通过(identity 本地 skipped),退出码 0。

尚未验证

  • 本次推送的 before 就在克隆里,新 CI 没有走到修复后的重试分支;该分支目前只有容器夹具级证据。
  • 候选 UI、正式 8088、SSH/云传输、Capture/Export HTTP、DS01/kill/PUT 丢响应:未覆盖。
  • --unshallow 在浅克隆里同样会失败(开发版本号退回 dev+g<短SHA>,版本契约允许,绿 run 303/304/318 均如此)。

边界

  • 未合并、未部署;未改系统/Runner/分支保护/生产;本次只新增一个 CI 脚本提交,没有产品代码与版本变动。
## 已实现 - `12b3769`:r39 正式发布单场景(真实 HTTP 发布成功闭环 + 同请求幂等)测试夹具与用例,本机以真实 HTTP/队列/工作器跑通,证据根 `r38-publish-http-20261102T090221`(61 项断言、失败 0、168 个 raw 文件)。 - `d2ff089`:`.gitea/scripts/ci_checkout.sh` 补取事件 `before` 失败时重试一次,并把最后一次错误打进日志。 只改这一处;范围选择、判红口径、fail-closed 语义未动。 ## 为什么改 CI 脚本(缺陷证据) 浅克隆里 `fetch --depth` 取**未公开**对象(改写推送后的旧提交)时,git 中途重写 `.git/shallow` 后中止: `fatal: shallow file has changed since we read it`。后果是 `before` 不在克隆里 → `commits` 检查算不出范围 → 流水线红, 红的原因与代码质量无关。 - 真实 CI:run 305–317 共 13 次(含 317 原地重跑 attempt 2)全部停在这一步; - 同一仓库里紧接着重试同一条命令即成功; - 用同一 runner 镜像在容器里按真实事件负载跑 bootstrap + `--post-checkout` 复现该 fatal;改后输出 `✅ 已补取事件 before eaf389e506f5`,`ci_gate` 算出 `事件 Git 范围 eaf389e..12b3769|1 条提交` 并通过。 ## 真跑过的测试 - CI:run 318 / job 333,head `d2ff089b9554708dff7c473d3f25246920fadac0`,`build / build (push)` **success**, 16 项全部 success(identity/commits/deps-install/format/static-go/static-web/build-go/build-web/tests-go/ tests-web/contracts/takeover-log-contract/version/security-secrets/security-deps/manifests-locked), tests-go 执行 65 包、用例 1355 通过 / 0 失败 / 402 跳过(402 全为已声明的可选集成,必需 0)。 - 报告核对:`16 项、档案 ci、SHA d2ff089b9554、总体 success(与报告自称一致)`;静态预览已发布,两个地址实测 200。 - 本地 `make verify`:16 项通过(identity 本地 skipped),退出码 0。 ## 尚未验证 - 本次推送的 `before` 就在克隆里,**新 CI 没有走到修复后的重试分支**;该分支目前只有容器夹具级证据。 - 候选 UI、正式 8088、SSH/云传输、Capture/Export HTTP、DS01/kill/PUT 丢响应:未覆盖。 - `--unshallow` 在浅克隆里同样会失败(开发版本号退回 `dev+g<短SHA>`,版本契约允许,绿 run 303/304/318 均如此)。 ## 边界 - **未合并、未部署**;未改系统/Runner/分支保护/生产;本次只新增一个 CI 脚本提交,没有产品代码与版本变动。
zheromiku added 2 commits 2026-11-02 09:28:13 +08:00
新增单场景用例 TestFormalPublishHTTPReplaySucceededR39:发布作业只来自
真实监听的 POST /api/v1/library/syncs(管理员会话+真实授权),不再用
store.CreateLibraryDispatch 或 httptest 冒充。链路覆盖 handoff 队列
(capture 角色)→ 真实 libraryctl pack/unpack/verify → 独立 executor
archive → release-executor 队列 → succeeded/production_effective/维护释放
/入口恢复,以及同一 body 原样重放的零新增执行。

来源身份先声明后封存:source_id 由独立配置推导,来源行真实落进隔离 PG
schema 再读回后封存;目标基线走正式 POST /api/v1/library/baselines 的
真实整库捕获,不手写生效版本。旧 r38 故障恢复分支一行未改。
浅克隆里用 fetch --depth 取一个未公开的对象(改写推送后的旧提交就是这种)时,
git 会在这次 fetch 中途重写 .git/shallow,随后中止:
fatal: shallow file has changed since we read it。
before 取不到 ⇒ commits 检查算不出范围 ⇒ 整条流水线红,红的原因与代码质量无关。

证据(真实 CI):run 305–317 共 13 次(含 317 的原地重跑)全部停在这一步;
同一仓库里紧接着重试同一条命令即成功。用同一 runner 镜像在容器里跑
"bootstrap + ci_checkout.sh --post-checkout"(真实事件负载)复现出该 fatal,
原脚本报"取不到事件 before",改后报"已补取事件 before eaf389e506f5",
随后 ci_gate 算出 事件 Git 范围 eaf389e..12b3769|1 条提交 并通过。

只加一次重试与错误回显:范围选择、判红口径、fail-closed 语义都没动 ——
两次都失败仍明确报警,由 commits 检查判红,不收缩范围、不放行。
zheromiku added 1 commit 2026-11-02 10:14:09 +08:00
原重放段只比 Listing 的 key@versionId#etag#size,同一版本号下的字节
被改写它看不见,因此"重放后字节不变"缺实测证据。

改为重放前后各调一次 r38ObjectVersionDigests:逐 key+versionId 真实
GET 并本地算 SHA256,落完整版本清单(含版本、ETag、size、摘要),
再逐项比较;GET 失败、清单缺条目、版本增减或摘要不同都判失败。
治理 PG/ES/ledger/receipt 零新增断言保持原样。

离线负控 TestR39ReplayObjectByteControl:固定"旧判据对字节改写报相同"
的盲区,并要求新判据在同一元数据上报 bytes changed、正例不误报、
空清单/缺摘要必须红;用变异(去掉摘要比较)确认该负控会红后恢复。

台账:04-baseline-and-auth.json 分开记录授权 201 与基线 202,
不再让后一次状态码覆盖前一次。
Some checks are pending
build / build (push) Successful in 1m55s
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin test/publish-http-single-scenario:test/publish-http-single-scenario
git checkout test/publish-http-single-scenario
Sign in to join this conversation.