测试和CI

Node 测试车道

如何分割、平衡、打包和缓存最慢的 Node 测试系列。 CI 范围和路由 索引的一部分。

Node-worker 进程 E2E 在 scripts/lib/ci-node-worker-e2e-inventory.mts 中具有显式所有者映射。即使打包的子进程隐藏了导入边缘,对工作环境、节点主机、工作进程、节点 RPC 及其 launch/transport 输入的更改也会选择 PR 上的完整组。仅文档更改不会选择它。每小时主力和普通 manual/release CI 也在现有的 8 级赛跑者的两个串联排中平衡了该组。两行都在现有 Node 矩阵上限内保留容量,并保留其私有 QA 构建、工作人员限制和截止日期。 PR 块的目标是 150 测试秒,不可分割的慢速文件保持完整。

每小时运行 38752392982 测量前单行需要 45 分 30 秒:十四个串行文件命令需要 41 分 15 秒,共享准备和清理需要 4 分 15 秒。其 8 级运行程序报告有两个 CPU。现有的加权装箱机使用这些文件观察来预测每行大约 25-26 分钟,包括重复准备,每次完整运行大约需要 5 个额外的 8 类作业分钟。这会将工人通道从该跑步的关键路径中移除,而无需更大的跑步者;在相同的入场延迟下,下一个 35 分 54 秒的 iOS 作业将把 main 时间限制在大约 43 分钟,而不是 52 分 54 秒。这些是一次运行的预测,包括一个失败的文件命令,未测量更改后的节省。下一个自然每小时跑步拥有该测量值;不需要发送或重新运行验证。 Docker-opt-in node-worker-container-wire 证明仍然是独立的,ACP 取消和普通本地会话兼容性证明也是如此。

