OpenClaw CI 限制管理 是做什么的?
使用此技能处理 CI 容量变更,而非普通的测试失败分类。目标是保持 OpenClaw 快速运行,同时区分运行器注册、运行器可用性、Blacksmith 控制平面健康以及下游队列排空。
核心事实
- 完整的主层级 CI 每小时运行一次;普通的主推运行
security-fast。一个绿色的推送并不能证明完整测试套件已通过。普通的 PR 会推迟 Windows、macOS Node/Swift、iOS 构建/模拟器、真实 Gateway UI、已发布驱动更新、Knip 以及大多数架构证明。导入循环和 Kysely 守卫仍然保持阻塞。使用docs/ci/scope-and-routing/selection.md和当前的 Manifest 进行精确的事件、所有者和发布回退选择;在调整容量时不要恢复被推迟的通道。Android 截图仍然是仅限发布的。 - 不要假定稀缺资源。要证明压力是来自运行器注册、符合条件的运行器可用性、Blacksmith 容量/控制平面、工作流依赖、测试运行时还是下游队列写入器。
openclaw的 GitHub 运行器注册当前在actions_runner_registration中报告每 5 分钟 10,000 个桶。每次调整前验证实时桶,因为 GitHub 可能会更改它。openclaw组织共享一个桶。- 核心 REST 配额不会消耗此桶。分别检查
actions_runner_registration;核心配额可能是健康的,而运行器注册被限流。 - 将大约 60% 的实时桶作为操作目标。在当前 10,000 注册桶的情况下,将计划的 Blacksmith 突发负载保持在每 5 分钟 6,000 注册以下,其余的留给其他仓库、重试和突发重叠。
- 路由、通知、汇总、选择分片或运行短 CodeQL 质量扫描的任务应保留在 GitHub 托管运行器上,除非有测量证据表明 Blacksmith 是必需的。
运行器成本政策
- 使用能够可靠完成所需工作量负载的最小运行器。将短控制任务保留在托管运行器上,并将普通的受信任开发证明保留在本地。
- 将物理 8-vCPU 及更大的运行器视为例外,而非默认或通用重试。记录命令和测量到的峰值内存、较小运行器的 OOM,或显示较低总计费成本的受控比较。仅凭低 CPU 使用率并不能证明内存密集型任务可以下移。保留基于资源的 Worker 限制。
- 常规 OpenClaw Testbox 使用 4 类,默认总任务时间(包括水化)为 60 分钟。保留 15 分钟的空闲上限。对于已知的短命令,欢迎使用更短的截止时间;不要自动请求 4 小时或仅为了获得更多时间而升级机器。仅在对指定的内存密集型命令进行命名时才选择
.github/workflows/ci-check-high-memory-testbox.yml;请参阅docs/reference/test/remote-proof.md。该工作流在共享的 32 槽 Testbox 池内最多有四个并发租约。高内存配置文件使用 8 个 vCPU;两个配置文件都保留了其 11 月 3 日之前的物理 CPU 和 RAM。所有 Testbox 配置文件将空闲时间限制为 15 分钟。 - 通过工作流 ref
main的当前 OpenClaw 包装器进行分配;源胶囊保留正在测试的检出。不要调度旧的工作流 ref 以绕过花费限制。在检出前检查队列年龄;已接纳的租约保留其任务和空闲截止时间。 - 不要仅仅因为一个命令需要更多 RAM 而升级整个工作流系列。将已验证的高内存 CI 行保留在其所属的计划器和证据范围内;在更改其分配之前重新测量。32 类标签并不能证明有 32 个可用的 CPU。比较观察到的资源和总计费任务成本。
被拒绝的实验
- UI 无 blob 稀疏检出 (2026-10-16): 排除原生移动/macOS 应用树移除了 48.31 MiB 的逻辑跟踪内容,但不被视为运行器成本改进。在 run 38866595993 中,Blacksmith UI E2E 检出耗时 56 秒,托管浏览器检出耗时 58 秒;同一运行中的完整 UI 检出耗时 22-38 秒。这些是小样本、未配对的样本,不是测量到的计费差异。保留完整源代码检出。只有在更低的完整检出时间和计费成本(包括过滤提取、惰性物化以及受信任的 Harness 导出)下才重新考虑;仅凭较少的逻辑字节并不能证明节省了成本。
- 声明固定装置所有者选择 (2026-10-02):
test/scripts/tsdown-declaration-fixture.ts从其运行时入口点闭包派生真实的源代码副本,因此编辑其中一个的产品 PR 不会选择建立在其上的四个声明套件。PR #162614 以这种方式破坏了write-unified-entry-dts;每小时计划的 CI (run 36979748808) 在合并后约 35 分钟捕获了它,并且0a188c4f038f0在一小时内修复了固定装置。将所有者声明为new URL(..., import.meta.url)字面量仅在激进选择的 20 导入器中心截止点以下到达套件:事件所有者和另外七个是中心点,因此重放的 #162614 diff 仍然没有选择任何套件。通过规范的 PR 计划器选项重放过去 30 天内所有接触所有者的 92 个主提交,URL 字面量新覆盖了 12 个(+35 行,+1,689 类 vCPU-分钟)。完全覆盖,例如对同一列表的策略监视,新为 81 个选择了套件,并为 69 个启动了build-artifacts(在 12 个 PR 运行中,16 类上的中位数为 330 秒),因为套件是ci-build-manifest.mjs中的构建所有者:+242 行和 +11,628 类 vCPU-分钟,每个受影响的 PR 中位数 +161(+8%)。这换来了七周内一个逃脱的所有者破坏,因此保留普通路径;每小时计划的 CI、工具所有者 PR 和发布验证拥有此证明。只有在逃脱率显著提高或选择不会同时启动build-artifacts时才重新考虑。 - 边界异步输入准备 (2026-09-26): 在三个声明/边界调用点添加现有的
CompilerInputSnapshot.prepare()调用,将完整冷验证从 464.21 秒增加到 544.68 秒(相同的四 CPU/15.42 GiB Testbox);热验证从 12.62 秒增加到 14.63 秒。所有 125 个插件检查和金丝雀都通过了,但 CPU 使用率也增加了。删除了六个调用点添加。不要将其重复为假设的加速;任何不同的使用都需要测量到的端到端收益。 - Windows pnpm store (2026-09-20): 来自 run 35547255790 的原始收据测量到完整设置的中位数时间为 45.295 秒(冷)对比 52.738 秒(恢复)(+16.4%),尽管重用了所有 1,453 个包且零下载。763.8 MiB 的存档需要 23.601-26.980 秒来恢复;生产者设置/保存增加了 62.527 秒。所有七个原生任务都通过了,但资格缩减器因 24 KiB 的报告 RAM 差异而失败。没有放宽任何断言或重新运行任务。精确 RAM 匹配的子集仍然慢了 11.3%;这是描述性证据,不能替代通过的资格。保持正常的 Windows 设置不被缓存。只有在净完整设置节省(包括恢复、提取、冻结协调和生产者工作)时才重新考虑。
- 托管 Mac 精确依赖 (2026-09-01): run 33458856298 中的同头发布者和消费者成功保存并恢复了 1.66 GB 的依赖存档,但设置耗时 142 秒,而普通 store 缓存为 86 秒。提取耗时 82 秒对比 27 秒;安装仅从 43 秒改进到 35 秒。保持托管 Mac 任务使用普通 store 缓存。只有在测量到的总设置节省(包括传输、提取和冻结协调,而非成功的缓存命中)时才重新考虑。
- Actions-artifact 检出 (2026-08-16): 不要推荐用预检产生的工作空间或
.git工件替换共享的 Blacksmith Git 提取。PR #124818 测量到 Blacksmith 检出的基线为 16 秒,托管为 7 秒。最好的直接工件变体需要 1 秒打包、3 秒上传和 11 秒中位数恢复;包括串行前缀后仅剩约 1 秒的中位数改进,并且使 Blacksmith 的快速提取运行出现回归。官方的工件客户端更差:run 31971531521 测量到下载中位数为 22 秒,加上 2 秒物化。Blacksmith 的快速 Actions-cache 路径并不意味着快速的 Actions-artifact 下载。只有在针对不同传输(包括其生产者成本和快速提取回归)提供了测量到的端到端证明时才重新考虑。
初步检查
在更改 CI 之前,收集当前压力:
gh api rate_limit --jq '{core:.resources.core,graphql:.resources.graphql,search:.resources.search,actions_runner_registration:.resources.actions_runner_registration}'
gh run list -R openclaw/openclaw --limit 20 --json databaseId,status,conclusion,workflowName,event,headBranch,createdAt,updatedAt,url
gh run list -R openclaw/clawsweeper --limit 20 --json databaseId,status,conclusion,workflowName,event,headBranch,createdAt,updatedAt,url
gh api repos/openclaw/clawsweeper/actions/runs/<run-id>/jobs --paginate --jq '.jobs[] | {id,name,status,conclusion,labels,created_at,started_at,completed_at,runner_name,runner_group_name}'
blacksmith testbox list --all
curl -fsS https://clawsweeper.openclaw.ai/api/status | jq '{generated_at,fleet,diagnostics:{errors:.diagnostics.errors}}'
curl -fsS https://clawsweeper.openclaw.ai/api/exact-review-queue | jq '{generated_at,review:.lanes.review,publication:.lanes.publication,state_writer,state_append}'
node scripts/ci-run-timings.mjs --latest-main
node scripts/ci-run-timings.mjs --recent 10
对于可疑的排队运行,检查其任务。运行级别的 queued 状态并不能揭示任务是等待依赖项还是没有符合条件的运行器。比较 created_at、started_at、labels 和 runner_name。在取消之前,实时重新检查过时的排队运行;仅取消被证明已过时的运行。
Testbox warmup 确认租约创建,而非运行器就绪。不带 providerMetadata.runURL 的初始 queued 快照并不能确定容量短缺。使用该 URL 在关联后检查确切的工作流。已分配的 check 运行器执行设置是水化;确认的接纳或容量队列遵循现有的停止自有分配策略。不要从最新的工作流运行推断关联,也不要等待确认的容量队列。
scripts/ci-run-timings.mjs 的启动延迟可能包括工作流依赖等待加上运行器队列时间。它仅是趋势证据,而非单独的运行器压力证明。
阅读:
.github/workflows/ci.yml.github/workflows/codeql-critical-quality.ymldocs/ci.mdtest/scripts/ci-workflow-guards.test.tstest/scripts/ci-workflow-planning.test.tstest/scripts/ci-workflow-evidence.test.ts- 受影响的计划器文件,位于
scripts/lib/*ci*、scripts/lib/*test-plan*或scripts/ci-changed-scope.mjs下
诊断瓶颈
在进行限流变更前,对问题进行分类:
- 运行器注册限流: 许多任务在运行器分配之前排队,Blacksmith/GitHub 报告来自
generate-jitconfig的 403/429 或垃圾邮件风格的 422 响应,并且 API 核心配额仍然健康。仅当请求负载在其他方面有效时,才将 422 视为此信号。修复突发性和 Blacksmith 任务数量。 - Blacksmith 容量: Blacksmith 仪表盘显示实际并发上限或容量不可用。不要仅通过 GitHub 工作流扇出来解决此问题。
- Blacksmith Testbox 控制平面: 列表、预热、状态或运行调用在返回租约之前超时。这与 Actions 运行器注册和 Actions 任务容量是分开的。受信任的源可能使用文档化的本地回退;不受信任的源保持阻塞。
- 运行器标签不可用: 一个任务使用自定义的
runs-on标签排队,started_at和runner_name保持为空,并且没有符合条件的运行器存在。恢复可用的托管或已注册标签;扇出无法修复它。 - 工作流依赖等待: 任务已排队但所需的前置条件尚未终止。修复或等待依赖关系;不要将整个延迟称为运行器队列压力。
- OpenClaw 测试运行时: 任务快速启动,但一个通道占用了绝大部分壁钟时间。使用
$openclaw-test-performance而非运行器调优。 - 实际失败的 CI: 一个任务在启动后失败。使用
$github:gh-fix-ci或$openclaw-testing,而非此技能。 - ClawSweeper 审查积压: 审查待处理/就绪增长,而发布和状态写入器保持健康。调整
openclaw/clawsweeper中的审查接纳/Worker。 - ClawSweeper 发布积压: 发布待处理/就绪和最老年龄增长,净排空为零或负值,或死信上升。首先检查发布批次、状态写入器协调和 GitHub 变更延迟。
- 状态物化器/追加积压:
state_append.pending_rows、pending_bytes或最老年龄增长,而物化器排队或缺失。首先恢复该唯一的排空渠道;更多的审查 Worker 会使情况更糟。
注册预算计算
在编辑之前估算变更的最坏情况注册数:
新的 Blacksmith 注册数 ~= 在一个 5 分钟窗口内可能变为排队状态的 Blacksmith 任务数
对于矩阵任务,计算在 5 分钟窗口内可能启动的每一行。strategy.max-parallel 仅限制同时进行的行;短行可以周转并在窗口重置之前注册更多运行器。使用任务持续时间、重试和队列周转来证明任何更低估计的合理性。添加非矩阵 Blacksmith 任务,例如 preflight、security-fast、build-artifacts 和平台通道。
对于重复...