拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Beads 的 PR-CI 门禁补全:让 `TestBenchDBPurgeDoesNotLeak` 在真实 Dolt Server 上真正运行起来

Beads 的 PR-CI 门禁补全让TestBenchDBPurgeDoesNotLeak在真实 Dolt Server 上真正运行起来【免费下载链接】beadsBeads - A memory upgrade for your coding agent项目地址: https://gitcode.com/GitHub_Trending/beads1/beads导读本文围绕 Beads 仓库中的发布门禁记录 be-pp7e-gate.md 展开讲解一个典型的 CI 布线缺口及其修复TestBenchDBPurgeDoesNotLeak这类强依赖真实 Dolt Server 的回归测试过去在既有 CI 泳道中会因「无活服务器」而被checkDolt静默跳过SKIP导致「看起来绿、实际没测」的假阳性。门禁 be-pp7e 为 .github/workflows/pr-risk.yml 新增了test-server-storage-full泳道16 分片让这些测试在真实、活跃的 Dolt 容器服务器上获得真正的 PASS/FAIL。读完本文你将掌握这条泳道的设计动机与分片机制、底层回归测试的探测与反证positive control设计、以及门禁评审的七项判定标准与证据链组织方式。背景为什么一个「内存升级 Agent」仓库需要操心 Dolt 容器清理Beads 是一个为编码 Agent 提供记忆升级的轻量级 issue 追踪器其存储层默认构建在 Dolt一个带 Git 语义的 MySQL 兼容数据库之上。仓库中 internal/storage/dolt/ 包承载了全部 Dolt 后端逻辑其中dropBenchDB负责在基准测试bench流程中清理临时数据库。若它只执行DROP DATABASE而不执行CALL DOLT_PURGE_DROPPED_DATABASES()每一次 bench 采样都会在服务器的.dolt_dropped_databases/目录中遗留下一个benchdb_*目录反复运行就会让该目录无限增长——这就是 be-pq5 所追踪的泄漏缺陷。Dolt 1.86 并不提供查询已删除数据库列表的 SQL 视图因此唯一的泄漏检测手段是统计服务器容器内部.dolt_dropped_databases/目录的条目数。而该目录没有宿主可见路径测试只能通过docker exec进入容器读取。这正是 dolt_benchmark_purge_test.go 中TestBenchDBPurgeDoesNotLeak的存在意义——它同时是本篇门禁文档与姊妹门禁 be-vc1m-purge-dropped-database-gate.md 共同关注的回归防线。问题SKIP 不等于 PASS——被静默跳过的回归测试在 be-aiy5 修复之前PR 触发的 CI 泳道存在一个真实布线缺口test-server-storage泳道虽然通过build-embedded编译出的/tmp/dolt-conformance-test二进制把internal/storage/dolt包的全部顶层测试都带上了但它只用-test.run ^TestConformance$限定执行一致性conformance套件其余强依赖实时服务器的测试——TestCreateGuard_*、TestFederationPeerCredentialLifecycleLazyKeyInit以及 PR #5792 上的 diff 归属测试TestBenchDBPurgeDoesNotLeak——没有任何 PR 触发泳道覆盖运行时因为找不到活 Dolt Server 而自我 SKIPself-skip。姊妹门禁 be-vc1m 的记录揭示了这一问题的严重性PR #5339 曾因「一致性审计把 criterion 3 评为 PASS而真正的新测试却是整个运行中唯一的 SKIP」而在门禁上栽过跟头。be-vc1m 起初也因此拿到「FAIL仅 SKIP」的判定——diff 归属测试在唯一的 CI 泳道中结果是 SKIPno test Dolt server runningPASS 与 FAIL 均为零。这被根因定位为真实的 CI 布线缺口即 be-aiy5而非 diff 自身的缺陷。该记录引出了门禁判定的一条金律后来被 be-vc1m 的更正记录进一步补齐为对偶表述「SKIP 不是 PASS」同理「不可能失败的 PASS 也不是证据」。修复为 pr-risk.yml 新增test-server-storage-full泳道泳道设计与 4 文件 diffbe-aiy5 作为 builder bead其修复经 be-w90n 评审verdict PASS随 be-pp7e 门禁放行。diff 范围经git diff --stat确认为 4 个文件、124 行插入、6 行删除.github/workflows/pr-risk.yml—— 新增test-server-storage-fulljob主要 diff 内容scripts/ci_workflow_test.go —— 新增元测试断言新 job 的形状scripts/ci_capability_selector_test.go —— 修改既有预期scripts/pull_dolt_image_test.go —— 修改既有预期。新 job 的关键设计与 pr-risk.yml 中的实际定义一致复用既有产物不新增构建步骤needs: [detect-ci-tier, build-embedded]直接下载embedded-test-binaries工件中的/tmp/dolt-conformance-test再叠加./scripts/ci/install-dolt.sh与./scripts/ci/pull-dolt-image.sh16 分片矩阵strategy.matrix.shard为 1–16fail-fast: false一个分片慢/抖不应取消其余分片分片数按嵌入式泳道的比例推算——约 1126 个顶层测试、每测试成本按 324 测试/75 分片分钟折算16 × 15 分钟 ≈ 240 分片分钟其中耗时约 9.5 分钟的TestCloudAuthCLIRouting通过分片清单manifest隔离到独立分片环境开关BEADS_TEST_ENV_RUN_DOLT1这是本泳道「失败即发声」的保证——federation_test.go在该变量被设置而预期服务器不可达时会Fatal而不是静默跳过从而保证 SKIP 不再能藏在绿色之下接入 ci-gate 必需列表ci-gatejob 将TEST_SERVER_STORAGE_FULL加入needs与CI_GATE_REQUIRED使该泳道成为 PR 合入门禁的必需检查。test-server-storage本身保持原样、不被拓宽——一致性套件继续由它独占运行-test.run ^TestConformance$新泳道是加法式的兄弟 job而非对既有 job 过滤条件的放宽。这正是门禁标准之一「gate 未被放宽」的具体落点。分片脚本manifest 优先、哈希兜底新泳道由 .github/scripts/server-storage-test-shard.sh 驱动。其分片逻辑如下从仓库根目录执行grep -rh ^func Test internal/storage/dolt/*_test.go发现全部顶层测试函数排除TestConformance后者由test-server-storage按-test.run子测试路径分片机制不同若测试出现在提交的清单文件server-storage-test-shards.txt中且清单的总分片数匹配则使用提交的显式分片分配把已知重量级测试固定到互不聚集的分片新加入的测试走可移植哈希兜底cksum(name) % TOTAL_SHARDS决定归属分片优先使用预构建测试二进制BEADS_TEST_SERVER_TEST_BINARY默认/tmp/dolt-conformance-test缺失时才回退go test -tagsintegration,gms_pure_go。预构建二进制分支有个易踩的坑脚本与测试都做了显式防护预构建测试二进制继承调用 shell 的 cwd而包内若干测试如pr4107_corruption_test.go、journal_scope_completeness_test.go使用相对路径../schema/migrations、../issueops因此脚本必须在exec $STORAGE_BINARY之前cd internal/storage/dolt——但这一cd必须严格位于「仓库根相对发现逻辑之后、exec 之前」同时不得出现在go test回退分支里。这些次序约束都由 TestServerStorageShardScriptRunsPrebuiltBinaryFromPackageDir 逐行断言。底层回归测试一个「不可能失败」的测试如何被救活初版缺陷-xdev让探针永远返回空be-pp7e 门禁放行的泳道只是把测试送上了真实服务器而测试本身能否真正工作则在姊妹门禁 be-vc1m 的更正记录2026-08-24中被独立审查发现初版TestBenchDBPurgeDoesNotLeak的探针在容器内执行find / -xdev …来定位.dolt_dropped_databases但 Dolt 镜像声明了VOLUME /var/lib/dolt数据目录是独立挂载——容器内stat -c %d / /var/lib/dolt报告不同的设备 ID-xdev在挂载边界就停住了。探针每次返回条目计数恒为 0泄漏断言0 0永远成立。审查者做了两次实证在活容器中运行find / -xdev得到空结果、find /却找到/var/lib/dolt/.dolt_dropped_databases以及删除dropBenchDB中的DOLT_PURGE_DROPPED_DATABASES调用后测试依然通过。结论正如 be-vc1m 记录所写shard 4/16 上那次真实的--- PASS (24.90s)是真结果却什么也区分不了——墙钟时间不是断言存活的证据。一个不可能失败的 PASS 与 SKIP 同罪。现版结构正向对照 三道防线修复后的 dolt_benchmark_purge_test.go 现在是可证伪falsifiable的其结构可拆解为独立的隔离容器testutil.StartIsolatedDoltContainerHandle(t)启动专属容器而非共享的 TestMain 容器。原因有二本包有六处测试拒绝在共享容器上执行DROP DATABASE快速连续 drop 会崩溃而本测试要连做五次且 dropped-databases 目录与DOLT_PURGE_DROPPED_DATABASES都是服务器级全局状态共享服务器上基线/末次计数会与持有另一个 testSem 槽的测试竞态正向对照requireLeakIsObservable先CREATE DATABASEDROP DATABASE一个一次性库不 PURGE要求计数必须上升再执行CALL DOLT_PURGE_DROPPED_DATABASES()要求计数回落。探针看不到泄漏就立即失败——这是对-xdev那类「永远报 0」故障的永久免疫循环泄漏断言5 轮newPurgeRegressionStore→dropBenchDB→requireDatabaseDropped用SHOW DATABASES确认 DROP 真的成功防止 drop 静默失败、泄漏计数测了个寂寞→store.Close()最后断言post baseline探针实现细节find / -maxdepth 6显式剪除/proc、/sys、/dev伪文件系统绕开-xdev的挂载边界陷阱目录不存在时计数为 0服务器懒创建、PURGE 可整体移除。修复后的红/绿对照be-vc1m 更正记录证明了测试的判别力条件结果修复后的头部--- PASS: TestBenchDBPurgeDoesNotLeak (20.60s)从dropBenchDB移除 PURGE 调用--- FAIL——dolt_dropped_databases grew from 0 to 5 across 5 setup/cleanup cycles向探针重新注入-xdev故障注入到探针本身--- FAIL (2.03s)——the probe cannot observe a leak…门禁判定七项标准与证据链be-pp7e 门禁的判定矩阵完整覆盖了发布流程的合规要求可作为 CI 基础设施类改动的门禁模板#标准判定证据要点1评审 PASS 在场PASSbe-w90n 记录verdict: pass、deploy_bead: be-pp7e、deploy_commit: 7b77321…精确匹配2验收标准满足PASSbe-w90n 的spec_findings覆盖 be-aiy5 全部 4 项退出契约真实 PASS/FAIL 而非 SKIPgate 未放宽fail-loud 范围由单处BEADS_TEST_ENV_RUN_DOLT收敛范围限定在 gastownhall/beads3测试通过PASS3 个 diff 归属测试由 deployer 独立重跑真 PASS3a既有失败归因N/A已归因be-jy56、be-vf95 两个无关失败确认在origin/main上既有且均不触碰 diff 文件3b策略/lint 泳道PASSmake ci-pr-policy除版本标记子检查外干净make ci-pr-lint的 gofmt 干净diff 范围golangci-lint run ./scripts/...报 0 问题4无未解决的 HIGHPASSbe-w90n 在 style 与 security 两轮均零 HIGH/MEDIUM全部 INFO 级5工作树干净PASS仅有既有的无关未跟踪 scratch 文件从未暂存6与 main 无分歧PASSorigin/main已是祖先纯 fast-forwardassert_deploy_ancestry_scope返回 rc07单一特性主题PASS4 个文件全部服务于同一 CI 泳道特性评审发现无需处理还确认了安全性触发器是pull_request而非pull_request_target无 secrets 使用无 PR 控制的上下文被插值进新步骤action SHA 全部 pin 且与既有 job 一致新 job 中 Dolt 安装的 curl-pipe-sudo 步骤是已有 2 处调用点的既有惯用法而非新风险触碰的 Go 测试文件只改预期字面量。独立复验环境遵循测试证据完整性协议DOCKER_HOSTunix:///run/user/1000/podman/podman.sock、TESTCONTAINERS_RYUK_DISABLEDtrue。三个 diff 归属测试按精确名执行go test ./scripts/... -run names -v3/3 PASS评审方自有的完整记录为go test ./scripts/... -v60 PASS / 0 FAIL / 1 SKIP该 SKIP 是设计上自跳的非 diff 测试以及TEST_COVER1 make test93 个包全部 ok其中internal/storage/dolt真正运行并通过——确认 live podman/Dolt 基础设施确实在工作而非被悄悄绕过。关联门禁的联动be-vc1m 的解锁与遗留be-pp7e 记录末尾的旁注指出其底层的 CI 泳道修复很可能正是 be-vc1m criterion 3 一直在等待的那块拼图两者都涉及TestBenchDBPurgeDoesNotLeak/ live-Dolt-server 的 PR-CI 覆盖。事实也正是如此——be-aiy5 的修复作为 PR #5836 于 2026-08-20 合入gastownhall/beads:mainbe-vc1m 将deploy/be-vc1m-gate重新基于合并后的 main 并推送触发新 CI 运行Actions run32510110772TestBenchDBPurgeDoesNotLeak在 shard 4/16job96860162658以--- PASS (24.90s)通过。但正如前文所述那次 PASS 随后被 PR #5792 审查推翻为「证据真空」并促成了测试的探针重写。这一来一回完整呈现了门禁体系的价值闭环门禁不是一次性盖章而是把「测试必须能失败」作为持续要求——be-vc1m 仍停留在hold:mayor等待市长显式签收门禁方不自行解除他人强加的 hold。对读者而言可借鉴的操作准则包括凡是「无活环境即自我 SKIP」的测试都必须有至少一条 PR 触发的泳道提供真实服务器并把该泳道纳入必需门禁列表探针类断言必须内置正向对照让「探针瞎了」这件事本身能够被测试发现门禁记录应保存可复验的提交 SHA、评审 bead、命令与日志证据使后来者能独立还原结论。相关资源导航门禁记录be-pp7e-gate.md本文主体、be-vc1m-purge-dropped-database-gate.md姊妹门禁含红/绿对照证据回归测试源码internal/storage/dolt/dolt_benchmark_purge_test.go、同包基准测试 dolt_benchmark_test.goCI 定义.github/workflows/pr-risk.yml新增泳道、分片脚本 .github/scripts/server-storage-test-shard.sh元测试scripts/ci_workflow_test.goTestPRRiskGateReachesFullServerDoltStorageSuite断言泳道形状、scripts/ci_capability_selector_test.go、scripts/pull_dolt_image_test.go【免费下载链接】beadsBeads - A memory upgrade for your coding agent项目地址: https://gitcode.com/GitHub_Trending/beads1/beads创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门