最慢的 Node 测试家族被拆分或均衡分配,以便每个作业保持较小规模,而不会过度占用 runner:

  • 每小时的主要和普通 manual/release 验证保留完整的插件和通道合同作业及其现有的加权流程选择和运行程序回退。 PR通过变更所有者Node计划选择精确的合约测试;冻结的历史手动目标保持各自的工作。
  • 额外检查: 当前目标将导出冲突、会话 accessor/transcript 读取器、SQLite 事务和 SQLite 模式检查组合到一个串行源合同行中,保留每个命令并收集每个失败。完整的计划有五行在主调度上,六行在当前目标调度上; PR 选择适用的静态行; SDK API 报告仅分配用于发送。冻结目标保留其八个原始行和历史命令后备。
  • 核心单元fast/support通道单独运行; unit-src、Control UI 和 gateway-core 各自使用三个固定文件加权条带,而安全性和 media/UI 配套配置保留其范围内的整体配置支持组;核心运行时基础设施分为进程、共享、钩子、秘密和三个 cron 域分片。
  • 自动回复作为平衡工作线程运行,回复子树分为代理运行程序、命令、调度、会话和状态路由分片;调度进一步隔离核心、交付和生命周期入口点。
  • Agentic gateway/server(控制平面)配置拆分到 chat、auth、model、HTTP/plugin、runtime 和 startup lane,而不是等待已构建产物。
  • Hosted 完整发布计划在库存更改期间保留 CLI 流程、agent/chat、网关方法和运行时配置所有者的完整测量代,直到测量当前选择。匹配的单例测量可防止已知文件被粗略权重重新定价。规划器将这些所有者分成最多 64 个文件的组,然后仅将具有匹配运行程序、构建和环境要求的测量组打包到具有最多 720 秒测量或预计工作的串行作业中。每个组都有自己的流程、时间标识和两人上限;当其余组运行时,故障仍然会导致作业失败。 PR、小时主线和铁匠计划保持现有政策。整个作业计时导入器会跳过打包作业。 scripts/ci-refit-test-timings.mts 从 CI 调度中抽取成功作业(包括失败的工作流程),并要求在记录每个完整的组墙之前提供涵盖每个 Node 和 Bun 调用的完成收据。需要两次独立的运行,并且这些部分清单不能删除其他测量。完整版本矩阵省略了冗余名称和默认字段,以保持在现有输出预算之内。
  • Normal CI 仅将隔离的基础包含模式分片打包到最多 64 个测试文件的可重复包中,从而减少了 Node 矩阵,而无需合并非隔离的 command/cron、有状态代理核心或 gateway/server 套件。重型固定套件保留在 8 个 vCPU 上,而大多数捆绑和较低重量的通道则使用 4 个 vCPU。之前推广的紧凑工作负载通过其语义所有者和打包前选定的文件保留 8-vCPU 容量。时间或构建所有权更改无法将该容量转移到不相关的行。托管条带继承其父所有者的容量;整个命名手册和发布计划保留其现有路线。完整命名的捆绑包包括其运行时构建模式(如果存在),因此 checks-node-bundle-infra-small-runtime-1 和 checks-node-bundle-infra-small-1 标识不同的先决条件组。他们的测试库存和跑步者限制保持不变;独特的名称让发行收藏者可以保留这两项工作,而无需模棱两可的尝试证据。
  • Hourly main on GitHub-hosted runners 将代理聊天组绑定到 30 个文件,将网关方法组绑定到 96 个文件。超过 32 个文件的聊天组和网关方法组在单独的行中运行;小网关尾部保持普通包装。测量的更新程序测试单独运行,而不是扩展存储行。存储保留其 64 个文件的限制。这些仅主要的分割保留每个选定的测试、配置、工作限制、构建先决条件和计时生成; PR、完整发布和付费运行计划保留其现有包装。完整的每小时主矩阵保持在 77 行预算范围内。
  • Upstream Pull 请求解决了来自有界变更所有者、传递性导入消费者、workspace/public SDK 别名、受保护的回归和显式策略监视的运行时测试。 Node 构造函数使用该选定集。当 platform/area 所有者发生变化时,Windows 和 UI 作业保留完整的普通库存;不相关的 UI 系列仍然可以容纳精确的受保护或受影响的文件。全局输入从不请求完整的紧凑运行时存储库。缺少选择器功能会导致预检失败。 Main 保留其完整的自动层,普通的 manual/release 验证添加了现有的仅发布清单。
  • 静态正确性与运行时目标无关。生产和测试类型、语义 lint、格式、SDK 边界、模式漂移和 Knip 保留其所需的检查;不明确的静态所有权保持完整的 compiler/lint 覆盖。运行时定位不需要全套后备来保护这些防护。请参阅 范围规则。
  • A 更改了工具测试或所有者选择其确切的所有者测试、受影响的传递测试导入器、受保护的回归和显式监视,并遵守下面指定的过程证明排除。工具配置保留其文件并行性、工作限制、运行时先决条件、后端路由和容量提升。他们从不要求全系列 PR 后备。
  • 精确解析的元数据承载文件保留其分配的配置、运行程序、worker/admission 策略和准备要求。使用现有文件权重对已知子集进行标准分配价格,保留以完整组价格为上限的冷处理津贴并单独进行收费准备;不透明库存保留其全价。兼容的整体执行信封可以共享现有行,而无需合并子进程或增加其工作线程;串联兄弟姐妹可能共享该行,而平行兄弟姐妹保留其条纹家族分离。 PR 准入通行证使用现有的 file/group 计时证据和对缺失观察的保守估计,将选定的文件分区为行,目标为最多 150 估计测试秒。它保留完整的文件和每一个断言;不可分割的文件或标准组可能会超出该目标。这些是入场估计,而不是测量的作业墙:设置、构建、排队和运行者争用仍然是单独的成本。缩减组使用不同的计时标识,因此部分观察结果不能覆盖完整父计时。
  • Control UI 更改保留了完整的普通单元、模拟 E2E、真实网关和通过其独立的现有所有者门引导的家庭。受保护和受影响的文件精确地选择加入其他系列。命名的仅发布 UI 文件保留现有的 direct/owner 选择加入机制。空的真实网关阶段被省略,而仅桌面运营商保留其所需的桌面证明。配置、项目隔离、工作策略和运行时先决条件保持不变。
  • 直接更改的插件测试及其选择的所有者测试在分配的配置中使用精确的文件选择。 Unit-fast、contract、bundled 和 E2E 文件保留自己的套件边界。没有整个插件 PR 后备;每小时插件预发布和完整发布验证保留完整的扩展库存。
  • 规划者的 RELEASE_ONLY_TOOLING_SHARDS 集和匹配的维护者离开混合快速配置,推迟了不相关 PR 上的完整维护者工具系列。工具 Vitest 配置拥有普通库存和 isolated/Docker 目录。由快速配置选择的维护者叶子保留其普通、隔离或假定时器所有者和进程引脚;过滤混合组可以保留产品邻居并为子集提供单独的时序标识。专用产品 E2E 和现场测试(包括五个 test/scripts/*.e2e.test.ts 门)不属于这一层。涉及工具测试或所有者的 PR 选择其所有者文件、传递导入消费者和受保护的回归,并遵守以下明确的防发布排除:scripts/**、src/scripts/**、test/**、.github/**、config/**、根 package/pnpm 输入、工具配置和其他由 scripts/test-projects.test-support.mts 中的共享更改路径所有者分类为工具的输入。该所有者还涵盖 Docker、agent/Crabbox 工具、应用程序 scripts/Fastlane 和扩展 scripts/package 输入。直接更改的工具测试保留其自己的 PR 的覆盖范围,但显式流程证明除外。每小时主要包括 CI 和普通 workflow_dispatch 家族,其中 Full Release Validation 的 normal_ci 子项针对冻结候选者。它的 Run Node test shard 步骤在常规出版物准入之前运行这些未更改的测试;不需要独立的重复发布测试。现有批准的仅预检测试版发布例外情况保持不变。插件售前赛单独拥有 agentic-plugins; CI 的插件排除不控制工具层。 Fork 存储库保留完整的工具,因为它们不使用上游 PR 目标。除了下面的显式运行时证明清单之外,产品测试保留其现有层。
  • 显式 CI_PROOF_TEST_FILES 库存使 test/scripts/frv.release.test.ts 和 test/scripts/install-ps1.release.test.ts 排除在 PR 计划之外,包括直接编辑的测试。每小时主要、手动 CI 和完整发布验证在标准工具配置中保留了完整的流程巡视。 FRV 将其在制品延续合同保留在 frv.test.ts 中;安装程序将其源防护保留在 install-ps1.test.ts 中。没有删除任何案例或断言。
  • 显式 RELEASE_ONLY_RUNTIME_TEST_FILES 库存推迟了来自上游自动 PR 的测量运行时集成之旅和推送计划,同时更快的所有者测试保留了其主要合同。它涵盖了 Doctor 配置和迁移组合、CLI 启动、网关 model/plugin/session 和工作环境游览,以及更新程序、打包和存储恢复证明。现有的版本库存仍然存在:src/flows/doctor-health.test.ts、src/infra/update-managed-service-handoff-foreground.test.ts、src/node-host/node-worker-supervisor.recovery.test.ts、src/state/openclaw-database-preflight.lifecycle.test.ts 以及所有八个 src/config/state-startup-corpus*.test.ts 包装器。它还保留了 src/gateway/server.sessions.archive-worktree-lifecycle.test.ts 和 src/gateway/server.sessions.delete-worktree-lifecycle.test.ts 中的真实 Git archive/deletion 矩阵,以及 src/process/supervisor/adapters/child.service-lifecycle.test.ts 中的 native/broker 子进程退休矩阵。更快的会话生命周期、身份、工作树所有者、中继状态和就绪测试仍保留在自动 CI 中。启动语料库路径所有者按其现有分区顺序提供完整的系列。这些文件保留分配的配置、进程隔离、运行时先决条件、工作限制、案例和断言。整体配置 CLI 过滤使用共享的包含和排除所有者,无需引入文件条带或更改其工作程序和串行作业策略。并行组在应用工作线程策略时保留减少的覆盖时间标识,因此自动 CI 样本无法覆盖完整的发布估计。选定的所有者测试和直接测试编辑在上游 PR 和精确头部发布门替代中运行;不相关的路径不允许剩余的释放矩阵。手册 CI、完整发布验证的 normal_ci 子项、本地完整计划和其他存储库保留完整清单。发布层还保留单独的 published-upgrade-survivor Docker 单元以及已发布的基线、legacy-operator-state 场景和 auto-auth 重启模式;合成的前台切换案例不能替代已发布的驱动程序 × 候选者证明。
  • 密钥发布规模基准 (src/gateway/session-row-projection.keyed-marks.benchmark.test.ts) 也使用运行时发布清单。完整手册CI和完整发布验证保留其4,428行SQLite夹具和70,000份出版物;普通PR和每小时主要计划推迟它。直接编辑仍然在他们的 PR 上选择它。较小的会话行投影测试在常规 CI 中保留精确键失效、跨代理隔离、行查找和刷新行为。基准测试保留在标准网关核心配置中,每个断言都完好无损。
  • Ten 本机维护者工具和发布矩阵使用 RELEASE_ONLY_RUNTIME_TEST_FILES:test/scripts/ci-linux-git.test.ts、test/scripts/pr-worktree-provision.test.ts、test/scripts/pr-worktree-interruption.test.ts、test/scripts/pr-merge-outcome.test.ts、test/scripts/pr-merge-admission.test.ts、test/scripts/pr-merge-rest.test.ts、 test/scripts/pr-merge-receipt.test.ts、test/scripts/pr-merge-recovery.test.ts、test/scripts/full-release-validation-at-sha.test.ts 和 test/scripts/package-acceptance-workflow.test.ts。工具所有者 PR 会推迟这些矩阵,除非他们的测试文件直接更改;普通的主要和仅产品 PR 已经省略了工具系列。更快的 Git 所有者、导入关闭、托管合并、完成、状态隔离和发布合同兄弟姐妹仍然在常规工具范围内。
  • 相同的显式运行时清单还推迟了本机运行程序状态清理、空发现和入口点矩阵、校正合并集成以及来自工具所有者 PR 的捆绑浏览器 MCP 包管理器矩阵。更快的状态生命周期、家庭隔离、跑步者准入、本机参数解析、校正准备和捆绑的 MCP 工件测试保留了其主要合同。完整的组合将每个案例和断言保留在其指定的配置中。直接测试编辑仍然选择它们;完整手册 CI,包括每小时主要和完整发布验证,保留了它们。
  • 媒体持久性大型语料库证明和SQLite可靠性过程之旅对堆、稀疏会话、大有效负载使用相同的释放库存,并组成crash/restore边界。普通媒体迁移、本地快照存储库、SQLite快照和Doctor压缩套件保持其主合同定期覆盖;完整的资源规模和流程组成仍在手动和发布验证中。
  • 发布清单还保留了完整的CLI帮助、网关支持的退出、Web输出反压、插件创作和打包技能之旅、真正的npm依赖修复和安装提供者身份验证组合,以及256个MiB Git备份堆证明。更快的输出完成、网关 RPC、命令策略、技能准备、插件 repair/discovery 和备份往返测试仍保留在 PR 和每小时的主要覆盖范围中。移动的文件保留其分配的配置和所有断言,直接编辑时运行,并保持由全层 CI 和完整版本验证选择。
  • MCP 发布证明(src/agents/agent-bundle-mcp-retention.test.ts 和 src/agents/mcp-stdio-client.cleanup.real.test.ts)保留了嵌套共享工作线程文件顺序检查和所有六个真实的 POSIX relay/anchor 关闭案例,包括其生产取消截止日期。普通 CI 保留私有记录和请求者生命周期测试、MCP 清理错误传播以及带有注入时钟的主管 cancellation/exit 测试。组合的流程证明在手动和发布验证期间通过相同的代理核心配置运行。
  • Startup 语料库测试在 PR 上使用变更所有者选择;下面的六文件固定烟雾集是无条件运行时地板。上游主要保留其常规启动语料库,完整的 manual/release 验证保留完整的家族。完整的精确树 Node 覆盖收据会删除原本空的快速启动语料库行。历史手动目标保留其支持的分割文件或旧分片语料库后备。当前的 PR 不会添加单独的完整语料库作业。
  • 上游 main 推送使用 Blacksmith 集成紧凑型与非分布式 Node 作业以及分布式边界描述符。以前的多配置墙(CLI 加 CLI-process、隔离加假定时器单元快速和 logging/process/runtime-config 三重奏)被分成每个配置的分片,因此没有单个组楼层在一条通道上。真正的Node+TSX命令测试属于隔离的CLI-process目录,因此普通的CLI测试不准备运行时。流程目录按完整文件成本进行拆分,拆分大小受其完整文件成本和运行时先决条件限制,因此较旧的聚合计时无法隐藏新拥有的工作。文件打包还包括前提条件;当 CLI 孩子的完整组合估计符合现有的 150 秒预算时,他们可以在同一个串行作业中共享一项准备工作。每个子进程都保留其选定的文件、独立的进程和两人限制;故意分开的固定条纹家庭保持分开。网关进程文件保持独立,因为其冷验证已经花费了 200 秒。 CLI 子级保留 150 秒的调整目标和两人限制。仅包含非构建 CLI 子项的普通混合箱可以组合最多 250 预测秒,每个原始子项仍然单独进入低于 150 秒;托管运行时先决条件本身有 160 层。他们省略了低信号每次推送工具和 TUI PTY 组,同时保留显式发布层之外的产品运行时组,包括分别用于 unit-src、Control UI 和 gateway-core 的三个文件加权条带。铁匠系列入场时间大班为200秒,小班为276秒。可以共享两个进程槽的普通组允许 360 个预测聚合秒数;已经超过其序列上限的组将保持单独状态。手动调度和完整发布验证保留完整命名的每个分片矩阵。每小时主要运行完整的主要层库存;先前存在的仅发布组合仍保留在普通手册和完整发布验证计划中。
  • Hourly 主要包括通过其 77 行 Node 帽内现有紧凑型规划器的完整刀具库存。显式仅发布运行时组合保留在普通 manual/release 验证中,除非 PR 选择其测试。成功的 PR merge-ref 结果证明了其经过测试的树,而不是后来的主要修订;现有的门仅聚合为每个修订实际选择的作业。
  • Doctor 会话和 cron 测试将两个最长的 SQLite 文件保留在单独的分片中,并将其余文件放在一起。每个分片在命令配置的现有执行策略下运行完整的文件。三位业主无法分担紧凑的工作; Blacksmith 为他们提供了 8 个 vCPU 布局及其 200 秒的准入目标。两个新所有者收取观察到的文件主体加上全部组开销,直到标准定时更新有两个成功的主运行样本。夹具大小、断言和进程隔离保持不变。
  • 生成的托管条带的直接测量拥有其包装重量,就像本机组一样。 GitHub 运行使用托管测量,混合尝试一运行使用 Blacksmith 测量;只有未测量的孩子才会除以父母的估计。这可以防止在人为的小估计下将昂贵的测量子项与额外工作一起打包,同时保留其测试分区、工作器引脚和每个子项文件执行策略。
  • Changed-插件作业串行运行其独立的配置信封,包括其内部进程块也按顺序运行的配置。然后,现有的工作人员策略可以使用检测到的 CPU 预算,而无需为重叠计划保留容量;多目标作业保留其单独的并发策略。
  • 这 16 个工具条使用测量的文件权重将 Git 所有者、托管进程、工作工件和转换缓存证明保留在单独的作业中。 Go 设置首先遵循明确选择的文件。对于整体配置工具计划,只有普通工具配置拥有文档 i18n Go 测试;隔离的和 Docker 目录没有。未知的历史配置保留其原始 Go 设置。包含统一声明编译器固定装置的分片保留现有的较大运行器;托管拆分在打包之前通过每个孩子选择的文件进行该放置。其合成编译器图使用现有的 1,024 MB 堆覆盖,而生产完整构建则保留其资源保护。每个 Git 所有者案例都拥有一个独立的签出和进程树,因此每个运行程序的实际超时和清理检查最多重叠两个案例。 Worker 变换证明使用具有自己的夹具生命周期的单独套件;后期子清理无法删除另一个套件的输入。这些更改保留了测试用例、截止日期和流程隔离;测量准入决定了现有混合行上限内的作业数量。
  • Blacksmith 编号的工具箱在打包后请求 32-vCPU 类,同时保留其逻辑运行器类、名称、文件库存、串行项目执行和两个工作器引脚。工具文件使用共享工作调度程序; Docker 辅助夹具保留其单独的串行配置。在运行 33689551111 中,三个最慢的工具箱接收了两个 CPU 和 8 GB 内存;他们314-342秒的身体设置了八分钟的非Windows墙。较大的请求可以解决主机容量不匹配的问题,而无需添加分片。托管和混合工具放置不变;在要求八分钟目标之前,该请求需要本地时间证明。
  • 对于普通UI作业,RELEASE_ONLY_UI_TEST_FILES将app-sidebar.stress.browser.test.ts和control-ui-stale-build-reload.e2e.test.ts从普通上游PR和主要计划中推迟。过时构建场景构建两个生产包来执行真正的惰性路由重新加载恢复;集中的陈旧块和路由器出口测试保持快速覆盖。直接更改的测试文件在其自己的 PR 或推送中保持选中状态;源所有者和目录更改不会扩大此层,包括当所有者选择器提供显式文件列表时。完整手册 CI 和完整发布验证保留完整的标准 UI 配置。分叉、未知的更改路径清单和历史兼容性目标也保留完整的覆盖范围。其他模拟的 UI 流量遵循普通所有者选择和每小时覆盖范围。规划器缩小了现有三个 UI 分片和八个加权 Control UI E2E 分片之前的发现范围。普通的 E2E 行使用三个并行工作线程,而私有服务器和运行时预算项目则保留一个;完整的手动库存保留十二行和两个并行工人。单独的真实网关和浏览器扩展作业保留自己的覆盖范围和调度。
  • 相同的RELEASE_ONLY_UI_TEST_FILES选择还提供单独的真实网关作业:cron-duration-save、desktop-resize、control-ui-automation-management(QA实验室)、quota-reset-status、session-pr-reader-lifetime、 chat-collaborator-scroll、mcp-app-conformance、usage-sessions-owner-attribution 和 QA 实验室的 control-ui-openclaw-delegation、control-ui-media-transcript 和 session-host-command-state 在完整手动 CI 和完整发布验证中运行normal_ci 孩子。他们完整的 browser/Gateway 组合保留在标准的预构建配置中,断言和每个项目的工作策略均未更改;更快的嘲笑和所有者边界兄弟姐妹留在普通CI。共享路径清单保留所有其他真实网关和 QA 实验室文件。桌面传输引导程序保留其单独的证明;没有预构建配置的历史目标保留其原始显式文件列表。证明工作准入没有改变:普通 PR 已经省略了真实的 Gateway 工作,主形计划保留了直接编辑的测试文件。浏览器扩展路由未更改。 Real-Gateway 准备使用现有的仅运行时完整构建 (OPENCLAW_BUILD_PRIVATE_QA=1 OPENCLAW_RUN_NODE_SKIP_DTS_BUILD=1 pnpm build); build-artifacts 保留 SDK 声明生成和验证。保持准备工作的独立性可以避免等待该作业的后续工件检查。当前规划器从同一选定库存中发出两行真实网关:一行中的桌面传输和现有串行固定装置,另一行中的所有经过审核的并行固定装置。串行行不再借用并行夹具作为填充物;它们使用并行行现有的两个工作线程池,而无需更改其预览、隔离或调度策略。预构建的调用预览和平台系列固定装置重用经过验证的标准 Control UI 字节。默认模拟网关问候接收该工件身份,保留显式覆盖和构建倾斜验证;普通的本地预览仍然构建私人资产。真正的 node/SSH 桌面调整大小引导程序仅发布,并遵循相同的选定库存;完整的 manual/release 运行并直接桌面规范编辑执行两个运营商一次,而频繁的调整大小和安全所有者测试则保留在普通 CI 中。规划者拥有布局并使用与 Vitest 调度相同的并行资格允许列表。冻结的目标和较旧的规划器保留一整行;普通 UI 分片数量和跑步者标签保持不变。
  • Control UI 浏览器项目使用提交的每个文件计时贪婪地打包发现的测试文件,然后冷启动基本名称提示,然后源字节大小。捆绑文件默认最多有两个工作人员,受共享工作人员限制和本地限制的限制;显式 Vitest CLI 工作覆盖仍然可用。私有源服务器、真实网关和运行时预算测试保留在单工作程序项目中;本地整套运行在开始该项目之前完成捆绑工作。每个文件的开销是通过串行调用重新调整的;并行调用仍然会更新其文件权重。计时键仅提供权重:发现仍然决定完整的测试清单,包括新文件和没有测量的文件。
  • 广泛的浏览器、QA、媒体和其他插件测试使用专用 Vitest 配置,而不是共享的插件 catch-all。Include-pattern 分片使用 CI 分片名称记录计时条目,因此 .artifacts/vitest-shard-timings.json 可以区分完整配置和过滤分片。
  • 浏览器扩展 Chromium 引导命令准备 qaRuntime。它构建本机主机和中继 JavaScript 以及运行时资产;单独的工件作业拥有 Control UI 和插件 SDK 声明验证。真实的 Chromium 流程及其断言保持不变。
  • Node E2E 分片通过 OPENCLAW_E2E_USE_PREBUILT_DIST 重用 qaRuntime。当选择打包的 @openclaw/ai 消费者测试时,CI 分片所有者会检查其包清单中的每个声明条目,并仅在缺少条目时才运行类型化的 AI 构建,然后再接纳工作人员。通用 Vitest 准入绝不会重复此修复:本地预构建的 E2E 运行需要调用者准备的工件,并且普通的 E2E 设置已经构建了类型化的 AI 包。不相关的测试和完整的类型化包不添加任何构建; OPENCLAW_E2E_SKIP_BUILD 仍将准备工作留给调用者。
  • 浏览器本机主机启动测试是一个单独的 POSIX E2E 案例。 Linux build-artifacts 在构建或恢复 dist 后显式运行它,使用 OPENCLAW_E2E_USE_PREBUILT_DIST=1,因此测试无法启动另一个构建。其 JSON 报告必须准确包含预期文件中的命名传递断言,其中一次通过测试,零次失败、待处理测试或待办事项;缺少工件、跳过测试和缺少结果都会失败。仅当冻结的历史结帐缺少测试文件时,工作流程步骤才会跳过:即不可用的历史证明,而不是覆盖率。当前缺少文件的结账仍然失败。即使在仅测试差异上,对外壳、其安装固定装置或其中继钥匙固定装置的更改也会选择工件作业;不相关的浏览器单元测试保持免构建。手册 CI 使用相同的工件步骤,独立于仅发布的插件扫描。
  • Linux Node 分片作业通过上游操作缓存 API 保留 Vitest 的文件系统模块缓存。在 Blacksmith 运行器上,官方缓存操作使用 Blacksmith 的并置缓存后端 而不是 GitHub,因此即使缓存条目的键匹配,缓存条目也是后端本地的。铁匠 CI 碎片仅用于恢复,并将受保护的铁匠种子解压到隔离的跑者本地根中。当 GitHub-hosted 中断后端处于活动状态时,每个 checks-node-* 测试分片、checks-ui、普通分片 checks-ui-e2e 作业、快速合约矩阵以及 Vitest 运行的 checks-fast-core 任务都会从以下位置恢复单独发布的不可变转换种子: GitHub的后端。复合操作的单个默认关闭 restore-test-caches 输入使扩展易于禁用,而无需更改缓存键或写入器策略;混合快速核心行仅对调用 Vitest 的任务启用它。真实网关 UI 作业不会恢复这些测试缓存;本机和 Control UI i18n 通道不调用 Vitest。混合规划器配置文件使用跨两个后端本地存档的匹配关键合约:attempt-1 Blacksmith 行读取 Blacksmith 种子,而托管重试只能读取单独发布的 GitHub 种子。普通 CI 作业仍仅恢复;单独的可信预热器拥有受保护的后端本地缓存发布。非取消预热器跟随 main,跳过仅文档推送,每天运行,并接受 main 上的手动或存储库调度。依赖项发布和代码预热针对每个后端、平台和引用独立序列化,因此可以在先前的构建仍在运行时发布新的依赖项种子。编译后的 Vitest 工作线程保留在完整的 Linux 代码作业中,在本机 SDK 编译更改分辨率拓扑之前准备和保存;依赖作业不执行编译器工作。普通Linux代码行跟在OPENCLAW_CI_RUNNER_BACKEND后面。混合模式还使用真实 CI-routing、plugin/channel 合约和 UI 包配置中的 17 个文件发布有界托管种子。它运行与托管消费者相同的直接 pnpm 入口点和项目并发性; Node UI 保留分片运行器。 Linux 代码行都安装了校验和固定的 Bun 分支,并通过正常的 Vitest 启动器在 Bun 上收集相同的七个 UI 种子文件。共享分片环境所有者将 Bun 转换放置在其单独的运行时缓存叶中。 Node和Bun UI集合使用普通的UI堆环境,而较重的Node组保留8个GiB上限。项目、分片、扩展批处理和直接测试包装器将共享缓存根解析为同一个配置拥有的叶子,独立于配置顺序或单个与混合配置调用。一个配置的并发运行会借用单独的可写槽,直到它们的进程组加入。显式缓存路径仍然是调用者拥有的叶子。分片运行程序保留单独的 Node 和 Bun 根,并在并发计划开始之前克隆这两个恢复的种子。它省略了完整的构建和广泛的 agent/runtime 集合;仅由其他文件或测试机构到达的导入可以保持冷状态。成功的铁匠出版物不会填充 GitHub 的缓存后端。 Linux 行通过并发度为 1 和 --testNamePattern=(?!) 的新子进程中的普通运行程序启动每个选定的 shard/config 信封。非 UI 收集保留完整的 Node 种子,并通过与普通 CI 相同的运行时分区所有者收集现有的 Bun- 兼容清单。托管预热仅添加其有限工具种子中已存在的兼容文件。非 UI 运行时选择器允许精确的集合过滤器;其他测试名称过滤器和不受支持的标志保留保守的 Node 路由。集合保留包含模式、环境、编译导入和每个文件清理,同时重用稳定的配置拥有的缓存叶子。测试机构运行在普通CI;仅在这些机构内部到达的进口才能在运行之前保持冷状态。温暖器完成每个选定的信封,并保存内容键控的转换和编译缓存,即使收集失败,然后在缓存保存后报告失败;普通的 CI 分片执行仍然是快速失败的。这可以防止配置全局状态泄漏,避免将过滤的分片扩展为整个配置,并保留前一个子项生成的转换。当启用变换缓存时,安装程​​序计算一次变换输入指纹,并将其传递给恢复和生成验证;禁用的缓存不会扫描结帐。指纹清除不兼容的锁文件、包、tsconfig 和 Vitest-config 生成。两个运行时生成器加入后,最终的 Node UI 集合拥有单个修剪通道。在发布之前,可信预热器会在超过 2 GiB 后扫描组合转换缓存并将其修剪至 75%,并在超过 1 GiB 后将 Node 编译缓存修剪至 75%。消费者工作永远不会修剪恢复的种子。 Vitest 哈希模块 ID、源内容、环境和已解析的转换配置,因此普通的部分源更改可保持未更改的条目温暖,而更改的模块会安全丢失。粗略恢复前缀桥接工作流程运行;正常操作缓存 LRU 和不活动驱逐绑定旧的不可变档案。
  • Node 分片作业在执行之前和工作线程清理之后记录资源快照:CPU 模型、主机负载、可用内存、Node 的 available/constrained-memory 估计以及 Linux CPU/memory/I/O 压力(如果可用)。当约束未知或不存在时,Node 报告零约束内存值;它并不意味着零 RAM。主机范围的压力可以解释 CI 和重放之间的容量差异,但不能确定单个测试失败的原因。
  • Trusted Blacksmith Linux Node 作业从一个不可变的上游 Actions 缓存中恢复根 node_modules、工作区导入器树(包括插件本地版本和链接)以及工作区本地 pnpm 存储,Blacksmith 透明地从其托管后端提供服务。在文件系统允许的情况下,Pnpm 会使用硬链接进行导入,并将完整的已安装树保留在一个存档中,从而保留这些链接。 Pnpm 的元数据缓存位于同一存档存储根目录下,因此恢复的安装可以验证供应链策略,而无需依赖于生产者的主目录。源安装后和构建准备使 pnpm- 拥有的依赖关系树完好无损。密钥包括显式存档格式、运行程序 OS 和架构、确切的 Node 补丁以及语义安装输入指纹;没有过时的前缀后备。 Frozen 从依赖项锁定文件的导入器和本地链接图中安装选择跟踪的清单,因此不相关的发布工具和测试装置不会使存档无效。可变安装、自定义 pnpm 挂钩、本地文件依赖项和不受支持的锁定文件形状保留了保守的跟踪清单清单;冻结的 pnpm 协调仍然会验证每个恢复。清单在散列之前使用一致的格式。存储库拥有的 openclaw 元数据块和非安装脚本被排除在外,因为 pnpm 和审核的直接根挂钩不会读取它们,因此运行时架构、发布元数据、格式和普通 test/build 脚本编辑可以使依赖关系树保持温暖;未经审核的生命周期挂钩更改将被拒绝,直到其源输入加入指纹合约。依赖项、包管理器、挂钩源和锁定文件更改始终选择新的不可变存档。每个精确恢复都运行冻结的离线 pnpm 协调,因此未更改的存档无需注册表访问或导入程序重新链接即可验证。如果协调失败,安装程序首先清除每个导入器树并从恢复的存储中离线重建它,然后清除模块和存储并从网络重试,而不是提供部分树。然后,安装程序会禁用 pnpm 的冗余预运行依赖项检查,因此安装和冻结协调仍然是唯一的依赖项编写器;分片命令不得启动并发隐式安装。单独的可信预热器在安装成功后、构建和转换预热之前立即发布工具链和确切的依赖关系档案;预检和下游 CI 作业仅用于恢复。上游推送和相同存储库拉取请求仅在实际的自托管运行器上选择精确恢复,包括混合尝试 1。精确未命中会自动回退到较粗略的 pnpm 存储缓存。手动 CI 调度、分叉拉取请求、托管通道和托管重试仅使用该存储缓存。缓存 restore/save 故障是优化未命中而不是正确性故障,正常分支范围、LRU 和不活动驱逐绑定过时存档。在多次成功的编写者确认提交后,以前的可变依赖项 StickyDisk 路径已被停用,稍后运行仍恢复为空文件系统。
  • Node 分片和构建工件作业还通过不可变的操作缓存恢复 Node 的可移植磁盘上编译缓存。在 GitHub-hosted 中断模式下,上面设置的托管 Vitest 通道会恢复单独发布的 GitHub 测试范围存档及其转换种子。构建、QA 和测试编排共享由可信预热器的完整构建和测试集合填充的受保护种子。为已发布的档案保留现有的 test 缓存命名空间;没有单独的仅构建发布者。普通build-artifacts、QA和测试作业仅恢复缓存。 PR 和普通测试作业仅读取受保护的快照,因此功能分支字节码永远不会进入共享种子,并且 PR 流量不会创建缓存存档。当运行时身份和模块路径相对于缓存匹配时(包括当仅部分源图发生更改时),这会重用 Node- 加载的编排、构建工具和外部依赖项的 V8 字节码。便携式模式不保证在任意结账布局中重复使用; Node 在内部验证准确的运行时分区和源字节。最大大小为 2 GiB 的转换存档大约需要 15-20 秒才能恢复到大约 125 MB/s;测量的快速合约转换大约需要 21 秒,而恢复大约需要 8 秒,更广泛的冷导入大约需要 100-143 秒。如果测量的节省低于恢复成本,则应恢复优化。普通 Vitest 运行保留配置的 Node 编译缓存。 Vitest 在 V8 和自定义覆盖提供程序的工作进程及其子进程中禁用字节码缓存;显式 NODE_DISABLE_COMPILE_CACHE=1 禁用整个调用的缓存。
  • 两个Linux代码预热行在测试收集之前将本机SDK声明存档发布到自己的后端;完整的 Linux 行也在构建之前发布。托管的 lint stripes 和专用的包边界通道从运行程序的后端恢复匹配的存档,并在重用之前验证本机编译器输入和完整输出。混合模式保留托管种子,而无需复制完整的 Blacksmith 构建。保存后,预热器会删除其本机 SDK 输出,以便后续打包的声明缓存描述与普通构建使用者相同的树。包存储内容和 pnpm 存储位置簿记不是编译器输入;安装的依赖字节、解析拓扑、显式输入和编译器标识仍然使过时的声明无效。全 Blacksmith 配置文件保留其只读粘性磁盘路径。 Control UI 和 UI E2E 作业共享 Linux Playwright Chromium 存档,该存档由精确固定的 Playwright 版本键入。独立依赖项发布者还运行一个标准托管的 macos-15 行,该行安装依赖项并在精确未命中后仅发布 pnpm 存储。它使用现有的OS、架构、Node-版本、包和锁文件密钥; macOS CI 仍然仅恢复。该行保留了确切的依赖关系,禁用了构建、转换和编译缓存,并且不运行任何构建或测试预热。 Pnpm 拥有修剪功能,而 before/after 磁盘使用情况和保存的存档大小会暴露保留的内容;修剪不会强加内容存储大小限制。
  • 构建工件和 Docker 种子作业通过共享 Node 设置操作恢复受保护的完整构建缓存。 ciArtifacts 和独立的 SDK 构建使用 scripts/write-plugin-sdk-entry-dts.ts:它阶段一个共享的 SDK 声明程序,仅包含专用于私有 QA 的私有条目。完整版本和打包版本在其统一声明程序中包含 SDK 声明;这两个选择具有单独的缓存标识。热门歌曲重新上演;在发布到 dist/ 之前,冷代和缓存代都必须包含每个选定的 SDK 条目和完整的相关声明闭包。 SDK 缓存从不采用实时 dist/ 的声明。本地插件 lint 和包边界编译使用独立的本机声明树,而不是打包声明;参见所有权声明。构建的 Doctor 插件索引证明重用了确切的 dist/ 输出,而不是再次调用 E2E harness的后备 TypeScript 构建。
  • Full 和包构建分别缓存 AI、工作区包和统一声明。统一运行时始终会在共享声明所有者暂存一个包含库根、公共 SDK 和插件合约的编译器程序之前重建 JavaScript。它将未更改的一代恢复到私有阶段,或者一旦错过就编译完整的选择;后来的 SDK 编译器不会重复该图。每个选择都保留其 before/after 输入快照,并在发布之前验证每个选定的条目、成功的编译器接收、相对声明边缘和共享块所有者,包括在包准备清除 dist 之后。在写入实时声明之前,冲突的共享字节或更改的消耗输入会失败;缓存记录仅在成功发布后刷新。共享 DTS 配置启用 TypeScript 稳定类型排序,因此不相关的文字分配不会对重建组中未更改的导出类型进行重新排序。完整发布删除过时的声明,同时保留签名的应用程序包和 Control UI 资产; SDK 发布仅拥有其平面条目并保留其他组的共享块。 AI 和工作区包步骤还会在缓存命中时重建 JavaScript。隐式和显式声明启用的构建共享这些种子;仅运行时配置文件使用未缓存的图,并且无法发布声明生成。每个声明组都会对来自其成功编译器程序的普通源字节进行哈希处理,因此对现有未使用的测试、UI 源和工作流的编辑会保留其缓存命中。确切的签出本地 .cache/vitest 临时根被排除在解析发现之外;显式使用的输入、安装的别名以及相邻或嵌套路径通常仍然无效。它仍然验证继承的配置、生成器和 package/plugin 元数据、编译器标识和解析拓扑;消耗的声明依赖项和新的候选解决方案使生成无效。工作空间包更改保守地使 AI 和包声明缓存无效。受保护的预热器在成功完成完整构建后、不相关的测试预热和 pnpm 维护之前立即发布构建档案。每一次温暖的尝试都会获得一个新的不可变的存档密钥;粗略恢复前缀提供先前的组,并且每步签名仍然是唯一的内容有效性所有者。重建的组替换其完整拥有的缓存树,包括先前记录丢失或无效的过时字节。 GitHub的缓存配额和不活动驱逐限制了老年代;相同的温暖尝试可以发布单独的档案。每周的 Node 26 最小通道会在 main 成功运行后发布 14 天的工件,并仅恢复其不可变生产者身份解析为 main 上的工作流程的工件,从而避免配额流失,而不允许 PR 代码写入共享缓存。 Private-QA 声明永远不会保留在操作缓存中,因为缓存命名空间不是机密边界。
  • check-additional-boundaries 运行完整的补充保护列表 (scripts/run-additional-boundary-checks.mts),具有四个并发子进程和每次检查计时。它的 20 项检查保留了个别故障、截止日期和流程清理。共享的四规则聚焦扫描在所有源根上运行一次;范围较窄的公共 lint 命令仍然可用。即时快照在其单独的通道中运行。包边界 compile/canary 工作保持在一起,运行时拓扑架构与 build-artifacts 中嵌入的网关监视覆盖范围分开运行。
  • 在 32 vCPU 自托管构建运行程序上,在构建 dist/ 和 dist-runtime/ 后,网关监视、通道测试和核心支持边界分片在 build-artifacts 内一起启动。 GitHub-hosted 后备运行保持网关监视串行,因此低核争用不会消耗其准备期限。完整的 Node 构建,然后通过串行公共网关消息操作验证 Discord 组件附件文件名,检查构建的版本并保留命名测试 JSON 结果;案件发生前的冻结目标明确报告了无法提供的证据。然后,两条路径都单独运行两个构建的 TUI PTY 工件金丝雀。

Discord 证明上传器仅在其生产者步骤成功或失败完成后运行。它保留了对真实证明失败的诊断,并且仍然需要声明的文件。当较早的失败或取消跳过生产者,或在完成之前取消它时,上传者将保持跳过状态;该覆盖范围仍未运行。

PR 所有者计划首先使用现有的紧凑行,然后将工作拆分为 150 秒的测试预算。如果这些分割超出了最终的 Node 矩阵上限,规划器将保留紧凑的选定所有者行,包括插件工作。这使选定的文件、配置、工作限制和进程所有者保持不变;广泛的 PR 可能有更长的行,而不是仅仅因为拆分而导致预检失败。 Dist 描述符不消耗 Node 行预算。如果保留的计划仍然超出上限,则仅根据构建和并发要求对更改的目标块进行分区,然后按预测秒数平衡到剩余行中,同时保留每个选定的目标。不符合这些单独政策或其其他所有者已经满足上限的计划仍然会在预检中失败。

显式选择的插件测试保留其分配的配置、本机加载程序隔离、工作策略和组计时。仅发布开关控制整个插件扫描,而不是其所有者元数据的可用性;不相关的 PR 仍然没有获得这种横扫。

激进的 PR 烟雾选择两个完整的现有文件:src/config/io.load-async.test.ts 用于冷配置加载和元数据准入,src/plugins/loader.runtime-registry.test.ts 用于插件加载和注册表生命周期。它们保留分配的配置和断言,并最多占用两行 Node。全选择终止开关保留了之前的六文件烟雾清单,包括网关服务、配置兼容性和迁移以及消息工具传递。所有六个仍然按小时运行。

scripts/lib/ci-proof-test-inventory.mts 中的 PR_EXEMPT_RUNTIME_TEST_FILES 库存将测量的慢速集成测试排除在不相关的上游 PR 和精确头部 PR 后备调度之外。每小时 main 和完整发布验证通过其注册套件所有者选择这些完整文件:普通 CI 拥有核心、UI 和工具测试;插件预发行版在其每小时计划和发布活动中拥有完整的扩展运行时库存。独立手册CI保留其核心库存;运行插件预发行以扩展覆盖范围。每小时 main 包括完整的工具库存,因此在 PR 选择范围缩小后,延迟测试和受保护的回归都保留其注册套件所有者。通过现有的更改目标所有者和传递导入图,直接测试编辑和选定的主题所有者将文件选择回有界的 PR 计划。 Missing/deleted 测试和广泛的未解决的输入本身并不能启用库存。减少的组保留不同的计时标识和原始配置、先决条件、进程隔离、工作限制、案例和断言。该层与旧的仅发布运行时清单是分开的;工具系列现在也每小时运行一次。库存所有者仅枚举选定签出中的文件的审核路径。删除的路径不需要可运行的所有者;每个实时条目仍然需要恰好一个小时和发布所有者。新的和重命名的路径立即参与变更所有者选择;单独的审计控制着它们是否包含在这个明确的递延清单中。从测量的 PR 运行中选择完整的集成、流程、语料库或迁移套件,同时保留其对 PR 的重点所有者测试。在添加豁免之前,请检查最近的产品修复,包括测试拆分带来的回归。每小时 GitHub-hosted 计划重新利用现有的完整紧凑库存和串行工具包装机。完整的文件估算使用托管成本规模;铁匠工艺的观察结果由铁匠负责。打包保留每个子组、其两个工作人员限制及其超时,同时将完整的 Node 矩阵保持在 77 行主层上限内。在同一托管运行器上执行的工具组可以共享一行,同时保留最强的原始容量所有者。显式源监视位于 scripts/lib/ci-policy-test-watch.mts 中,包括导入图无法发现的动态启动的工作程序和脚本。

即使更广泛的工具或运行时套件被推迟,显式策略监视也会在 PR CI 中保留其匹配测试。这包括包装器依赖性检查、网关客户端调用站点扫描和升级幸存者包检查。不相关的延迟测试将被排除在外。更改了测试文件,没有 Vitest 配置路由,例如技能 node:test 和 Python 套件,永远不会是直接目标; Vitest 包装器的监视也必须覆盖这些测试文件,或者仅测试编辑不会在 PR 作业中运行。

积极的 PR 选择保留更改的测试并直接运行时导入使用者,包括包和 SDK 别名。直接导入器少于 20 个的更改模块也会选择深度 2 的测试;枢纽止于直接消费者。更改的包也选择直接package-specifier测试消费者;该传递不会重新启动包读取器的遍历并绕过模块集线器截止。擦除的类型导入仍然由类型检查拥有。

仅当目录最多包含30个测试文件时才选择同目录测试。较大的平面目录使用现有的显式所有者映射和名称前缀同级(foo.ts 选择 foo*.test.ts),而无需递归选择子目录。现有固定装置、生成输入和非导入保单所有者仍然明确。配置更改保留其 planner/guard 所有者,而不是选择整个配置清单。 Protected/deferred 测试遵循这些相同的规则,而不是选择整个所有者区域。

预检作业摘要列出了每个选定的文件及其选择规则。设置存储库变量 OPENCLAW_CI_NODE_SELECTION=full 以立即恢复之前的 PR 选择。无论此变量如何,每小时主要和普通 manual/release 计划都会保留其完整库存。

源模块编辑还选择六个显式非导入防护:PR 包装器源关闭、包装器配置、急切导入关闭、更新器交换夹具依赖项、类型抑制库存和插件 SDK 表面报告。这个保守的观察涵盖了新的、重命名的和删除的模块以及新的导入边缘,包括应该命名它们的清单中缺少的依赖项。现有的所需架构组仍会检查源差异以了解导入周期和拓扑更改。

本页有帮助吗?