测试和CI
工作预算和平台通道
分片计数、并发和矩阵预算、lint 内存策略、Android 行和缓存键边界。 CI 范围和路由 索引的一部分。
独立的 UI 套件通过相同的组执行器和缓存叶运行三个本机 Vitest 分片,作为可信预热器中的有界四文件种子。每行保留根 Node 工作者限制为 3 个; Chromium 使用其项目默认值。这些分片保留了完整的四个项目清单以及每个项目的隔离和清理策略。使用当前分片运行程序的精确目标调度保留所有三个分片,包括完整发布验证的完整 Node 和 Bun 通行证。只有使用历史包测试命令的兼容性目标才会保留其单一的、未分片的信封。 window.open lint 在第一行运行一次。每行保留 20 分钟的截止时间,并且矩阵最多同时允许三行。额外的两个作业会在铁匠路线上为每个选定的自动运行添加两个铁匠注册,而在托管路线上则不会添加两个铁匠注册。精确目标调度添加两个托管行,而不更改自动运行预算。他们不保证八分钟的工作流程:预检、设置、排队时间和其他工作仍然适用。其本机报告器记录运行时 CPU 和内存事实、配置的项目工作人员、模块诊断以及观察到的 queue/end 事件。浏览器池日志记录实际的 Chromium 会话。运行开始时的项目计数描述了分片之前的发现;完成的模块标识和最终计数证明覆盖范围。事件间隔不是调度程序准入时间;重复的 environment/prepare 持续时间不得计入墙上时间。这些收据不会建立转换缓存命中。受保护的缓存预热器按最多 32 个文件的连续批次收集网关方法。这会释放集合之间的非隔离 Bun 模块图,同时预热同一缓存槽中的完整规范清单。普通测试分片、工作人员限制和覆盖范围保持不变。 Bun UI 运行时策略在每个收集周期分配 256 MiB 后请求普通 JavaScriptCore 收集。这是较早的收集触发器,而不是对活动堆的限制。适用于现有的UI进程树和缓存预热器; Node 执行、测试覆盖率、分片计数和工作人员限制保留其现有策略。 UI 装置必须提供已安装的 Solid 组件所需的应用程序上下文:重复的缺失上下文错误会将反应图暴露给 Vitest 的错误序列化器,并且即使在收集后快照显示没有保留的 UI 泄漏时也可能导致大量瞬态分配。仅当其选择的文件包含文档翻译测试时,工具条才会安装 Go;历史整体配置计划保留其现有设置。工作流程固定运行器的 Go 版本,因此冻结的目标无法选择不同的编译器。更新使该引脚与当前翻译模块的首选工具链和两个 Testbox 引导工作流程保持一致。
Shell-heavy macOS 签名和提升案例每个文件最多允许三个案例,上限为 Node 的可用并行度。独立的结帐固定台保留其两种情况的限制。每个案例都有自己的命令和临时根;在删除这些输入之前,清理会加入其进程树和回调工作。外部套房和剩余的结帐合同案例保持顺序。
一旦获得许可,上游 Linux CI 允许最多 96 个并发 Node 测试作业。清单单独强制执行总作业预算:70 Node 行用于上游推送,130 行用于上游 PR,包括精确计划和插件计划。 GitHub 还将 UTF-16 中测量的一项作业的组合输出上限限制为 1 MiB,因此预检每个矩阵共有 524,288 个字符。 Node 行明确列出每个条带测试文件。清单会投影分片运行程序使用的字段,然后在目标包含编解码器时使用 gzip+base64 (groups_gzip_base64)。扁平配置行,包括手动 CI 和精确头 PR 释放门,使用一个包装组,同时保留其原始作业和测试选择。不具备该功能的目标保留其原始平场或投影遗留 groups JSON。工作流程测试将完整生成的输出保持在上限的一半以下。大型 Node 矩阵跨行共享压缩组池,而不是重复独立压缩的文件列表。每个池最多包含 60,000 个 base64 字符,低于 Linux 的每个字符串环境限制。在执行之前,工作流提取所选行并恢复由分片运行器和计时收集器使用的相同独立描述符。没有编解码器的旧目标保留其现有的传输。工作安排、考试选择、时间安排和资源设置均保持不变。输出上限保护 GitHub 的每个作业输出限制 ,而不是工作流程输入或矩阵行限制。较小的 fast/check 车道仍限制在 12 条;对于上游 Blacksmith 推送和 PR 首次尝试(包括分叉),Windows 的上限为 2,Android 的上限为 4; GitHub 覆盖、重试、手动调度、计划和其他存储库保留两个。紧凑的整体配置批处理以 120 分钟的批处理超时运行,而包含模式组共享相同的有限作业预算。
少于 8 个 CPU 或 RAM 的 24 个 GiB 的 CI 运行器上的类型感知 lint 使用现有的 Go 编译器内存策略(GOGC=30、GOMEMLIMIT=3GiB)来减少交换压力。显式 Go 设置仍然具有权威性。该限制是软性的,仅适用于 lint child;申报准备保留其自己的政策。显式核心条带调用将 src/agents、src/gateway、src/infra 和 ui 保留在与其条带剩余目标不同的 lint 进程中。当与相邻目标结合时,它们的语义缓存可能会超出 Go 软限制。受约束的运行程序串行执行这些进程,并在开始下一个进程树之前释放每个进程树。五个条带分配、工作流行、lint 规则和文件覆盖率保持不变;这不会增加跑步者注册。自动完整lint(pnpm lint)保留了其原始的五个聚合核心程序,包括它继承CI环境变量时的情况。已发布的 Git 更新程序将此完整管道称为固定的 20 分钟命令截止时间;显式条带调用者不得将编译器启动添加到该预检中。
常规 Android PR/main CI 和 PR release_gate 调度使用四行: Play 和 Wear 共享单元测试;第三方单元测试;磨损单元 tests/lint 加上第三方应用程序 lint;以及适用于所有四个模块的 Kotlin lint,以及 Play 应用程序和 Wear 共享 lint。每个手机风格都有自己的源集和 SensitiveFeatureConfig; apps/android/app/src/thirdParty/AndroidManifest.xml 声明附加权限和组件。当基准或 Android build/dependency 输入发生变化时,Kotlin-lint 行还会编译基准;丢失或不可用的更改路径数据会保留该构建。每个本机调用在其行内保持顺序,并且所有选定的 Gradle 任务只运行一次。
普通全范围手动验证保留六个 Android 行:三个测试行、build-play、build-wear 和 Kotlin lint。构建行拥有 lint,而不会在测试行中重复它。 build-play 组装了手机风格和Wear共享模块并编译了基准测试; build-wear 装配磨损。 build-play-compat 保留了旧冻结目标的仅播放包装。 GitHub-hosted build-play 为其三个内存限制的 Gradle 调用获取 35 分钟的作业预算。所有其他 Android 任务都需要 20 分钟,包括现在仅限单元的电话行。即使重试重用原始预检矩阵,预算也会遵循当前尝试的跑步者路线。当前的每个 Gradle 任务都有一个受保护的粘性磁盘; PR 作业使用一次性克隆,而受保护的运行则刷新内容寻址的 Gradle 条目。现有的 Android 选择加入和 npm 资格延期保持不变。
Robolectric 解析 Gradle 依赖项缓存之外的 Android SDK 工件,因此每个 Android test-* 任务都会收到工作流拥有的 Gradle 初始化脚本,该脚本将测试 JVM 指向专用的 Maven 本地存储库。操作缓存恢复是任务、平台和 Android- 合同范围的;前缀恢复可以播种更改的合同,但只有成功的可信运行才能在未命中后发布完整的精确缓存。冷运行可能会下载丢失的 SDK 工件,而热运行则重用确切的存档。构建和 lint 任务不会接收 Robolectric 初始化脚本。
剩余的 Blacksmith 粘盘密钥有意受支持的任务维度限制,而不是 PR 编号、提交、运行、分支或依赖项哈希。依赖项、运行时转换和编译缓存改为使用操作缓存,因为不可变存档公开可验证的 restore/save 结果并避免可变快照升级失败。粘性密钥版本迁移后,仅将确切的过时密钥、体系结构和区域身份添加到 .github/retired-sticky-disks.json,从具有相同维度和确认的 main 分派 Sticky Disk Cleanup,验证删除,然后删除这些条目。该工作流程将 ARM 身份路由到 ARM 运行程序,拒绝运行程序区域不匹配,使用 Blacksmith 的精确键删除操作,并且从不删除 Docker 构建器缓存或通配符前缀。操作缓存存档使用正常的 LRU 和不活动驱逐。
check-dependencies 分片运行 Knip 依赖性、未使用文件和未使用导出检查。两个防护措施在生产和全树扫描中强制执行零发现,没有未使用的文件白名单。导出防护还审核脚本条目导出。生产不包括测试支持消费者;全树和脚本扫描包括作为消费者的测试。根据需要对 config/knip.config.ts、config/knip.all-exports.config.ts 或 config/knip.scripts-exports.config.ts 中的有意动态消费者进行建模。每个警卫都会报告每次扫描结果,如果任何扫描失败,则失败。历史目标在提供导出防护时会运行它,否则会保留较旧的死代码回退。