chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-01 23:12:16 +00:00
parent 1e1206f173
commit 521235b15e
3 changed files with 399 additions and 402 deletions

View File

@ -1,75 +1,75 @@
---
read_when:
- 你需要了解为什么某个 CI 作业运行了或没有运行
- 你需要了解 CI 作业为什么运行或未运行
- 你正在调试一个失败的 GitHub Actions 检查
- 你正在协调一次发布验证运行或重新运行
summary: CI 作业图、范围门禁、发布总括项和本地命令等价
- 你正在协调发布验证运行或重新运行
summary: CI 作业图、范围门禁、发布总括流程和本地命令等效
title: CI 流水线
x-i18n:
generated_at: "2026-05-01T22:37:35Z"
generated_at: "2026-05-01T23:10:03Z"
model: gpt-5.5
provider: openai
source_hash: c6d284871bfc5f8c4740bd729563070baf396c60a2769f49c521c44dd709addf
source_hash: 4475dd906e2a7b7675a01ec72e7782f75ccbb4769bd0333c3f56acea9f343893
source_path: ci.md
workflow: 16
---
OpenClaw CI 会在每次推送到 `main` 和每个拉取请求上运行。`preflight` 作业会对差异进行分类,并在只有不相关区域发生变更时关闭昂贵的检查线。手动 `workflow_dispatch` 运行会有意绕过智能作用域限定并为发布候选版本和广泛验证展开完整图。Android 检查线通过 `include_android` 保持选择加入。仅发布使用的插件覆盖位于单独的 [`Plugin Prerelease`](#plugin-prerelease) 工作流中,并且只会从 [`Full Release Validation`](#full-release-validation) 或显式手动调度运行。
OpenClaw CI 会在每次推送到 `main` 以及每个拉取请求上运行。`preflight` 作业会对差异进行分类,并在仅不相关区域发生变化时关闭高成本流水线。手动 `workflow_dispatch` 运行会有意绕过智能范围限定并为发布候选和广泛验证展开完整图。Android 流水线通过 `include_android` 保持选择性启用。仅发布使用的插件覆盖位于单独的 [`Plugin Prerelease`](#plugin-prerelease) 工作流中,并且只会从 [`Full Release Validation`](#full-release-validation) 或显式手动调度运行。
## 流水线概览
| 作业 | 用途 | 运行时机 |
| 作业 | 目的 | 运行时机 |
| -------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------- |
| `preflight` | 检测仅文档变更、变更作用域、变更插件,并构建 CI 清单 | 始终在非草稿推送和 PR 上运行 |
| `preflight` | 检测仅文档变更、变更范围、变更的扩展,并构建 CI 清单 | 始终在非草稿推送和 PR 上运行 |
| `security-scm-fast` | 通过 `zizmor` 进行私钥检测和工作流审计 | 始终在非草稿推送和 PR 上运行 |
| `security-dependency-audit` | 针对 npm 公告执行无依赖的生产 lockfile 审计 | 始终在非草稿推送和 PR 上运行 |
| `security-fast` | 快速安全作业的必需聚合结果 | 始终在非草稿推送和 PR 上运行 |
| `check-dependencies` | 生产 Knip 仅依赖检查,以及未使用文件允许列表防护 | Node 相关变更 |
| `build-artifacts` | 构建 `dist/`、Control UI、构建产物检查可复用下游产物 | Node 相关变更 |
| `checks-fast-core` | 快速 Linux 正确性检查线,例如内置/插件合约/协议检查 | Node 相关变更 |
| `checks-fast-contracts-channels` | 分片的渠道合约检查,并提供稳定的聚合检查结果 | Node 相关变更 |
| `checks-node-core-test` | Core Node 测试分片,不包括渠道、内置、合约和插件检查线 | Node 相关变更 |
| `check` | 分片的主本地门禁等价项生产类型、lint、防护、测试类型和严格 smoke | Node 相关变更 |
| `check-additional` | 架构、边界、插件表面防护、包边界和 gateway-watch 分片 | Node 相关变更 |
| `build-smoke` | 已构建 CLI smoke 测试和启动内存 smoke | Node 相关变更 |
| `checks` | 构建产物渠道测试验证器 | Node 相关变更 |
| `checks-node-compat-node22` | Node 22 兼容性构建和 smoke 检查线 | 发布用手动 CI 调度 |
| `check-docs` | 文档格式、lint 和断链检查 | 文档变更 |
| `skills-python` | 对 Python 支持的 Skills 运行 Ruff + pytest | Python Skills 相关变更 |
| `checks-windows` | Windows 特定的进程/路径测试,以及共享运行时导入说明符回归 | Windows 相关变更 |
| `macos-node` | 使用共享构建产物的 macOS TypeScript 测试检查线 | macOS 相关变更 |
| `security-dependency-audit` | 针对 npm 公告执行无需安装依赖的生产 lockfile 审计 | 始终在非草稿推送和 PR 上运行 |
| `security-fast` | 快速安全作业所需的聚合项 | 始终在非草稿推送和 PR 上运行 |
| `check-dependencies` | 生产 Knip 仅依赖检查,以及未使用文件 allowlist 保护 | Node 相关变更 |
| `build-artifacts` | 构建 `dist/`、Control UI、构建产物检查,以及可复用下游产物 | Node 相关变更 |
| `checks-fast-core` | 快速 Linux 正确性流水线,例如内置/插件契约/协议检查 | Node 相关变更 |
| `checks-fast-contracts-channels` | 带稳定聚合检查结果的分片渠道契约检查 | Node 相关变更 |
| `checks-node-core-test` | Core Node 测试分片,不包括渠道、内置、契约和扩展流水线 | Node 相关变更 |
| `check` | 分片主本地门禁等效项生产类型、lint、保护、测试类型和严格冒烟 | Node 相关变更 |
| `check-additional` | 架构、边界、扩展表面保护、包边界和 gateway-watch 分片 | Node 相关变更 |
| `build-smoke` | 已构建 CLI 冒烟测试和启动内存冒烟 | Node 相关变更 |
| `checks` | 构建产物渠道测试验证器 | Node 相关变更 |
| `checks-node-compat-node22` | Node 22 兼容性构建和冒烟流水线 | 发布用手动 CI 调度 |
| `check-docs` | 文档格式、lint 和断链检查 | 文档变更 |
| `skills-python` | Python 支持的 Skills 的 Ruff + pytest | Python Skill 相关变更 |
| `checks-windows` | Windows 专属进程/路径测试,以及共享运行时导入说明符回归 | Windows 相关变更 |
| `macos-node` | 使用共享构建产物的 macOS TypeScript 测试流水线 | macOS 相关变更 |
| `macos-swift` | macOS 应用的 Swift lint、构建和测试 | macOS 相关变更 |
| `android` | 两种 flavor 的 Android 单元测试,以及一次 debug APK 构建 | Android 相关变更 |
| `test-performance-agent` | 受信任活动之后的每日 Codex 慢测试优化 | 主 CI 成功或手动调度 |
| `test-performance-agent` | 在可信活动之后每日进行 Codex 慢测试优化 | Main CI 成功或手动调度 |
## 快速失败顺序
1. `preflight` 决定哪些检查线实际存在。`docs-scope` 和 `changed-scope` 逻辑是此作业内部的步骤,不是独立作业。
2. `security-scm-fast`、`security-dependency-audit`、`security-fast`、`check`、`check-additional`、`check-docs` 和 `skills-python` 会快速失败,而不等待更重的产物和平台矩阵作业。
3. `build-artifacts` 会与快速 Linux 检查线重叠运行,这样下游使用方就能在共享构建就绪后立即开始。
4. 更重的平台和运行时检查线随后展开:`checks-fast-core`、`checks-fast-contracts-channels`、`checks-node-core-test`、`checks`、`checks-windows`、`macos-node`、`macos-swift` 和 `android`
1. `preflight` 决定哪些流水线会存在。`docs-scope` 和 `changed-scope` 逻辑是此作业中的步骤,而不是独立作业。
2. `security-scm-fast`、`security-dependency-audit`、`security-fast`、`check`、`check-additional`、`check-docs` 和 `skills-python` 会快速失败,无需等待更重的产物和平台矩阵作业。
3. `build-artifacts` 会与快速 Linux 流水线重叠运行,以便下游消费者可在共享构建就绪后立即开始。
4. 更重的平台和运行时流水线随后展开:`checks-fast-core`、`checks-fast-contracts-channels`、`checks-node-core-test`、`checks`、`checks-windows`、`macos-node`、`macos-swift` 和 `android`
当同一个 PR 或 `main` ref 上有更新的推送落地时GitHub 可能会把被取代的作业标记为 `cancelled`。除非同一 ref 的最新运行也失败,否则将其视为 CI 噪声。聚合分片检查使用 `!cancelled() && always()`,因此它们仍会报告正常的分片失败,但在整个工作流已经被取代后不会继续排队。自动 CI 并发键带有版本号(`CI-v7-*`),因此 GitHub 端旧队列组中的僵尸项不能无限期阻塞更新的 main 运行。手动完整套件运行使用 `CI-manual-v1-*`,并且不会取消进行的运行。
当同一 PR 或 `main` ref 上有较新的推送落地时GitHub 可能会将被取代的作业标记为 `cancelled`。除非同一 ref 的最新运行也失败,否则将其视为 CI 噪声。聚合分片检查使用 `!cancelled() && always()`,因此它们仍会报告正常的分片失败,但不会在整个工作流已被取代后继续排队。自动 CI 并发键带版本号(`CI-v7-*`),因此 GitHub 侧旧队列组中的僵尸项无法无限期阻塞较新的 main 运行。手动全套件运行使用 `CI-manual-v1-*`,并且不会取消正在进行的运行。
## 作用域和路由
## 范围和路由
作用域逻辑位于 `scripts/ci-changed-scope.mjs`,并由 `src/scripts/ci-changed-scope.test.ts` 中的单元测试覆盖。手动调度会跳过变更作用域检测,并让 preflight 清单表现得像每个受作用域限定的区域都发生了变更
范围逻辑位于 `scripts/ci-changed-scope.mjs`,并由 `src/scripts/ci-changed-scope.test.ts` 中的单元测试覆盖。手动调度会跳过 changed-scope 检测,并使 preflight 清单表现得像每个已限定范围的区域都发生了变化
- **CI 工作流编辑** 会验证 Node CI 图以及工作流 lint但不会单独强制 Windows、Android 或 macOS 原生构建;这些平台检查线仍然限定为平台源码变更。
- **仅 CI 路由编辑、选定的廉价核心测试 fixture 编辑,以及窄范围插件合约 helper/测试路由编辑**使用快速 Node-only 清单路径:`preflight`、安全检查和单个 `checks-fast-core` 任务。当变更仅限于该快速任务直接执行的路由或 helper 表面时该路径会跳过构建产物、Node 22 兼容性、渠道合约、完整核心分片、内置插件分片和额外防护矩阵。
- **Windows Node 检查** 限定为 Windows 特定的进程/路径包装器、npm/pnpm/UI runner helper、包管理器配置以及执行该检查线的 CI 工作流表面不相关的源码、插件、install-smoke 和仅测试变更会留在 Linux Node 检查线上。
- **CI 工作流编辑**会验证 Node CI 图以及工作流 lint但不会自行强制运行 Windows、Android 或 macOS 原生构建;这些平台流水线仍限定于平台源代码变更。
- **仅 CI 路由编辑、选定的低成本 core-test fixture 编辑,以及窄范围插件契约辅助/测试路由编辑**使用快速 Node-only 清单路径:`preflight`、安全检查和单个 `checks-fast-core` 任务。当变更仅限于该快速任务直接覆盖的路由或辅助表面时此路径会跳过构建产物、Node 22 兼容性、渠道契约、完整 core 分片、内置插件分片和附加保护矩阵。
- **Windows Node 检查**限定于 Windows 专属进程/路径包装器、npm/pnpm/UI 运行器辅助工具、包管理器配置,以及执行该流水线的 CI 工作流表面不相关的源代码、插件、install-smoke 和仅测试变更仍保留在 Linux Node 流水线上。
最慢的 Node 测试族会被拆分或均衡,以便每个作业保持较小规模且不过度占用 runner渠道合约作为三个加权分片运行小型核心单元检查线会配对auto-reply 作为四个均衡 worker 运行reply 子树拆分为 agent-runner、dispatch 和 commands/state-routing 分片agentic gateway/插件配置分散到现有的仅源码 agentic Node 作业中而不是等待构建产物。广泛的浏览器、QA、媒体和杂项插件测试使用它们专用的 Vitest 配置,而不是共享插件 catch-all。include-pattern 分片使用 CI 分片名称记录计时条目,因此 `.artifacts/vitest-shard-timings.json` 可以区分整个配置和经过筛选的分片。`check-additional` 将 package-boundary 编译/canary 工作放在一起,并将运行时拓扑架构与 gateway watch 覆盖分开边界防护分片会在一个作业内并发运行其小型独立防护。Gateway watch、渠道测试和核心支持边界分片会在 `dist/``dist-runtime/` 已构建后,在 `build-artifacts` 内并发运行。
最慢的 Node 测试族会被拆分或平衡,使每个作业保持较小规模而不过度预留运行器:渠道契约作为三个加权分片运行,小型 core 单元流水线成对运行auto-reply 作为四个平衡 worker 运行reply 子树拆分为 agent-runner、dispatch 和 commands/state-routing 分片agentic gateway/plugin 配置分布在现有仅源代码 agentic Node 作业中而不是等待构建产物。广泛的浏览器、QA、媒体和杂项插件测试使用其专用 Vitest 配置,而不是共享插件总括项。include-pattern 分片使用 CI 分片名称记录计时条目,因此 `.artifacts/vitest-shard-timings.json` 可以区分整个配置和经过过滤的分片。`check-additional` 将 package-boundary 编译/canary 工作保持在一起,并将运行时拓扑架构与 gateway watch 覆盖分离边界保护分片会在一个作业内并发运行其小型独立保护。Gateway watch、渠道测试和 core support-boundary 分片会在 `dist/``dist-runtime/` 已构建后,在 `build-artifacts` 内并发运行。
Android CI 会运行 `testPlayDebugUnitTest``testThirdPartyDebugUnitTest`,然后构建 Play debug APK。third-party flavor 没有单独的源码集或 manifest它的单元测试检查线仍会使用 SMS/通话记录 BuildConfig 标志编译该 flavor同时避免在每个 Android 相关推送上重复执行 debug APK 打包作业。
Android CI 会同时运行 `testPlayDebugUnitTest``testThirdPartyDebugUnitTest`,然后构建 Play debug APK。third-party flavor 没有单独的 source set 或 manifest其单元测试流水线仍会使用 SMS/call-log BuildConfig 标志编译该 flavor同时避免在每次 Android 相关推送上重复执行 debug APK 打包作业。
`check-dependencies` 分片会运行 `pnpm deadcode:dependencies`固定到最新 Knip 版本的生产 Knip 仅依赖检查,并在 `dlx` 安装中禁用 pnpm 的最低发布时间限制)和 `pnpm deadcode:unused-files`,后者会将 Knip 的生产未使用文件发现与 `scripts/deadcode-unused-files.allowlist.mjs` 进行比较。当 PR 添加新的未经审核的未使用文件或留下过期的允许列表条目时,未使用文件防护会失败,同时保留 Knip 无法静态解析的有意动态插件、生成内容、构建、实时测试和包桥接表面。
`check-dependencies` 分片会运行 `pnpm deadcode:dependencies`生产 Knip 仅依赖检查,固定到最新 Knip 版本,并在 `dlx` 安装时禁用 pnpm 的最低发布年龄限制)和 `pnpm deadcode:unused-files`,后者会将 Knip 的生产未使用文件发现结果`scripts/deadcode-unused-files.allowlist.mjs` 比较。当 PR 添加新的未经审查的未使用文件,或留下过期 allowlist 条目时,未使用文件保护会失败,同时保留 Knip 无法静态解析的有意动态插件、生成内容、构建、live-test 和包桥接表面。
## 手动调度
手动 CI 调度会运行与普通 CI 相同的作业图,但强制开启每个非 Android 作用域检查线Linux Node 分片、内置插件分片、渠道合约、Node 22 兼容性、`check`、`check-additional`、构建 smoke、文档检查、Python Skills、Windows、macOS 和 Control UI i18n。独立手动 CI 调度只有在 `include_android=true` 时才运行 Android完整发布总控通过传入 `include_android=true` 启用 Android。插件预发布静态检查、仅发布用的 `agentic-plugins` 分片、完整插件批量扫描和插件预发布 Docker 检查线都不包含在 CI 中。Docker 预发布套件只会在 `Full Release Validation` 以启用 release-validation 门禁的方式调度单独的 `Plugin Prerelease` 工作流时运行。
手动 CI 调度运行与普通 CI 相同的作业图,但会强制启用每个非 Android 范围流水线Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建冒烟、文档检查、Python Skills、Windows、macOS 和 Control UI i18n。独立手动 CI 调度只有在 `include_android=true` 时才运行 Android完整发布总控通过传入 `include_android=true` 启用 Android。插件预发布静态检查、仅发布`agentic-plugins` 分片、完整扩展批量扫查,以及插件预发布 Docker 流水线均不包含在 CI 中。Docker 预发布套件仅在 `Full Release Validation` 调度单独的 `Plugin Prerelease` 工作流并启用 release-validation 门禁时运行。
手动运行使用唯一的并发组,因此发布候选版本完整套件不会被同一 ref 上的另一个推送或 PR 运行取消。可选的 `target_ref` 输入允许受信任调用方在使用所选调度 ref 的工作流文件时,针对分支、标签或完整提交 SHA 运行该图。
手动运行使用唯一的并发组,因此发布候选全套件不会被同一 ref 上的另一次推送或 PR 运行取消。可选的 `target_ref` 输入允许可信调用者在使用所选调度 ref 的工作流文件时,针对分支、标签或完整提交 SHA 运行该图。
```bash
gh workflow run ci.yml --ref release/YYYY.M.D
@ -77,14 +77,14 @@ gh workflow run ci.yml --ref main -f target_ref=<branch-or-sha> -f include_andro
gh workflow run full-release-validation.yml --ref main -f ref=<branch-or-sha>
```
## Runner
## 运行器
| 运行器 | 作业 |
| 运行器 | 任务 |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`、快速安全作业和聚合`security-scm-fast`、`security-dependency-audit`、`security-fast`)、快速协议/契约/内置检查、分片渠道契约检查、除 lint 外的 `check` 分片、`check-additional` 分片和聚合、Node 测试聚合验证器、文档检查、Python Skills、workflow-sanity、labeler、auto-responseinstall-smoke 预检也使用 GitHub 托管的 Ubuntu以便 Blacksmith 矩阵可以更早排队 |
| `ubuntu-24.04` | `preflight`、快速安全任务和聚合任务`security-scm-fast`、`security-dependency-audit`、`security-fast`)、快速协议/契约/内置检查、分片渠道契约检查、除 lint 外的 `check` 分片、`check-additional` 分片和聚合任务、Node 测试聚合验证器、文档检查、Python Skills、workflow-sanity、labeler、auto-responseinstall-smoke preflight 也使用 GitHub 托管的 Ubuntu因此 Blacksmith 矩阵可以更早排队 |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`、较轻量的插件分片、`checks-fast-core`、`checks-node-compat-node22`、`check-prod-types` 和 `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`、build-smoke、Linux Node 测试分片、内置插件测试分片、`android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`(对 CPU 足够敏感8 vCPU 节省的时间不抵成本install-smoke Docker 构建32-vCPU 排队时间的成本不抵节省的时间) |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`(对 CPU 足够敏感8 vCPU 的成本高于节省的时间install-smoke Docker 构建32-vCPU 的排队时间成本高于节省的时间) |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `openclaw/openclaw` 上的 `macos-node`fork 回退到 `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `openclaw/openclaw` 上的 `macos-swift`fork 回退到 `macos-latest` |
@ -117,31 +117,31 @@ pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifac
## 完整发布验证
`Full Release Validation` 是“在发布前运行所有内容”的手动总括工作流。它接受分支、标签或完整提交 SHA使用该目标调度手动 `CI` 工作流,为仅发布使用的插件/包/静态/Docker 证明调度 `Plugin Prerelease`并为安装冒烟测试、包验收、Docker 发布路径套件、live/E2E、OpenWebUI、QA Lab parity、Matrix 和 Telegram 通道调度 `OpenClaw Release Checks`。提供已发布的包规格时,它还可以运行发布后的 `NPM Telegram Beta E2E` 工作流
`Full Release Validation`用于“在发布前运行所有内容”的手动总括工作流。它接受分支、标签或完整 commit SHA使用该目标分派手动 `CI` 工作流,分派 `Plugin Prerelease` 以进行仅发布相关的插件/包/静态/Docker 验证,并分派 `OpenClaw Release Checks` 以进行安装冒烟、包验收、Docker 发布路径套件、live/E2E、OpenWebUI、QA Lab 一致性、Matrix 和 Telegram 通道。使用 `rerun_group=all``release_profile=full` 时,它还会针对发布检查中的 `release-package-under-test` 工件运行 `NPM Telegram Beta E2E`。发布后,传入 `npm_telegram_package_spec`,即可针对已发布的 npm 包重新运行同一个 Telegram 包通道
请参阅[完整发布验证](/zh-CN/reference/full-release-validation),了解阶段矩阵、精确的工作流作业名称、配置差异、产物以及定向重跑入口
请参阅[完整发布验证](/zh-CN/reference/full-release-validation),了解阶段矩阵、确切工作流任务名称、配置文件差异、工件和聚焦重跑句柄
`release_profile` 控制传入发布检查的 live/provider 覆盖范围。手动发布工作流默认使用 `stable`;仅当你有意需要广泛的参考 provider/media 矩阵时,才使用 `full`
`release_profile` 控制传入发布检查的 live/提供商 覆盖范围。手动发布工作流默认使用 `stable`;只有在你有意需要更广的咨询型提供商/媒体矩阵时才使用 `full`
- `minimum` 保留最快的 OpenAI/核心发布关键通道。
- `stable` 添加稳定的 provider/backend 集合。
- `full` 运行广泛的参考 provider/media 矩阵。
- `stable` 添加稳定的提供商/后端集合。
- `full` 运行更广的咨询型提供商/媒体矩阵。
总括工作流会记录已调度的子运行 ID最终的 `Verify full validation` 作业会重新检查当前子运行结论,并为每个子运行追加最慢作业表。如果某个子工作流重跑后转绿,只需重跑父验证器作业,以刷新总括结果和时间摘要。
总括工作流会记录已分派的子运行 ID最终的 `Verify full validation` 任务会重新检查当前子运行结论,并为每个子运行追加最慢任务表。如果某个子工作流被重跑并变为绿色,只需重跑父级验证器任务,即可刷新总括结果和耗时摘要。
对于恢复,`Full Release Validation` 和 `OpenClaw Release Checks` 都接受 `rerun_group`发布候选版本使用 `all`,仅普通完整 CI 子项使用 `ci`,仅插件预发布子项使用 `plugin-prerelease`,每个发布子项使用 `release-checks`,或在总括工作流上使用更窄的组:`install-smoke`、`cross-os`、`live-e2e`、`package`、`qa`、`qa-parity`、`qa-live` 或 `npm-telegram`。这会在定向修复后,将失败发布环境的重跑范围控制在边界内
恢复`Full Release Validation` 和 `OpenClaw Release Checks` 都接受 `rerun_group`对发布候选版本使用 `all`,仅对普通完整 CI 子流程使用 `ci`,仅对插件预发布子流程使用 `plugin-prerelease`,对每个发布子流程使用 `release-checks`,或在总括工作流中使用更窄的组:`install-smoke`、`cross-os`、`live-e2e`、`package`、`qa`、`qa-parity`、`qa-live` 或 `npm-telegram`。这样在进行聚焦修复后,失败的发布环境重跑会保持边界明确
`OpenClaw Release Checks` 使用受信任的工作流 ref将选定的 ref 一次解析`release-package-under-test` tarball然后将该产物传递给 live/E2E 发布路径 Docker 工作流和包验收分片。这样可以确保发布环境之间的包字节一致,并避免在多个子作业中重新打包同一个候选版本。
`OpenClaw Release Checks` 使用受信任的工作流 ref选 ref 解析一次为 `release-package-under-test` tarball然后把该工件传给 live/E2E 发布路径 Docker 工作流和包验收分片。这能让发布环境之间的包字节保持一致,并避免在多个子任务中重复打包同一个候选版本。
`ref=main``rerun_group=all` 的重复 `Full Release Validation` 运行会取代较旧的总括运行。父监视器在父运行被取消时,会取消其已调度的任何子工作流,因此较新的 main 验证不会排在过时的两小时 release-check 运行之后。发布分支/标签验证和定向重跑组保持 `cancel-in-progress: false`
对于 `ref=main``rerun_group=all` 的重复 `Full Release Validation` 运行,会由较新的总括工作流取代较旧的总括工作流。父级监视器在父级被取消时,会取消它已经分派的任何子工作流,因此新的 main 验证不会被陈旧的两小时发布检查运行阻塞。发布分支/标签验证和聚焦重跑组会保持 `cancel-in-progress: false`
## Live 和 E2E 分片
发布 live/E2E 子保留广泛的原生 `pnpm test:live` 覆盖,但它通过 `scripts/test-live-shard.mjs` 以命名分片运行,而不是作为一个串行作业运行:
发布 live/E2E 子流程保留广泛的原生 `pnpm test:live` 覆盖,但它通过 `scripts/test-live-shard.mjs` 以命名分片运行,而不是作为一个串行任务运行:
- `native-live-src-agents`
- `native-live-src-gateway-core`
- provider 过滤的 `native-live-src-gateway-profiles` 作业
- 提供商过滤的 `native-live-src-gateway-profiles` 任务
- `native-live-src-gateway-backends`
- `native-live-test`
- `native-live-extensions-a-k`
@ -149,59 +149,59 @@ pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifac
- `native-live-extensions-openai`
- `native-live-extensions-o-z-other`
- `native-live-extensions-xai`
- 拆分的媒体音频/视频分片和 provider 过滤的音乐分片
- 拆分的媒体音频/视频分片,以及提供商过滤的音乐分片
样可以保持相同的文件覆盖,同时让缓慢的 live provider 故障更容易重跑和诊断。聚合分片名称 `native-live-extensions-o-z`、`native-live-extensions-media` 和 `native-live-extensions-media-music`可用于手动一次性重跑。
会保持相同的文件覆盖,同时让较慢的 live 提供商失败更容易重跑和诊断。聚合的 `native-live-extensions-o-z`、`native-live-extensions-media` 和 `native-live-extensions-media-music` 分片名称仍可用于手动一次性重跑。
原生 live 媒体分片在 `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04` 中运行,该镜像由 `Live Media Runner Image` 工作流构建。该镜像预`ffmpeg``ffprobe`;媒体作业只会在设置前验证二进制文件。将 Docker 支持的 live 套件保留在普通 Blacksmith 运行器上,容器作业不适合启动嵌套 Docker 测试。
原生 live 媒体分片在 `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04` 中运行,该镜像由 `Live Media Runner Image` 工作流构建。该镜像预安装了 `ffmpeg``ffprobe`;媒体任务只会在设置前验证这些二进制文件。让 Docker 支撑的 live 套件继续在普通 Blacksmith 运行器上运行,容器任务并不适合启动嵌套 Docker 测试。
Docker 支持的 live 模型/backend 分片会针对选定提交使用单独的共享 `ghcr.io/openclaw/openclaw-live-test:<sha>` 镜像。live 发布工作流会构建并推送该镜像一次,然后 Docker live 模型、provider 分片的 Gateway 网关、CLI backend、ACP bind 和 Codex harness 分片会使用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行。Gateway 网关 Docker 分片在脚本层带有显式 `timeout` 上限,低于工作流作业超时,因此卡住的容器或清理路径会快速失败,而不是消耗整个 release-check 预算。如果这些分片独立重建完整源 Docker 目标,说明发布运行配置错误,并会在重复镜像构建上浪费实际耗时。
Docker 支撑的 live 模型/后端分片会按所选 commit 使用单独的共享 `ghcr.io/openclaw/openclaw-live-test:<sha>` 镜像。live 发布工作流会构建并推送该镜像一次,然后 Docker live 模型、按提供商分片的 Gateway 网关、CLI 后端、ACP bind 和 Codex harness 分片会使用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行。Gateway 网关 Docker 分片在脚本级携带显式 `timeout` 上限,低于工作流任务超时,因此卡住的容器或清理路径会快速失败,而不是耗尽整个发布检查预算。如果这些分片独立重建完整源码 Docker 目标,则说明发布运行配置错误,并会在重复镜像构建上浪费总耗时。
## 包验收
当问题是“这个可安装的 OpenClaw 包作为产品是否可用?”时,使用 `Package Acceptance`。它不同于普通 CI普通 CI 验证源码树,而包验收通过用户安装或更新后实际使用的同一个 Docker E2E harness验证单个 tarball。
当问题是“这个可安装的 OpenClaw 包是否能作为产品正常工作?”时,使用 `Package Acceptance`。它不同于普通 CI普通 CI 验证源码树,而包验收通过用户安装或更新后实际使用的同一 Docker E2E harness 来验证单个 tarball。
### 作业
### 任务
1. `resolve_package` 检出 `workflow_ref`,解析一个候选包,写入 `.artifacts/docker-e2e-package/openclaw-current.tgz`,写入 `.artifacts/docker-e2e-package/package-candidate.json`,将两者作为 `package-under-test` 工件上传,并在 GitHub 步骤摘要中打印来源、workflow ref、package ref、版本、SHA-256 和 profile
2. `docker_acceptance` 使用 `ref=workflow_ref``package_artifact_name=package-under-test` 调用 `openclaw-live-and-e2e-checks-reusable.yml`。可复用工作流会下载该工件,验证 tarball 清单,在需要时准备 package-digest Docker 镜像,并针对该包运行选定的 Docker lanes而不是打包工作流检出内容。当某个 profile 选择多个目标 `docker_lanes` 时,可复用工作流会先准备一次包和共享镜像,然后将这些 lanes 扇出为并行的目标 Docker 作业,并使用唯一工件
3. `package_telegram` 可选调用 `NPM Telegram Beta E2E`。当 `telegram_mode` 不是 `none` 时运行,并且在 Package Acceptance 解析出包时安装同一个 `package-under-test` 工件;独立 Telegram 调度仍可安装已发布的 npm spec
4. 如果包解析、Docker acceptance 或可选 Telegram lane 失败,`summary` 会让工作流失败。
1. `resolve_package` 检出 `workflow_ref`,解析一个包候选项,写入 `.artifacts/docker-e2e-package/openclaw-current.tgz`,写入 `.artifacts/docker-e2e-package/package-candidate.json`,将两者作为 `package-under-test` artifact 上传,并在 GitHub 步骤摘要中打印来源、工作流 ref、包 ref、版本、SHA-256 和配置文件
2. `docker_acceptance` 调用 `openclaw-live-and-e2e-checks-reusable.yml`,并传入 `ref=workflow_ref``package_artifact_name=package-under-test`。可复用工作流会下载该 artifact验证 tarball 清单,在需要时准备包摘要 Docker 镜像,并针对该包运行所选 Docker lane而不是打包工作流检出内容。当某个配置文件选择多个定向 `docker_lanes` 时,可复用工作流会先准备一次包和共享镜像,然后将这些 lane 扇出为并行定向 Docker 作业,并使用唯一 artifact
3. `package_telegram` 可选择性调用 `NPM Telegram Beta E2E`。它会在 `telegram_mode` 不是 `none` 时运行,并在包验收已解析出包时安装相同的 `package-under-test` artifact独立 Telegram 分发仍可安装已发布的 npm 规格
4. 如果包解析、Docker 验收或可选 Telegram lane 失败,`summary` 会使工作流失败。
### 候选来源
- `source=npm` 接受 `openclaw@beta`、`openclaw@latest`,或精确的 OpenClaw 发布版本,例如 `openclaw@2026.4.27-beta.2`用于已发布 beta/稳定版 acceptance
- `source=ref` 打包受信任的 `package_ref` 分支、标签或完整提交 SHA。解析器会获取 OpenClaw 分支/标签,验证所选提交可从仓库分支历史或发布标签访问,在分离 worktree 中安装依赖,并使用 `scripts/package-openclaw-for-docker.mjs` 打包。
- `source=url` 下载一个 HTTPS `.tgz`;必须提供 `package_sha256`
- `source=artifact``artifact_run_id``artifact_name` 下载一个 `.tgz``package_sha256` 可选,但外部共享工件应提供
- `source=npm` 接受 `openclaw@beta`、`openclaw@latest`,或精确的 OpenClaw 发布版本,例如 `openclaw@2026.4.27-beta.2`将它用于已发布 beta/稳定版验收
- `source=ref` 打包受信任的 `package_ref` 分支、标签或完整提交 SHA。解析器会获取 OpenClaw 分支/标签,验证所选提交可从仓库分支历史或发布标签访问,在分离 worktree 中安装依赖,并使用 `scripts/package-openclaw-for-docker.mjs` 打包。
- `source=url` 下载 HTTPS `.tgz`;必须提供 `package_sha256`
- `source=artifact``artifact_run_id``artifact_name` 下载一个 `.tgz``package_sha256` 是可选项,但对于外部共享 artifact 应提供它
请将 `workflow_ref``package_ref` 分开。`workflow_ref` 是运行测试的受信任工作流/harness 代码。`package_ref` 是在 `source=ref` 时被打包的源提交。这样当前测试 harness 就能验证较旧的受信任源提交,而无需运行旧的工作流逻辑。
保持 `workflow_ref``package_ref` 分离。`workflow_ref` 是运行测试的受信任工作流/测试框架代码。`package_ref` 是 `source=ref` 时会被打包的源提交。这样当前测试框架就可以验证较旧的受信任源提交,而无需运行旧的工作流逻辑。
### Suite profiles
### 套件配置文件
- `smoke``npm-onboard-channel-agent`、`gateway-network`、`config-reload`
- `package``npm-onboard-channel-agent`、`doctor-switch`、`update-channel-switch`、`upgrade-survivor`、`published-upgrade-survivor`、`plugins-offline`、`plugin-update`
- `product``package` 加上 `mcp-channels`、`cron-mcp-cleanup`、`openai-web-search-minimal`、`openwebui`
- `full`带 OpenWebUI 的完整 Docker release-path 分块
- `custom` — 精确的 `docker_lanes`;当 `suite_profile=custom` 时必
- `full`包含 OpenWebUI 的完整 Docker 发布路径分块
- `custom` — 精确的 `docker_lanes`;当 `suite_profile=custom` 时必
`package` profile 使用离线插件覆盖,因此已发布包验证不会受实时 ClawHub 可用性阻塞。可选 Telegram lane 会在 `NPM Telegram Beta E2E` 中复用 `package-under-test` 工件,同时为独立调度保留已发布 npm spec 路径
`package` 配置文件使用离线插件覆盖,因此已发布包验证不会被实时 ClawHub 可用性阻塞。可选 Telegram lane 会在 `NPM Telegram Beta E2E` 中复用 `package-under-test` artifact并保留已发布 npm 规格路径用于独立分发
专用的更新和插件测试策略包括本地命令、Docker lanes、Package Acceptance 输入、发布默认值和失败分流,请参阅 [更新和插件测试](/zh-CN/help/testing-updates-plugins)。
关专用的更新和插件测试策略包括本地命令、Docker lane、包验收输入、发布默认值和失败分类,请参阅[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
发布检查会调用 Package Acceptance使用 `source=artifact`、准备好的发布包工件、`suite_profile=custom`、`docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`、`published_upgrade_survivor_baselines=release-history`、`published_upgrade_survivor_scenarios=reported-issues` 和 `telegram_mode=mock-openai`。这会让包迁移、更新、陈旧插件依赖清理、离线插件、插件更新和 Telegram 证明都基于同一个已解析的包 tarball。跨 OS 发布检查仍覆盖特定 OS 的新手引导、安装器和平台行为;包/更新产品验证应从 Package Acceptance 开始。`published-upgrade-survivor` Docker lane 每次运行验证一个已发布包基线。在 Package Acceptance 中,解析出的 `package-under-test` tarball 始终是候选包,而 `published_upgrade_survivor_baseline` 选择回退的已发布基线,默认是 `openclaw@latest`;失败 lane 的重跑命令会保留该基线。设置 `published_upgrade_survivor_baselines=release-history` 可将该 lane 扩展到去重后的历史矩阵:最新六个稳定版本、`2026.4.23`,以及 `2026-03-15` 之前的最新稳定版本。设置 `published_upgrade_survivor_scenarios=reported-issues` 可将同一组基线扩展到按问题形状构造的 fixtures覆盖 Feishu 配置、保留的 bootstrap/persona 文件、波浪号日志路径,以及陈旧旧版插件依赖根。本地聚合运行可以通过 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 传入精确包 spec也可以使用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 保持单个 lane例如 `openclaw@2026.4.15`,或设置 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 使用场景矩阵。已发布 lane 使用内置的 `openclaw config set` 命令配方配置基线,在 `summary.json` 中记录配方步骤,并在 Gateway 网关启动后探测 `/healthz`、`/readyz` 以及 RPC 状态。Windows 打包版和安装器全新安装 lanes 还会验证已安装包可以从原始绝对 Windows 路径导入 browser-control 覆盖。OpenAI 跨 OS agent-turn 冒烟测试在设置时默认使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用 `openai/gpt-5.5`,因此安装和 Gateway 网关证明会保持使用首选 GPT-5 测试模型
发布检查会使用 `source=artifact`、准备好的发布包 artifact、`suite_profile=custom`、`docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`、`published_upgrade_survivor_baselines=release-history`、`published_upgrade_survivor_scenarios=reported-issues` 和 `telegram_mode=mock-openai` 调用包验收。这会让包迁移、更新、过期插件依赖清理、离线插件、插件更新和 Telegram 证明都基于同一个已解析的包 tarball。跨 OS 发布检查仍覆盖特定 OS 的新手引导、安装器和平台行为;包/更新产品验证应从包验收开始。`published-upgrade-survivor` Docker lane 每次运行验证一个已发布包基线。在包验收中,已解析的 `package-under-test` tarball 始终是候选项,而 `published_upgrade_survivor_baseline` 选择回退的已发布基线,默认值为 `openclaw@latest`;失败 lane 的重跑命令会保留该基线。设置 `published_upgrade_survivor_baselines=release-history` 可将该 lane 扩展到去重后的历史矩阵:最新六个稳定版本、`2026.4.23`,以及 `2026-03-15` 之前的最新稳定版本。设置 `published_upgrade_survivor_scenarios=reported-issues` 可将相同基线扩展到面向 issue 形态的 fixture覆盖 Feishu 配置、保留的 bootstrap/persona 文件、波浪号日志路径,以及过期旧版插件依赖根。本地聚合运行可以通过 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 传入精确包规格,也可以通过 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 保持单个 lane例如 `openclaw@2026.4.15`,或设置 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 使用场景矩阵。已发布 lane 使用内置的 `openclaw config set` 命令配方配置基线,在 `summary.json` 中记录配方步骤,并在 Gateway 网关启动后探测 `/healthz`、`/readyz` 以及 RPC Status。Windows 打包和安装器全新 lane 还会验证已安装的包可以从原始绝对 Windows 路径导入 browser-control override。OpenAI 跨 OS agent-turn 冒烟测试在设置时默认使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用 `openai/gpt-5.5`,因此安装和 Gateway 网关证明会保持在首选的 GPT-5 测试模型上
### 旧版兼容窗口
Package Acceptance 对已经发布的包有有界的旧版兼容窗口。直到 `2026.4.25` 的包,包括 `2026.4.25-beta.*`,都可以使用兼容路径:
包验收为已发布包设置了有界旧版兼容窗口。直到 `2026.4.25` 的包,包括 `2026.4.25-beta.*`,都可以使用兼容路径:
- `dist/postinstall-inventory.json` 中已知的私有 QA 条目可能指向 tarball 中省略的文件;
- 当包未暴露 `gateway install --wrapper` 标志时,`doctor-switch` 可能会跳过其持久化子用例;
- `update-channel-switch`能会从 tarball 派生的伪 git fixture 中修剪缺失的 `pnpm.patchedDependencies`,并可能记录缺失的已持久化 `update.channel`
- 插件冒烟测试可读取旧版安装记录位置,或接受缺失的 marketplace 安装记录持久化;
- `plugin-update`允许配置元数据迁移,同时仍要求安装记录和不重新安装行为保持不变。
- `dist/postinstall-inventory.json` 中已知的私有 QA 条目可以指向 tarball 省略的文件;
- 当包没有公开 `gateway install --wrapper` 标志时,`doctor-switch` 可以跳过其持久化子用例;
- `update-channel-switch`以从 tarball 派生的假 git fixture 中剪除缺失的 `pnpm.patchedDependencies`,并可以记录缺失的持久化 `update.channel`
- 插件冒烟测试可读取旧版安装记录位置,或接受缺失的 marketplace 安装记录持久化;
- `plugin-update`允许配置元数据迁移,同时仍要求安装记录和不重新安装行为保持不变。
已发布的 `2026.4.26` 包也可能针对已经发布的本地构建元数据 stamp 文件给出警告。后续包必须满足现代契约;相同条件会失败,而不是警告或跳过。
已发布的 `2026.4.26` 包也可能对已经发布的本地构建元数据戳文件发出警告。更晚的包必须满足现代契约;相同条件会失败,而不是警告或跳过。
### 示例
@ -244,111 +244,111 @@ gh workflow run package-acceptance.yml \
-f docker_lanes='install-e2e plugin-update'
```
调试失败的 package acceptance 运行时,先查看 `resolve_package` 摘要,确认包来源、版本和 SHA-256。然后检查 `docker_acceptance` 子运行及其 Docker 工件:`.artifacts/docker-tests/**/summary.json`、`failures.json`、lane 日志、阶段计时和重跑命令。优先重跑失败的包 profile 或精确 Docker lanes,而不是重跑完整发布验证。
调试失败的包验收运行时,请从 `resolve_package` 摘要开始,确认包来源、版本和 SHA-256。然后检查 `docker_acceptance` 子运行及其 Docker artifact`.artifacts/docker-tests/**/summary.json`、`failures.json`、lane 日志、阶段耗时和重跑命令。优先重跑失败的包配置文件或精确 Docker lane,而不是重跑完整发布验证。
## 安装冒烟测试
单独的 `Install Smoke` 工作流会通过自己的 `preflight` 作业复用同一个 scope 脚本。它将冒烟覆盖拆分为 `run_fast_install_smoke``run_full_install_smoke`
独立的 `Install Smoke` 工作流通过自己的 `preflight` 作业复用相同的范围脚本。它将冒烟覆盖拆分为 `run_fast_install_smoke``run_full_install_smoke`
- **快速路径** 针对触及 Docker/包表面、内置插件包/manifest 变更,或 Docker 冒烟作业会覆盖的核心插件/渠道/Gateway 网关/插件 SDK 表面的拉取请求运行。仅源代码的内置插件变更、仅测试编辑和仅文档编辑不会占用 Docker worker。快速路径会构建一次根 Dockerfile 镜像,检查 CLI运行 agents delete shared-workspace CLI 冒烟测试,运行容器 gateway-network e2e验证内置 extension build arg并在 240 秒聚合命令超时内运行有界的内置插件 Docker profile每个场景的 Docker 运行分别设上限)。
- **完整路径** 为夜间定时运行、手动调度、workflow-call 发布检查,以及确实触及安装器/包/Docker 表面的拉取请求保留 QR 包安装和安装器 Docker/更新覆盖。在完整模式下install-smoke 会准备或复用一个目标 SHA GHCR 根 Dockerfile 冒烟镜像,然后将 QR 包安装、根 Dockerfile/Gateway 网关冒烟测试、安装器/更新冒烟测试,以及快速内置插件 Docker E2E 作为独立作业运行,这样安装器工作不会等待根镜像冒烟测试完成
- **快速路径**会在 pull request 触及 Docker/包表面、内置插件包/清单变更,或 Docker 冒烟作业会覆盖的核心插件/渠道/Gateway 网关/插件 SDK 表面时运行。仅源代码的内置插件变更、仅测试编辑和仅文档编辑不会占用 Docker worker。快速路径会构建一次根 Dockerfile 镜像,检查 CLI运行 agents delete shared-workspace CLI 冒烟测试,运行容器 gateway-network e2e验证内置 extension 构建参数,并在 240 秒聚合命令超时下运行有界内置插件 Docker 配置文件(每个场景的 Docker 运行分别设置上限)。
- **完整路径**会为夜间计划运行、手动分发、workflow-call 发布检查,以及真正触及安装器/包/Docker 表面的 pull request 保留 QR 包安装和安装器 Docker/更新覆盖。在完整模式中install-smoke 会准备或复用一个目标 SHA GHCR 根 Dockerfile 冒烟镜像,然后将 QR 包安装、根 Dockerfile/Gateway 网关冒烟测试、安装器/更新冒烟测试,以及快速内置插件 Docker E2E 作为单独作业运行,这样安装器工作就不会被根镜像冒烟测试阻塞
`main` 推送(包括合并提交)不会强制完整路径;当变更范围逻辑会在推送上请求完整覆盖时,工作流会保留快速 Docker 冒烟测试,并将完整安装冒烟测试留给夜间或发布验证。
`main` 推送(包括合并提交)不会强制使用完整路径;当变更范围逻辑会在推送上请求完整覆盖时,工作流会保留快速 Docker 冒烟测试,并将完整安装冒烟测试留给夜间或发布验证。
慢速 Bun 全局安装 image-provider 冒烟测试由 `run_bun_global_install_smoke` 单独控制。它会在夜间计划和发布检查工作流中运行,手动 `Install Smoke` 调度也可以选择启用它,但拉取请求和 `main` 推送不会运行。QR 和安装器 Docker 测试保留各自聚焦安装的 Dockerfile。
较慢的 Bun 全局安装 image-provider 冒烟测试由 `run_bun_global_install_smoke` 单独控制。它会在夜间计划和发布检查工作流中运行,手动 `Install Smoke` 分发也可以选择加入它,但 pull request 和 `main` 推送不会运行它。QR 和安装器 Docker 测试保留各自面向安装的 Dockerfile。
## 本地 Docker E2E
`pnpm test:docker:all` 会预构建一个共享实时测试镜像,将 OpenClaw 打包一次为 npm tarball并构建两个共享 `scripts/e2e/Dockerfile` 镜像:
`pnpm test:docker:all` 会预构建一个共享实时测试镜像,将 OpenClaw 打包一次为 npm tarball并构建两个共享 `scripts/e2e/Dockerfile` 镜像:
- 用于安装器/更新/插件依赖 lanes 的裸 Node/Git runner
- 将同一个 tarball 安装到 `/app` 的功能镜像,用于正常功能 lanes
- 用于安装器/更新/插件依赖 lane 的裸 Node/Git runner
- 将同 tarball 安装到 `/app` 的功能镜像,用于正常功能 lane。
Docker lane 定义位于 `scripts/lib/docker-e2e-scenarios.mjs`planner 逻辑位于 `scripts/lib/docker-e2e-plan.mjs`runner 只执行选计划。调度器使用 `OPENCLAW_DOCKER_E2E_BARE_IMAGE``OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE` 为每个 lane 选择镜像,然后使用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行 lanes
Docker lane 定义位于 `scripts/lib/docker-e2e-scenarios.mjs`规划器逻辑位于 `scripts/lib/docker-e2e-plan.mjs`runner 只执行选计划。调度器使用 `OPENCLAW_DOCKER_E2E_BARE_IMAGE``OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE` 为每个 lane 选择镜像,然后通过 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行 lane。
### 可调
### 可调参数
| 变量 | 默认值 | 用途 |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | 普通通道的主池槽位数。 |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | 对提供商敏感的尾池槽位数。 |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | 并发实时通道上限,避免提供商限流。 |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | 并发 npm install 通道上限。 |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | 并发多服务通道上限。 |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | 通道启动之间的错峰间隔,用于避免 Docker daemon 创建风暴;设为 `0` 表示不做错峰。 |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | 每通道兜底超时120 分钟);选定的实时/尾部通道使用更严格的上限。 |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | 未设置 | `1` 会打印调度器计划而不运行通道。 |
| `OPENCLAW_DOCKER_ALL_LANES` | 未设置 | 逗号分隔的精确通道列表;跳过清理烟测,以便智能体复现单个失败通道。 |
| 变量 | 默认值 | 用途 |
| -------------------------------------- | ------ | ---------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | 普通执行通道的主池槽位数。 |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | 对提供商敏感的尾池槽位数。 |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | 并发实时执行通道上限,避免提供商限流。 |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | 并发 npm install 执行通道上限。 |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | 并发多服务执行通道上限。 |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | 执行通道启动之间的错峰间隔,用于避免 Docker 守护进程创建风暴;设置为 `0` 表示不使用错峰。 |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | 每个执行通道兜底超时120 分钟);选定的实时/尾部执行通道使用更严格的上限。 |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | 未设置 | `1` 会打印调度器计划而不运行执行通道。 |
| `OPENCLAW_DOCKER_ALL_LANES` | 未设置 | 逗号分隔的精确执行通道列表;跳过清理烟测,以便智能体复现单个失败的执行通道。 |
比其有效上限更重的通道仍可从空池启动然后独占运行直到释放容量。local 聚合流程会预检 Docker移除陈旧的 OpenClaw E2E 容器,输出活跃通道状态,持久化通道耗时以便按最长优先排序,并默认在第一次失败后停止调度新的池化通道。
比其有效上限更重的执行通道仍可从空池启动,然后独占运行直到释放容量。本地聚合流程会预检 Docker移除陈旧的 OpenClaw E2E 容器,输出活动执行通道 Status持久化执行通道耗时以便按最长优先排序并且默认在第一次失败后停止调度新的池化执行通道。
### 可复用实时/E2E 工作流
### 可复用实时/E2E 工作流
可复用实时/E2E 工作流会询问 `scripts/test-docker-all.mjs --plan-json` 需要哪些包、镜像类型、实时镜像、通道和凭据覆盖。随后 `scripts/docker-e2e.mjs` 会把该计划转换成 GitHub 输出和摘要。它会通过 `scripts/package-openclaw-for-docker.mjs` 打包 OpenClaw下载当前运行的包构件或从 `package_artifact_run_id` 下载包构件;校验 tarball 清单;当计划需要安装包的通道时,通过 Blacksmith 的 Docker 层缓存构建并推送带包摘要标签的 bare/functional GHCR Docker E2E 镜像;并复用提供的 `docker_e2e_bare_image`/`docker_e2e_functional_image` 输入或已有包摘要镜像而不是重新构建。Docker 镜像拉取会使用有界的每次尝试 180 秒超时进行重试,因此卡住的 registry/cache 流会快速重试,而不是消耗 CI 关键路径的大部分时间。
可复用实时/E2E 工作流会询问 `scripts/test-docker-all.mjs --plan-json` 需要哪些包、镜像种类、实时镜像、执行通道和凭证覆盖范围。随后 `scripts/docker-e2e.mjs` 会把该计划转换为 GitHub 输出和摘要。它会通过 `scripts/package-openclaw-for-docker.mjs` 打包 OpenClaw下载当前运行的包构件或从 `package_artifact_run_id` 下载包构件;校验 tarball 清单;当计划需要安装包的执行通道时,通过 Blacksmith 的 Docker 层缓存构建并推送带包摘要标签的 bare/functional GHCR Docker E2E 镜像;并且在提供了 `docker_e2e_bare_image`/`docker_e2e_functional_image` 输入或已有包摘要镜像时复用它们而不是重新构建。Docker 镜像拉取会使用每次尝试 180 秒的有界超时进行重试,因此卡住的 registry/cache 流会快速重试,而不是消耗 CI 关键路径的大部分时间。
### 发布路径分块
发布 Docker 覆盖会使用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行更小的分块作业,因此每个分块只拉取它需要的镜像类型,并通过同一个加权调度器执行多个通道:
发布 Docker 覆盖使用更小的分块任务运行,并设置 `OPENCLAW_SKIP_DOCKER_BUILD=1`,这样每个分块只拉取它需要的镜像种类,并通过同一个加权调度器执行多个执行通道:
- `OPENCLAW_DOCKER_ALL_PROFILE=release-path`
- `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h`
当前发布 Docker 分块包括 `core`、`package-update-openai`、`package-update-anthropic`、`package-update-core`、`plugins-runtime-plugins`、`plugins-runtime-services`,以及从 `plugins-runtime-install-a``plugins-runtime-install-h`。`plugins-runtime-core`、`plugins-runtime` 和 `plugins-integrations` 仍然是聚合插件/运行时别名。`install-e2e` 通道别名仍是两个提供商安装器通道的聚合手动重跑别名。
当前发布 Docker 分块包括 `core`、`package-update-openai`、`package-update-anthropic`、`package-update-core`、`plugins-runtime-plugins`、`plugins-runtime-services`,以及从 `plugins-runtime-install-a``plugins-runtime-install-h`。`plugins-runtime-core`、`plugins-runtime` 和 `plugins-integrations` 仍然是聚合插件/运行时别名。`install-e2e` 执行通道别名仍是两个提供商安装器执行通道的聚合手动重跑别名。
当完整 release-path 覆盖请求 OpenWebUI 时OpenWebUI 会合并到 `plugins-runtime-services` 中,并且仅为只调度 OpenWebUI 的场景保留独立的 `openwebui` 分块。内置渠道更新通道会对临时 npm 网络失败重试一次。
当完整发布路径覆盖请求 OpenWebUI 时OpenWebUI 会折入 `plugins-runtime-services`,并且仅在只调度 OpenWebUI 时保留独立的 `openwebui` 分块。内置渠道更新执行通道会对临时 npm 网络失败重试一次。
每个分块都会上传 `.artifacts/docker-tests/`,其中包含通道日志、耗时、`summary.json`、`failures.json`、阶段耗时、调度器计划 JSON、慢通道表以及每通道重跑命令。工作流 `docker_lanes` 输入会针对准备好的镜像运行选定通道,而不是运行分块作业,这会把失败通道调试限定在一个目标 Docker 作业内,并为该次运行准备、下载或复用包构件;如果选定通道是实时 Docker 通道,目标作业会为该次重跑在本地构建实时测试镜像。生成的每通道 GitHub 重跑命令会在这些值存在时包含 `package_artifact_run_id`、`package_artifact_name` 和准备好的镜像输入,因此失败通道可以复用失败运行中的精确包和镜像。
每个分块都会上传 `.artifacts/docker-tests/`,其中包含执行通道日志、耗时、`summary.json`、`failures.json`、阶段耗时、调度器计划 JSON、慢执行通道表,以及每个执行通道重跑命令。工作流 `docker_lanes` 输入会针对已准备好的镜像运行选定执行通道,而不是运行分块任务,这样可以把失败执行通道的调试限制在一个有针对性的 Docker 任务中,并为该次运行准备、下载或复用包构件;如果选定执行通道是实时 Docker 执行通道,则有针对性的任务会为该次重跑在本地构建实时测试镜像。生成的每个执行通道 GitHub 重跑命令会在这些值存在时包含 `package_artifact_run_id`、`package_artifact_name` 和准备好的镜像输入,因此失败的执行通道可以复用失败运行中的精确包和镜像。
```bash
pnpm test:docker:rerun <run-id> # 下载 Docker 构件并打印组合/每通道的目标重跑命令
pnpm test:docker:timings <summary> # 慢通道和阶段关键路径摘要
pnpm test:docker:rerun <run-id> # download Docker artifacts and print combined/per-lane targeted rerun commands
pnpm test:docker:timings <summary> # slow-lane and phase critical-path summaries
```
定时实时/E2E 工作流每天运行完整的 release-path Docker 套件。
计划的实时/E2E 工作流每天运行完整发布路径 Docker 套件。
## 插件预发布
`Plugin Prerelease`成本更高的产品/包覆盖,因此它是由 `Full Release Validation` 或显式操作员调度的独立工作流。普通 pull request、`main` 推送和独立手动 CI 调度会保持该套件关闭。它会在八个插件工作器之间平衡内置插件测试;这些插件分片作业每次最多运行两个插件配置组,每组使用一个 Vitest worker 和更大的 Node 堆,因此导入繁重的插件批次不会创建额外的 CI 作业。仅发布的 Docker 预发布路径会把目标 Docker 通道分成小组批处理,以避免为一到三分钟的作业预留数十个 runner。
`Plugin Prerelease`更昂贵的产品/包覆盖,因此它是由 `Full Release Validation` 或显式操作员调度的独立工作流。普通拉取请求、`main` 推送和单独的手动 CI 调度都会关闭该套件。它会在八个扩展 worker 之间平衡内置插件测试;这些扩展分片任务一次最多运行两个插件配置组,每组一个 Vitest worker并使用更大的 Node 堆,因此导入密集型插件批次不会创建额外的 CI 任务。仅用于发布的 Docker 预发布路径会以小组批处理有针对性的 Docker 执行通道,避免为一到三分钟的任务预留几十个 runner。
## QA Lab
QA Lab 有位于主智能作用域工作流之外的专用 CI 通道。
QA Lab 在主智能作用域工作流之外有专用 CI 执行通道。
- `Parity gate` 工作流会在匹配的 PR 更和手动调度时运行;它会构建私有 QA 运行时,并比较模拟 GPT-5.5 Opus 4.6 智能体包。
- `QA-Lab - All Lanes` 工作流每晚在 `main` 上运行,也可手动调度;它会把模拟一致性门、实时 Matrix 通道,以及实时 Telegram 和 Discord 通道作为并行作业展开。实时作业使用 `qa-live-shared` 环境Telegram/Discord 使用 Convex leases。
- `Parity gate` 工作流会在匹配的 PR 更和手动调度时运行;它会构建私有 QA 运行时,并比较模拟 GPT-5.5 Opus 4.6 智能体包。
- `QA-Lab - All Lanes` 工作流每晚在 `main` 上运行,也可手动调度;它会将模拟 parity gate、实时 Matrix 执行通道,以及实时 Telegram 和 Discord 执行通道展开为并行任务。实时任务使用 `qa-live-shared` 环境Telegram/Discord 使用 Convex leases。
发布检查会使用确定性的模拟提供商和模拟限定模型(`mock-openai/gpt-5.5` 与 `mock-openai/gpt-5.5-alt`)运行 Matrix 与 Telegram 实时传输通道,因此渠道契约会与实时模型延迟和普通提供商插件启动隔离。实时传输 Gateway 网关会禁用记忆搜索,因为 QA 一致性会单独覆盖记忆行为;提供商连通性由独立的实时模型、原生提供商和 Docker 提供商套件覆盖。
发布检查会使用确定性模拟提供商和符合模拟要求的模型(`mock-openai/gpt-5.5` 与 `mock-openai/gpt-5.5-alt`)运行 Matrix 与 Telegram 实时传输执行通道,从而将渠道契约与实时模型延迟和普通提供商插件启动隔离。实时传输 Gateway 网关会禁用记忆搜索,因为 QA parity 会单独覆盖记忆行为;提供商连接性由单独的实时模型、原生提供商和 Docker 提供商套件覆盖。
Matrix 对定时和发布门使用 `--profile fast`仅在检出的 CLI 支持时添加 `--fail-fast`。CLI 默认值和手动工作流输入仍 `all`;手动 `matrix_profile=all` 调度始终会把完整 Matrix 覆盖分片为 `transport`、`media`、`e2ee-smoke`、`e2ee-deep` 和 `e2ee-cli` 作业
Matrix 在计划任务和发布门禁中使用 `--profile fast`,并且仅在检出的 CLI 支持时添加 `--fail-fast`。CLI 默认值和手动工作流输入仍然是 `all`;手动 `matrix_profile=all` 调度始终会把完整 Matrix 覆盖分片为 `transport`、`media`、`e2ee-smoke`、`e2ee-deep` 和 `e2ee-cli` 任务
`OpenClaw Release Checks` 还会在发布批准前运行发布关键的 QA Lab 通道;其 QA 一致性门会把候选包和基线包作为并行通道作业运行,然后把两个构件下载到一个小型报告作业中,用于最终一致性比较。
`OpenClaw Release Checks` 也会在发布批准前运行发布关键的 QA Lab 执行通道;它的 QA parity gate 会把候选包和基线包作为并行执行通道任务运行,然后把两个构件下载到一个小型报告任务中,用于最终 parity 比较。
不要把 PR 落地路径置于 `Parity gate` 之后,除非更改确实触及 QA 运行时、模型包一致性或一致性工作流拥有的表面。对于普通渠道、配置、文档或单元测试修复,应将其视为可选信号,并遵循有作用域的 CI/检查证据。
除非变更确实触及 QA 运行时、模型包 parity或 parity 工作流拥有的表面,否则不要把 PR 落地路径置于 `Parity gate` 之后。对于普通渠道、配置、文档或单元测试修复,将其视为可选信号,并遵循作用域内 CI/检查证据。
## CodeQL
`CodeQL` 工作流有意作为窄范围的第一轮安全扫描器,而不是完整仓库扫描。每日、手动和非草稿 pull request 保护运行会扫描 Actions 工作流代码,以及最高风险的 JavaScript/TypeScript 表面,并使用高置信度安全查询,过滤到 high/critical `security-severity`
`CodeQL` 工作流有意作为窄的第一轮安全扫描器,而不是完整仓库扫描。每日、手动和非草稿拉取请求守护运行会扫描 Actions 工作流代码,以及最高风险的 JavaScript/TypeScript 表面,并使用过滤到高/严重 `security-severity` 的高置信安全查询
pull request 保护保持轻量:它只会针对 `.github/actions`、`.github/codeql`、`.github/workflows`、`packages` 或 `src`的更改启动,并运行与定时工作流相同的高置信度安全矩阵。Android 和 macOS CodeQL 不包含在 PR 默认项中。
拉取请求守护保持轻量:它只会在 `.github/actions`、`.github/codeql`、`.github/workflows`、`packages` 或 `src`发生变更时启动,并运行与计划工作流相同的高置信安全矩阵。Android 和 macOS CodeQL 不包含在 PR 默认项中。
### 安全类别
| 类别 | 表面 |
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-security-high/core-auth-secrets` | 认证、密钥、沙箱、cron 和 gateway 基线 |
| `/codeql-security-high/channel-runtime-boundary` | 核心渠道实现契约,以及渠道插件运行时、gateway、插件 SDK、密钥、审计触点 |
| `/codeql-security-high/network-ssrf-boundary` | 核心 SSRF、IP 解析、网络保护、web-fetch 和插件 SDK SSRF 策略表面 |
| `/codeql-security-high/mcp-process-tool-boundary` | MCP 服务器、进程执行辅助工具、出站交付和智能体工具执行门 |
| `/codeql-security-high/plugin-trust-boundary` | 插件安装、加载器、manifest、registry、包管理器安装、source-loading 和插件 SDK 包契约信任表面 |
| `/codeql-security-high/core-auth-secrets` | 认证、密钥、沙箱、cron 和 Gateway 网关基线 |
| `/codeql-security-high/channel-runtime-boundary` | 核心渠道实现契约,以及渠道插件运行时、Gateway 网关、插件 SDK、密钥、审计触点 |
| `/codeql-security-high/network-ssrf-boundary` | 核心 SSRF、IP 解析、网络防护、web-fetch以及插件 SDK SSRF 策略表面 |
| `/codeql-security-high/mcp-process-tool-boundary` | MCP 服务器、进程执行 helper、出站投递以及智能体工具执行门禁 |
| `/codeql-security-high/plugin-trust-boundary` | 插件安装、加载器、manifest、registry、包管理器安装、源码加载,以及插件 SDK 包契约信任表面 |
### 平台特定安全分片
- `CodeQL Android Critical Security`定时 Android 安全分片。在工作流完整性检查接受的最小 Blacksmith Linux runner 上为 CodeQL 手动构建 Android 应用。上传到 `/codeql-critical-security/android` 下。
- `CodeQL macOS Critical Security` — 每周/手动 macOS 安全分片。在 Blacksmith macOS 上为 CodeQL 手动构建 macOS 应用,从上传的 SARIF 中过滤掉依赖构建结果,并上传到 `/codeql-critical-security/macos` 下。由于 macOS 构建即使干净时也主导运行时间,因此保留在每日默认项之外
- `CodeQL Android Critical Security`计划运行的 Android 安全分片。在 workflow sanity 接受的最小 Blacksmith Linux runner 上为 CodeQL 手动构建 Android 应用。上传到 `/codeql-critical-security/android` 下。
- `CodeQL macOS Critical Security` — 每周/手动 macOS 安全分片。在 Blacksmith macOS 上为 CodeQL 手动构建 macOS 应用,从上传的 SARIF 中过滤掉依赖构建结果,并上传到 `/codeql-critical-security/macos` 下。它保留在每日默认项之外因为即使干净时macOS 构建也会主导运行时间
### 关键质量类别
`CodeQL Critical Quality` 是对应的非安全分片。它只在较小的 Blacksmith Linux runner 上,对窄范围高价值表面运行 error-severity、非安全 JavaScript/TypeScript 质量查询。其 pull request 保护有意小于定时配置:非草稿 PR 只会为智能体命令/模型/工具执行和回复调度代码、配置 schema/迁移/IO 代码、认证/密钥/沙箱/安全代码、核心渠道和内置渠道插件运行时、gateway 协议/服务器方法、记忆运行时/SDK glue、MCP/进程/出站交付、提供商运行时/模型目录、会话诊断/交付队列、插件加载器、插件 SDK/包契约,或插件 SDK 回复运行时更,运行匹配的 `agent-runtime-boundary`、`config-boundary`、`core-auth-secrets`、`channel-runtime-boundary`、`gateway-runtime-boundary`、`memory-runtime-boundary`、`mcp-process-runtime-boundary`、`provider-runtime-boundary`、`session-diagnostics-boundary`、`plugin-boundary`、`plugin-sdk-package-contract` 和 `plugin-sdk-reply-runtime` 分片。CodeQL 配置和质量工作流更会运行全部十二个 PR 质量分片。
`CodeQL Critical Quality` 是对应的非安全分片。它只在较小的 Blacksmith Linux runner 上,对狭窄的高价值表面运行错误严重级别、非安全的 JavaScript/TypeScript 质量查询。它的拉取请求守护刻意小于计划配置文件:非草稿 PR 只会针对智能体命令/模型/工具执行和回复分发代码、配置 schema/迁移/IO 代码、认证/密钥/沙箱/安全代码、核心渠道和内置渠道插件运行时、Gateway 网关协议/服务器方法、记忆运行时/SDK 胶水、MCP/进程/出站投递、提供商运行时/模型目录、会话诊断/投递队列、插件加载器、插件 SDK/包契约,或插件 SDK 回复运行时更,运行匹配的 `agent-runtime-boundary`、`config-boundary`、`core-auth-secrets`、`channel-runtime-boundary`、`gateway-runtime-boundary`、`memory-runtime-boundary`、`mcp-process-runtime-boundary`、`provider-runtime-boundary`、`session-diagnostics-boundary`、`plugin-boundary`、`plugin-sdk-package-contract` 和 `plugin-sdk-reply-runtime` 分片。CodeQL 配置和质量工作流更会运行全部十二个 PR 质量分片。
手动调度接受:
@ -356,40 +356,40 @@ pull request 保护保持轻量:它只会针对 `.github/actions`、`.github/c
profile=all|agent-runtime-boundary|config-boundary|core-auth-secrets|channel-runtime-boundary|gateway-runtime-boundary|memory-runtime-boundary|mcp-process-runtime-boundary|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary
```
窄配置是用于单独运行一个质量分片的教学/迭代钩子。
窄配置文件是用于单独运行一个质量分片的教学/迭代钩子。
| 类别 | 范围 |
| 类别 | 涉及范围 |
| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | 凭证、机密、沙箱、cron 和 Gateway 网关安全边界代码 |
| `/codeql-critical-quality/config-boundary` | 配置 schema、迁移、规范化和 IO 契约 |
| `/codeql-critical-quality/gateway-runtime-boundary` | Gateway 网关协议 schema 和服务器方法契约 |
| `/codeql-critical-quality/core-auth-secrets` | 认证、密钥、沙箱、cron 和 Gateway 网关安全边界代码 |
| `/codeql-critical-quality/config-boundary` | 配置 schema、迁移、规范化和 IO 契约 |
| `/codeql-critical-quality/gateway-runtime-boundary` | Gateway 网关协议 schema 和服务器方法契约 |
| `/codeql-critical-quality/channel-runtime-boundary` | 核心渠道和内置渠道插件实现契约 |
| `/codeql-critical-quality/agent-runtime-boundary` | 命令执行、模型/提供商分发、自动回复分发和队列,以及 ACP 控制平面运行时契约 |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | MCP 服务器和工具桥、进程监督辅助工具,以及出站投递契约 |
| `/codeql-critical-quality/memory-runtime-boundary` | Memory 宿主 SDK、Memory 运行时 facade、Memory 插件 SDK 别名、Memory 运行时激活胶水代码,以及 Memory doctor 命令 |
| `/codeql-critical-quality/session-diagnostics-boundary` | 回复队列内部机制、会话投递队列、出站会话绑定/投递辅助工具、诊断事件/日志包界面,以及会话 doctor CLI 契约 |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | 插件 SDK 入站回复分发、回复载荷/分块/运行时辅助工具、渠道回复选项、投递队列,以及会话/线程绑定辅助工具 |
| `/codeql-critical-quality/provider-runtime-boundary` | 模型目录规范化、提供商凭证和设备发现、提供商运行时注册、提供商默认值/目录,以及 web/搜索/fetch/embedding 注册表 |
| `/codeql-critical-quality/ui-control-plane` | 控制 UI bootstrap、本地持久化、Gateway 网关控制流,以及任务控制平面运行时契约 |
| `/codeql-critical-quality/web-media-runtime-boundary` | 核心 web fetch/搜索、媒体 IO、媒体理解、图像生成和媒体生成运行时契约 |
| `/codeql-critical-quality/plugin-boundary` | 加载器、注册表、公共界面和插件 SDK 入口点契约 |
| `/codeql-critical-quality/plugin-sdk-package-contract` | 已发布包侧插件 SDK 源码和插件包契约辅助工具 |
| `/codeql-critical-quality/agent-runtime-boundary` | 命令执行、模型/提供商分发、自动回复分发和队列,以及 ACP 控制平面运行时契约 |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | MCP 服务器和工具桥、进程监督辅助工具,以及出站投递契约 |
| `/codeql-critical-quality/memory-runtime-boundary` | 记忆宿主 SDK、记忆运行时门面、记忆插件 SDK 别名、记忆运行时激活胶合代码,以及记忆 Doctor 命令 |
| `/codeql-critical-quality/session-diagnostics-boundary` | 回复队列内部机制、会话投递队列、出站会话绑定/投递辅助工具、诊断事件/日志包表面,以及会话 Doctor CLI 契约 |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | 插件 SDK 入站回复分发、回复载荷/分块/运行时辅助工具、渠道回复选项、投递队列,以及会话/线程绑定辅助工具 |
| `/codeql-critical-quality/provider-runtime-boundary` | 模型目录规范化、提供商认证和设备发现、提供商运行时注册、提供商默认值/目录,以及 Web/搜索/获取/嵌入注册表 |
| `/codeql-critical-quality/ui-control-plane` | 控制 UI 引导、本地持久化、Gateway 网关控制流,以及任务控制平面运行时契约 |
| `/codeql-critical-quality/web-media-runtime-boundary` | 核心 Web 获取/搜索、媒体 IO、媒体理解、图像生成以及媒体生成运行时契约 |
| `/codeql-critical-quality/plugin-boundary` | 加载器、注册表、公共表面,以及插件 SDK 入口点契约 |
| `/codeql-critical-quality/plugin-sdk-package-contract` | 已发布包侧插件 SDK 源码和插件包契约辅助工具 |
质量与安全保持分离,这样质量发现就可以被排期、度量、禁用或扩展,而不会遮蔽安全信号。只有在窄配置文件具备稳定运行时和信号之后,才应将 Swift、Python 和内置插件 CodeQL 扩展作为有范围或分片的后续工作加回。
质量与安全保持分离,这样质量发现项可以被排期、度量、禁用或扩展,而不会掩盖安全信号。只有在窄配置文件具备稳定运行时和信号之后,才应将 Swift、Python 和内置插件 CodeQL 扩展作为有范围或分片的后续工作加回。
## 维护工作流
### Docs Agent
`Docs Agent` 工作流是一个事件驱动的 Codex 维护通道,用于让现有文档与最近落地的更保持一致。它没有纯定时计划:`main` 上一次成功的非机器人 push CI 运行可以触发它,也可以通过手动 dispatch 直接运行它。当 `main` 已经前进,或过去一小时内已创建过另一个未跳过的 Docs Agent 运行时workflow-run 调用会跳过。运行时,它会审查从上一个未跳过的 Docs Agent 源 SHA 到当前 `main` 的提交范围,因此每小时一次运行可以覆盖自上次文档检查以来累计的所有 main 变更
`Docs Agent` 工作流是一个事件驱动的 Codex 维护通道,用于让现有文档与最近落地的更保持一致。它没有纯定时计划:`main` 上成功的非 bot 推送 CI 运行可以触发它,手动调度也可以直接运行它。当 `main` 已经前进,或过去一小时内创建了另一个未跳过的 Docs Agent 运行时workflow-run 调用会跳过。运行时,它会审查从上一个未跳过的 Docs Agent 源 SHA 到当前 `main` 的提交范围,因此每小时运行一次即可覆盖自上次文档检查以来累积的所有 main 更改
### Test Performance Agent
`Test Performance Agent` 工作流是一个事件驱动的 Codex 维护通道,用于处理慢测试。它没有纯定时计划:`main` 上一次成功的非机器人 push CI 运行可以触发它,但如果当天 UTC 已经有另一个 workflow-run 调用运行过或正在运行,它会跳过。手动 dispatch 会绕过这个每日活动门禁。该通道会生成一份完整套件分组 Vitest 性能报告,让 Codex 只做小范围且保持覆盖率的测试性能修复,而不是大规模重构,然后重新运行完整套件报告,并拒绝会降低通过基线测试数量的更。如果基线存在失败测试Codex 只能修复明显失败,并且 agent 之后的完整套件报告必须通过,才能提交任何内容。当 `main` 在机器人 push 落地前前进时,该通道会 rebase 已验证补丁,重新运行 `pnpm check:changed`,并重试 push有冲突的陈旧补丁会被跳过。它使用 GitHub 托管的 Ubuntu因此 Codex action 可以保持与 docs agent 相同的 drop-sudo 安全姿态。
`Test Performance Agent` 工作流是一个事件驱动的 Codex 维护通道,用于处理慢测试。它没有纯定时计划:`main` 上成功的非 bot 推送 CI 运行可以触发它,但如果当天 UTC 已经有另一个 workflow-run 调用运行过或正在运行,它会跳过。手动调度会绕过该每日活动门槛。该通道会构建完整套件分组 Vitest 性能报告,让 Codex 只做小范围且保持覆盖率的测试性能修复,而不是大规模重构;随后重新运行完整套件报告,并拒绝会降低通过基线测试数量的更。如果基线存在失败测试Codex 只能修复明显失败,并且 agent 之后的完整套件报告必须通过,才会提交任何内容。当 `main` 在 bot 推送落地前前进时,该通道会 rebase 已验证补丁,重新运行 `pnpm check:changed`,并重试推送;有冲突的过期补丁会被跳过。它使用 GitHub 托管的 Ubuntu因此 Codex action 可以与文档 agent 保持相同的 drop-sudo 安全姿态。
### 合并后的重复 PR
`Duplicate PRs After Merge` 工作流是一个手动维护者工作流,用于落地后的重复项清理。默认是 dry-run且只有在 `apply=true` 时才会关闭显式列出的 PR。在修改 GitHub 之前,它会验证已落地 PR 已合并,并且每个重复项都有共享的引用 issue 或重叠的变更 hunk。
`Duplicate PRs After Merge` 工作流是一个手动维护者工作流,用于落地后的重复项清理。它默认 dry-run并且仅在 `apply=true` 时关闭显式列出的 PR。在变更 GitHub 之前,它会验证已落地 PR 已合并,并且每个重复项要么共享引用的 issue要么有重叠的变更 hunk。
```bash
gh workflow run duplicate-after-merge.yml \
@ -400,25 +400,25 @@ gh workflow run duplicate-after-merge.yml \
## 本地检查门禁和变更路由
本地 changed-lane 逻辑位于 `scripts/changed-lanes.mjs`,并由 `scripts/check-changed.mjs` 执行。这个本地检查门禁在架构边界上比广泛的 CI 平台范围更严格:
本地变更通道逻辑位于 `scripts/changed-lanes.mjs`,并由 `scripts/check-changed.mjs` 执行。与宽泛 CI 平台范围相比,该本地检查门禁对架构边界更严格:
- 核心生产变更会运行核心生产和核心测试类型检查,加上核心 lint/guard
- 仅核心测试变更只运行核心测试类型检查,加上核心 lint
- 插件生产变更会运行插件生产和插件测试类型检查,加上插件 lint
- 仅插件测试变更会运行插件测试类型检查,加上插件 lint
- 公共插件 SDK 或插件契约变更会扩展到插件类型检查因为插件依赖这些核心契约Vitest 插件扫描仍然是显式测试工作);
- 仅发布元数据版本 bump 会运行有针对性的版本/配置/root-dependency 检查;
- 未知的 root/config 变更会故障安全地进入所有检查通道。
- 核心生产更改运行核心生产和核心测试 typecheck,加上核心 lint/guard
- 仅核心测试更改只运行核心测试 typecheck,加上核心 lint
- 插件生产更改运行插件生产和插件测试 typecheck,加上插件 lint
- 仅插件测试更改运行插件测试 typecheck,加上插件 lint
- 公共插件 SDK 或插件契约更改会扩展到插件 typecheck因为插件依赖这些核心契约Vitest 插件扫查仍然是显式测试工作);
- 仅发布元数据的版本号 bump 运行定向版本/配置/根依赖检查;
- 未知根目录/配置更改会安全失败到所有检查通道。
本地 changed-test 路由位于 `scripts/test-projects.test-support.mjs`,并且有意比 `check:changed`便宜:直接测试编辑运行自身,源码编辑优先使用显式映射,然后是 sibling 测试和 import-graph 依赖项。共享 group-room 投递配置是显式映射之一:对 group 可见回复配置、源回复投递模式或 message-tool 系统提示词的更,会通过核心回复测试加上 Discord 和 Slack 投递回归,因此共享默认值变更会在第一次 PR push 前失败。只有当变更覆盖整个 harness导致廉价映射集无法作为可信代理时,才使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`
本地变更测试路由位于 `scripts/test-projects.test-support.mjs`,并且有意比 `check:changed`低成本:直接测试编辑会运行自身,源码编辑优先使用显式映射,然后是同级测试和导入图依赖项。共享 group-room 投递配置是显式映射之一:对群组可见回复配置、来源回复投递模式或 message-tool 系统提示词的更,会通过核心回复测试加上 Discord 和 Slack 投递回归测试,因此共享默认值更改会在首次 PR 推送前失败。只有当更改影响整个 harness以至于低成本映射集合不是可信代理时,才使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`
## Testbox 验证
从仓库根目录运行 Testbox并优先为广泛证明使用新预热的 box。在一个被复用、已过期或刚报告异常大同步的 box 上花时间运行慢门禁之前,先在 box 内运行 `pnpm testbox:sanity`
从仓库根目录运行 Testbox并优先为宽泛证明使用新预热的 box。在把慢门禁花到一个被复用、已过期或刚报告异常大同步的 box 上之前,先在 box 内运行 `pnpm testbox:sanity`
所需根文件(例`pnpm-lock.yaml`)消失,或 `git status --short` 显示至少 200 个已跟踪删除时,完整性检查会快速失败。这通常意味着远程同步状态不是 PR 的可信副本;停止该 box并预热一个新的而不是调试产品测试失败。对于有意的大删除 PR请为该完整性运行设置 `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1`
必需的根文件(`pnpm-lock.yaml`)消失,或 `git status --short` 显示至少 200 个已跟踪删除时,完整性检查会快速失败。这通常意味着远程同步状态不是 PR 的可信副本;应停止该 box 并预热一个新的,而不是调试产品测试失败。对于有意的大规模删除 PR在该完整性运行中设置 `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1`
`pnpm testbox:run` 还会终止在同步阶段停留超过五分钟且没有同步后输出的本地 Blacksmith CLI 调用。设置 `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` 可禁用该保护,或者为异常大的本地 diff 使用更大的毫秒值。
`pnpm testbox:run` 也会终止本地 Blacksmith CLI 调用:如果它在同步阶段停留超过五分钟且没有同步后输出。设置 `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` 可禁用该防护,或为异常大的本地 diff 使用更大的毫秒值。
当 Blacksmith 不可用或更适合使用自有云容量时Crabbox 是仓库自有的第二条远程 box Linux 证明路径。预热一个 box通过项目工作流 hydrate 它,然后通过 Crabbox CLI 运行命令:
@ -429,7 +429,7 @@ pnpm crabbox:run -- --id <cbx_id> --shell "OPENCLAW_TESTBOX=1 pnpm check:changed
pnpm crabbox:stop -- <cbx_id>
```
`.crabbox.yaml` 负责提供商、同步和 GitHub Actions hydrate 默认值。它会排除本地 `.git`,这样 hydrate 后的 Actions checkout 会保留自己的远程 Git 元数据,而不是同步维护者本地 remotes 和 object stores它还会排除绝不应传输的本地运行时/构建产物。`.github/workflows/crabbox-hydrate.yml` 负责 checkout、Node/pnpm 设置、`origin/main` fetch以及后续 `crabbox run --id <cbx_id>` 命令所 source 的非机密环境交接。
`.crabbox.yaml` 负责提供商、同步和 GitHub Actions hydrate 默认值。它排除本地 `.git`,因此 hydrate 后的 Actions checkout 会保留自身的远程 Git 元数据,而不是同步维护者本地的 remote 和对象存储;它还排除永远不应传输的本地运行时/构建产物。`.github/workflows/crabbox-hydrate.yml` 负责 checkout、Node/pnpm 设置、`origin/main` 获取,以及后续 `crabbox run --id <cbx_id>` 命令会 source 的非密钥环境交接。
## 相关

View File

@ -1,157 +1,151 @@
---
read_when:
- 正在查找公发布渠道定义
- 运行发布验证或软件包验收
- 正在查找公发布渠道定义
- 运行发布验证或包验收
- 查找版本命名和发布节奏
summary: 发布通道、操作员检查清单、验证环境、版本命名和节奏
summary: 发布通道、操作员检查清单、验证环境、版本命名和发布节奏
title: 发布策略
x-i18n:
generated_at: "2026-05-01T22:37:37Z"
generated_at: "2026-05-01T23:10:00Z"
model: gpt-5.5
provider: openai
source_hash: 6ebbb0f42ee5f1ea29eb3133fcef7c829f855f5d668d8b8af373a6e148bb56ee
source_hash: 89274e9cbd5546b718517053e37574ceae53d4031d6ec02a033d250908e93bfd
source_path: reference/RELEASING.md
workflow: 16
---
OpenClaw 有三个公开发布通道:
- stable已打标签的发布,默认发布到 npm `beta`,或在明确请求时发布到 npm `latest`
- beta发布到 npm `beta` 的预发布标签
- stable带标签的发布版本,默认发布到 npm `beta`,或在明确请求时发布到 npm `latest`
- beta预发布标签,发布到 npm `beta`
- dev`main` 的移动头部
## 版本命名
- 稳定发布版本:`YYYY.M.D`
- Git 标签:`vYYYY.M.D`
- 稳定修正发布版本:`YYYY.M.D-N`
- 稳定修正发布版本:`YYYY.M.D-N`
- Git 标签:`vYYYY.M.D-N`
- Beta 预发布版本:`YYYY.M.D-beta.N`
- Git 标签:`vYYYY.M.D-beta.N`
- 不要给月份或日期补零
- `latest` 表示当前已提升的稳定 npm 发布
- 月份或日期不要补零
- `latest` 表示当前已提升的稳定 npm 发布版本
- `beta` 表示当前 beta 安装目标
- 稳定和稳定修正发布默认发布到 npm `beta`;发布操作员可以明确指定 `latest`,或稍后提升一个已验证的 beta 构建
- 每个稳定 OpenClaw 发布都会同时交付 npm 包和 macOS 应用;
beta 发布通常会先验证并发布 npm/包路径,而
Mac 应用的构建/签名/公证保留给稳定发布,除非明确请求
- 稳定发布和稳定修正发布默认发布到 npm `beta`;发布操作员可以明确指定 `latest`,或稍后提升已验证的 beta 构建
- 每个稳定 OpenClaw 发布版本都会同时交付 npm 包和 macOS 应用;
beta 发布通常先验证并发布 npm/包路径,除非明确请求,否则
mac 应用构建/签名/公证仅保留给稳定版本
## 发布节奏
- 发布按 beta 优先推进
- 只有在最新 beta 完成验证后才会跟进稳定发布
- 维护者通常会从当前 `main` 创建的 `release/YYYY.M.D` 分支切出发布,
这样发布验证和修复不会阻塞 `main` 上的新
开发
- 如果 beta 标签已经推送或发布且需要修复,维护者会切出
下一个 `-beta.N` 标签,而不是删除或重新创建旧的 beta 标签
- 仅在最新 beta 通过验证后才发布稳定版本
- 维护者通常从基于当前 `main` 创建的 `release/YYYY.M.D` 分支切出发布版本,
这样发布验证和修复不会阻塞 `main` 上的新开发
- 如果 beta 标签已经推送或发布并且需要修复,维护者会切出
下一个 `-beta.N` 标签,而不是删除或重新创建旧 beta 标签
- 详细的发布流程、审批、凭证和恢复说明
仅限维护者访问
仅限维护者查看
## 发布操作员检查清单
此检查清单是发布流程的公开形态。私有凭证、
签名、公证、dist-tag 恢复和紧急回滚细节保留在
仅限维护者访问的发布运行手册中。
签名、公证、dist-tag 恢复和紧急回滚详情保留在
仅限维护者查看的发布运行手册中。
1. 从当前 `main` 开始:拉取最新内容,确认目标提交已推送,
并确认当前 `main` CI 足够绿色,可以从它创建分支。
2. 使用 `/changelog` 基于真实提交历史重写顶部 `CHANGELOG.md` 章节,
保持条目面向用户,提交并推送,然后在创建分支前
再 rebase/pull 一次。
3. 审查
1. 从当前 `main` 开始:拉取最新代码,确认目标提交已推送,
并确认当前 `main` CI 足够健康,可以从它创建分支。
2. 使用 `/changelog` 根据真实提交历史重写顶部 `CHANGELOG.md` 章节,
保持条目面向用户,提交它,推送它,并在创建分支前再次 rebase/pull。
3. 检查
`src/plugins/compat/registry.ts`
`src/commands/doctor/shared/deprecation-compat.ts` 中的发布兼容性记录。只有在升级路径仍然被覆盖时才移除已过期的
兼容性,否则记录为什么要有意继续保留。
4. 从当前 `main` 创建 `release/YYYY.M.D`;不要直接在 `main`
做常规发布工作。
5. 为目标标签更新每个必需的版本位置,然后运行
`src/commands/doctor/shared/deprecation-compat.ts` 中的发布兼容性记录。仅当升级路径仍被覆盖时才移除过期兼容性,或记录为什么有意继续保留。
4. 从当前 `main` 创建 `release/YYYY.M.D`;不要直接在 `main` 上进行常规发布工作。
5. 为预期标签更新每个必需的版本位置,然后运行
本地确定性预检:
`pnpm check:test-types`、`pnpm check:architecture`、
`pnpm build && pnpm ui:build``pnpm release:check`
6. 以 `preflight_only=true` 运行 `OpenClaw NPM Release`。在标签存在之前,
允许使用完整的 40 字符发布分支 SHA 进行仅验证
预检。保存成功的 `preflight_run_id`
7. 对发布分支、标签或完整提交 SHA使用 `Full Release Validation`
启动所有预发布测试。这是四个大型发布测试箱
Vitest、Docker、QA Lab 和 Package 的唯一手动入口点。
8. 如果验证失败,在发布分支上修复,并重新运行能证明修复的
最小失败文件、通道、workflow job、包配置、提供商或模型允许列表。
只有当变更面让之前的证据失效时,才重新运行完整总控流程。
9. 对于 beta打标签 `vYYYY.M.D-beta.N`,使用 npm dist-tag `beta` 发布,
然后针对已发布的 `openclaw@YYYY.M.D-beta.N`
6. 运行 `OpenClaw NPM Release`,并设置 `preflight_only=true`。在标签存在之前,
允许使用完整的 40 字符发布分支 SHA 进行仅验证预检。保存成功的 `preflight_run_id`
7. 使用 `Full Release Validation` 为发布分支、标签或完整提交 SHA 启动所有预发布测试。
这是四个大型发布测试箱的唯一手动入口点Vitest、Docker、QA Lab 和 Package。
8. 如果验证失败,在发布分支上修复,并重新运行能证明修复的最小失败
文件、通道、workflow job、包 profile、提供商或模型 allowlist。仅当变更表面使先前证据失效时
才重新运行完整总括流程。
9. 对于 beta标记 `vYYYY.M.D-beta.N`,使用 npm dist-tag `beta` 发布,然后针对已发布的 `openclaw@YYYY.M.D-beta.N`
`openclaw@beta` 包运行发布后包验收。如果已推送或已发布的 beta 需要修复,
切出下一个 `-beta.N`;不要删除或重写旧 beta。
10. 对于稳定发布,只有在已验证的 beta 或发布候选具备
所需验证证据后才继续。稳定 npm 发布会通过 `preflight_run_id`
复用成功的预检产物;稳定 macOS 发布就绪
还要求 `main` 上存在已打包的 `.zip`、`.dmg`、`.dSYM.zip`
以及已更新的 `appcast.xml`
11. 发布后,运行 npm 发布后验证器;在需要发布后渠道证明时,运行可选的独立
已发布 npm Telegram E2E
按需进行 dist-tag 提升;从完整匹配的 `CHANGELOG.md` 章节生成 GitHub release/prerelease 说明;
并执行发布公告
10. 对于稳定版本,仅在已验证的 beta 或发布候选版本具备所需验证证据后继续。
稳定 npm 发布会通过 `preflight_run_id` 复用成功的
预检产物;稳定 macOS 发布就绪还要求在 `main` 上具备打包后的 `.zip`、`.dmg`、`.dSYM.zip` 以及更新后的
`appcast.xml`
11. 发布后,运行 npm 发布后验证器,在需要发布后渠道证明时运行可选的独立
published-npm Telegram E2E在需要时进行 dist-tag 提升,根据完整匹配的 `CHANGELOG.md` 章节生成 GitHub release/prerelease notes并执行发布公告
步骤。
## 发布预检
- 在发布预检前运行 `pnpm check:test-types`这样测试 TypeScript 会在较快的本地 `pnpm check` 门禁之外保持覆盖
- 在发布预检前运行 `pnpm check:architecture`这样更广泛的导入循环和架构边界检查会在较快的本地门禁之外保持绿色
- 在 `pnpm release:check` 前运行 `pnpm build && pnpm ui:build`这样预期的 `dist/*` 发布产物和 Control UI 包会在打包验证步骤前存在
- 在发布批准前运行手动 `Full Release Validation` 工作流,从一个入口点启动所有预发布测试箱。它接受分支、标签或完整提交 SHA调度手动 `CI`,并调度 `OpenClaw Release Checks`覆盖安装冒烟、包验收、Docker 发布路径套件、实时/E2E、OpenWebUI、QA Lab 对等性、Matrix 和 Telegram 通道。只有在包已发布且发布后的 Telegram E2E 也应运行时,才提供 `npm_telegram_package_spec`。当私有证据报告应证明验证匹配已发布的 npm 包、但不强制运行 Telegram E2E 时,提供 `evidence_package_spec`
- 在发布预检前运行 `pnpm check:test-types`以便测试 TypeScript 在更快的本地 `pnpm check` 门禁之外也保持覆盖
- 在发布预检前运行 `pnpm check:architecture`以便更广泛的导入循环和架构边界检查在更快的本地门禁之外保持绿色
- 在 `pnpm release:check` 前运行 `pnpm build && pnpm ui:build`以便预期的 `dist/*` 发布产物和 Control UI 包存在,可供打包验证步骤使用
- 在发布批准前运行手动 `Full Release Validation` 工作流,从一个入口点启动所有预发布测试箱。它接受分支、标签或完整提交 SHA调度手动 `CI`,并调度 `OpenClaw Release Checks`用于安装烟雾测试、包验收、Docker 发布路径套件、live/E2E、OpenWebUI、QA Lab parity、Matrix 和 Telegram 通道。在 `release_profile=full``rerun_group=all` 时,它还会针对发布检查生成的 `release-package-under-test` 产物运行包 Telegram E2E。发布后如果同一个 Telegram E2E 也应证明已发布的 npm 包,请提供 `npm_telegram_package_spec`。当私有证据报告应证明验证匹配某个已发布的 npm 包,但不强制运行 Telegram E2E 时,请提供 `evidence_package_spec`
示例:
`gh workflow run full-release-validation.yml --ref main -f ref=release/YYYY.M.D`
- 当你希望在发布工作继续进行时为包候选版本提供旁路证明,请运行手动 `Package Acceptance` 工作流。对 `openclaw@beta`、`openclaw@latest` 或精确发布版本使用 `source=npm`;使用 `source=ref` 受信任的 `package_ref` 分支/标签/SHA 与当前 `workflow_ref` harness 打包;对带有必需 SHA-256 的 HTTPS tarball 使用 `source=url`;或对另一个 GitHub Actions 运行上传的 tarball 使用 `source=artifact`。该工作流会将候选解析为 `package-under-test`,针对该 tarball 复用 Docker E2E 发布调度器,并可使用 `telegram_mode=mock-openai``telegram_mode=live-frontier` 针对同一个 tarball 运行 Telegram QA。当选的 Docker 通道包含 `published-upgrade-survivor` 时,包产物就是候选`published_upgrade_survivor_baseline` 选择已发布基线。
- 当你希望在发布工作继续进行时为包候选提供旁路证明,请运行手动 `Package Acceptance` 工作流。对 `openclaw@beta`、`openclaw@latest` 或精确发布版本使用 `source=npm`;使用 `source=ref` 以当前 `workflow_ref` harness 打包受信任的 `package_ref` 分支/标签/SHA对带有必需 SHA-256 的 HTTPS tarball 使用 `source=url`;或对另一个 GitHub Actions 运行上传的 tarball 使用 `source=artifact`。该工作流会将候选解析为 `package-under-test`,针对该 tarball 复用 Docker E2E 发布调度器,并且可通过 `telegram_mode=mock-openai``telegram_mode=live-frontier` 针对同一个 tarball 运行 Telegram QA。当选的 Docker 通道包含 `published-upgrade-survivor` 时,包产物就是候选,`published_upgrade_survivor_baseline` 选择已发布基线。
示例:`gh workflow run package-acceptance.yml --ref main -f workflow_ref=main -f source=npm -f package_spec=openclaw@beta -f suite_profile=product -f published_upgrade_survivor_baseline=openclaw@2026.4.26 -f telegram_mode=mock-openai`
常见配置
常见配置文件
- `smoke`:安装/渠道/智能体、Gateway 网关网络和配置重载通道
- `package`:不含 OpenWebUI 或实时 ClawHub 的产物原生包/更新/插件通道
- `product`包配置档加上 MCP 渠道、cron/子智能体清理、OpenAI Web 搜索和 OpenWebUI
- `package`:不含 OpenWebUI 或 live ClawHub 的产物原生包/更新/插件通道
- `product`package 配置文件加上 MCP 渠道、cron/子智能体清理、OpenAI Web 搜索和 OpenWebUI
- `full`:带 OpenWebUI 的 Docker 发布路径分块
- `custom`:用于聚焦重跑的精确 `docker_lanes` 选择
- 当你只需要发布候选版本的完整常规 CI 覆盖时,直接运行手动 `CI` 工作流。手动 CI 调度会绕过变更范围限定,并强制运行 Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建烟、文档检查、Python Skills、Windows、macOS、Android 和 Control UI i18n 通道。
- 当你只需要发布候选的完整常规 CI 覆盖时,直接运行手动 `CI` 工作流。手动 CI 调度会绕过变更范围限定,并强制运行 Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建烟雾测试、文档检查、Python Skills、Windows、macOS、Android 和 Control UI i18n 通道。
示例:`gh workflow run ci.yml --ref release/YYYY.M.D`
- 验证发布遥测时运行 `pnpm qa:otel:smoke`。它通过本地 OTLP/HTTP 接收器执行 QA-lab在无需 Opik、Langfuse 或其他外部收集器的情况下验证导出的跟踪 span 名称、有界属性以及内容/标识符脱敏。
- 每个带标签发布前运行 `pnpm release:check`
- 验证发布遥测时运行 `pnpm qa:otel:smoke`。它通过本地 OTLP/HTTP 接收器执行 QA-lab验证导出的 trace span 名称、有界属性以及内容/标识符脱敏,而不需要 Opik、Langfuse 或其他外部采集器
- 每个带标签发布前运行 `pnpm release:check`
- 发布检查现在在单独的手动工作流中运行:
`OpenClaw Release Checks`
- `OpenClaw Release Checks` 也会在发布批准前运行 QA Lab 模拟对等性门禁,以及快速实时 Matrix 配置档和 Telegram QA 通道。实时通道使用 `qa-live-shared` 环境Telegram 也使用 Convex CI 凭证租约。当你希望并行运行完整 Matrix 传输、媒体和 E2EE 清单时,请使用 `matrix_profile=all``matrix_shards=true` 运行手动 `QA-Lab - All Lanes` 工作流。
- `OpenClaw Release Checks` 还会在发布批准前运行 QA Lab mock parity 门禁,以及快速 live Matrix 配置文件和 Telegram QA 通道。live 通道使用 `qa-live-shared` 环境Telegram 还使用 Convex CI 凭证租约。当你希望并行运行完整 Matrix 传输、媒体和 E2EE 清单时,请使用 `matrix_profile=all``matrix_shards=true` 运行手动 `QA-Lab - All Lanes` 工作流。
- 跨 OS 安装和升级运行时验证是公开 `OpenClaw Release Checks``Full Release Validation` 的一部分,它们会直接调用可复用工作流 `.github/workflows/openclaw-cross-os-release-checks-reusable.yml`
- 这种拆分是有意的:让真实 npm 发布路径保持短小、确定且聚焦产物,而较慢的实时检查保留在自己的通道中,这样它们不会拖慢或阻塞发布
- 带密钥的发布检查应通过 `Full Release Validation` 调度,或从 `main`/release 工作流引用调度,这样工作流逻辑和密钥保持受控
- 这种拆分是有意的:保持真正的 npm 发布路径短小、确定且聚焦产物,同时较慢的 live 检查留在自己的通道中,避免拖慢或阻塞发布
- 带密钥的发布检查应通过 `Full Release Validation` 调度,或从 `main`/release 工作流 ref 调度,以便工作流逻辑和密钥保持受控
- `OpenClaw Release Checks` 接受分支、标签或完整提交 SHA只要解析出的提交可从 OpenClaw 分支或发布标签到达
- `OpenClaw NPM Release` 的仅验证预检也接受当前完整的 40 字符工作流分支提交 SHA而不要求已推送标签
- 该 SHA 路径仅用于验证,不能提升为真实发布
- 在 SHA 模式下,工作流只会为包元数据检查合成 `v<package.json version>`;真实发布仍需要真实发布标签
- 两个工作流都会把真实发布和推广路径保持在 GitHub 托管 runner 上,而非变更型验证路径可以使用更大的 Blacksmith Linux runner
- 该工作流会使用 `OPENAI_API_KEY``ANTHROPIC_API_KEY` 工作流密钥运行 `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
- `OpenClaw NPM Release` 仅验证预检也接受当前完整 40 字符工作流分支提交 SHA无需已推送标签
- 该 SHA 路径仅用于验证,不能提升为真正发布
- 在 SHA 模式下,工作流仅为包元数据检查合成 `v<package.json version>`;真正发布仍需要真实发布标签
- 两个工作流都将真正发布和提升路径保留在 GitHub 托管 runner 上,而非变更性验证路径可以使用更大的 Blacksmith Linux runner
- 该工作流会使用 `OPENAI_API_KEY``ANTHROPIC_API_KEY` 工作流密钥运行
`OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
- npm 发布预检不再等待单独的发布检查通道
- 批准前运行 `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`(或匹配的 beta/修正版标签)
- npm 发布后,运行 `node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`(或匹配的 beta/修正版版本),在新的临时前缀中验证已发布注册表安装路径
- beta 发布后,运行 `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@YYYY.M.D-beta.N OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci pnpm test:docker:npm-telegram-live`,使用共享的租用 Telegram 凭证池,针对已发布 npm 包验证已安装包新手引导、Telegram 设置和真实 Telegram E2E。本地维护者一次性运行可以省略 Convex 变量,并直接传入三个 `OPENCLAW_QA_TELEGRAM_*` 环境变量凭证。
- 维护者也可以通过手动 `NPM Telegram Beta E2E` 工作流,从 GitHub Actions 运行同一个发布后检查。它有意只支持手动运行,不会在每次合并时运行。
- 维护者发布自动化现在使用先预检再推广:
- 真实 npm 发布必须通过成功的 npm `preflight_run_id`
- 真实 npm 发布必须从与成功预检运行相同的 `main``release/YYYY.M.D` 分支调度
- 批准前运行 `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
(或匹配的 beta/修正标签)
- npm 发布后运行
`node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`
(或匹配的 beta/修正版本),在全新的临时前缀中验证已发布 registry 安装路径
- beta 发布后运行 `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@YYYY.M.D-beta.N OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci pnpm test:docker:npm-telegram-live`,以使用共享租约 Telegram 凭证池,针对已发布 npm 包验证已安装包的新手引导、Telegram 设置和真实 Telegram E2E。本地维护者一次性运行可以省略 Convex 变量,并直接传入三个 `OPENCLAW_QA_TELEGRAM_*` 环境变量凭证。
- 维护者可以通过手动 `NPM Telegram Beta E2E` 工作流从 GitHub Actions 运行相同的发布后检查。它有意仅限手动运行,不会在每次合并时运行。
- 维护者发布自动化现在使用先预检后提升:
- 真正的 npm 发布必须通过一次成功的 npm `preflight_run_id`
- 真正的 npm 发布必须从与成功预检运行相同的 `main``release/YYYY.M.D` 分支调度
- 稳定 npm 发布默认使用 `beta`
- 稳定 npm 发布可以通过工作流输入显式指向 `latest`
- 基于 token 的 npm dist-tag 变更现在位于 `openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`,用于安全控制,因为 `npm dist-tag add` 仍需要 `NPM_TOKEN`,而公开仓库保持仅 OIDC 发布
- 公开 `macOS Release` 仅用于验证;当标签只存在于发布分支但工作流从 `main` 调度时,设置 `public_release_branch=release/YYYY.M.D`
- 真私有 mac 发布必须通过成功的私有 mac `preflight_run_id``validate_run_id`
- 真实发布路径会推广已准备好的产物,而不是再次重新构建它们
- 对于像 `YYYY.M.D-N` 这样的稳定修正发布,发布后验证器还会检查从 `YYYY.M.D``YYYY.M.D-N`相同临时前缀升级路径,这样发布修正不会静默地让较旧的全局安装停留在基础稳定版载荷上
- 除非 tarball 同时包含 `dist/control-ui/index.html` 和非空的 `dist/control-ui/assets/` 载荷,否则 npm 发布预检会默认失败关闭,这样我们不会再次发布空的浏览器仪表盘
- 发布后验证还会检查已发布插件入口点和包元数据是否存在于已安装的注册表布局中。发布版本如果缺少插件运行时载荷,会导致 postpublish 验证器失败,并且不能被推广`latest`
- `pnpm test:install:smoke` 还会对候选更新 tarball 强制执行 npm pack `unpackedSize` 预算,因此安装器 e2e 会在发布路径发布前捕获意外的包体积膨胀
- 如果发布工作触及 CI 规划、插件计时清单或插件测试矩阵,请在批准前重新生成并审查来自 `.github/workflows/plugin-prerelease.yml`、由规划器拥有的 `plugin-prerelease-extension-shard` 矩阵输出,这样发布说明不会描述过期的 CI 布局
- 稳定 macOS 发布就绪状态还包括更新器表面:
- GitHub 发布最终必须包含打包后的 `.zip`、`.dmg` 和 `.dSYM.zip`
- 发布后 `main` 上的 `appcast.xml` 必须指向新的稳定 zip
- 打包后的应用必须保非调试 bundle id、非空 Sparkle feed URL以及不低于该发布版本规范 Sparkle 构建下限的 `CFBundleVersion`
- 基于 token 的 npm dist-tag 变更现在位于 `openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`以提升安全性,因为 `npm dist-tag add` 仍需要 `NPM_TOKEN`,而公开仓库保持仅 OIDC 发布
- 公开 `macOS Release` 仅用于验证;当标签只存在于发布分支但工作流从 `main` 调度时,设置 `public_release_branch=release/YYYY.M.D`
- 真正的私有 mac 发布必须通过成功的私有 mac `preflight_run_id``validate_run_id`
- 真正发布路径会提升已准备好的产物,而不是再次重新构建它们
- 对于像 `YYYY.M.D-N` 这样的稳定修正发布,发布后验证器还会检查从 `YYYY.M.D``YYYY.M.D-N`同一临时前缀升级路径,确保发布修正不会悄悄让较旧的全局安装停留在基础稳定载荷上
- npm 发布预检默认关闭,除非 tarball 同时包含 `dist/control-ui/index.html` 和非空的 `dist/control-ui/assets/` 载荷,这样我们不会再次发布空的浏览器仪表盘
- 发布后验证还会检查已发布插件入口点和包元数据是否存在于已安装的 registry 布局中。缺少插件运行时载荷的发布会导致 postpublish 验证器失败,且不能提升`latest`
- `pnpm test:install:smoke` 还会对候选更新 tarball 强制执行 npm pack `unpackedSize` 预算,因此安装器 e2e 能在发布路径前捕获意外的打包膨胀
- 如果发布工作触及 CI 规划、插件计时清单或插件测试矩阵,请在批准前重新生成并审查 planner 拥有的 `plugin-prerelease-extension-shard` 矩阵输出,来源为 `.github/workflows/plugin-prerelease.yml`,以便发布说明不会描述过期的 CI 布局
- 稳定 macOS 发布就绪还包括更新器表面:
- GitHub release 最终必须包含打包后的 `.zip`、`.dmg` 和 `.dSYM.zip`
- 发布后`main` 上的 `appcast.xml` 必须指向新的稳定 zip
- 打包后的应用必须保非调试 bundle id、非空 Sparkle feed URL以及不低于该发布版本规范 Sparkle 构建下限的 `CFBundleVersion`
## 发布测试箱
`Full Release Validation` 是操作员从一个入口点启动所有预发布测试的方式。从受信任的 `main` 工作流引用运行它,并将发布分支、标签或完整提交 SHA 作为 `ref` 传入:
`Full Release Validation` 是操作员从一个入口点启动所有预发布测试的方式。从受信任的 `main` 工作流 ref 运行它,并将发布分支、标签或完整提交 SHA 作为 `ref` 传入:
```bash
gh workflow run full-release-validation.yml \
@ -163,17 +157,17 @@ gh workflow run full-release-validation.yml \
-f evidence_package_spec=openclaw@YYYY.M.D-beta.N
```
该工作流解析目标引用,使用 `target_ref=<release-ref>` 调度手动 `CI`,调度 `OpenClaw Release Checks`,并在设置了 `npm_telegram_package_spec` 时,可选地调度独立的发布后 Telegram E2E。随后 `OpenClaw Release Checks` 会展开安装冒烟、跨 OS 发布检查、实时/E2E Docker 发布路径覆盖、带 Telegram 包 QA 的 Package Acceptance、QA Lab 对等性、实时 Matrix 和实时 Telegram。只有当 `Full Release Validation` 摘要显示 `normal_ci``release_checks` 成功,且任何可选的 `npm_telegram` 子项成功或被有意跳过时,完整运行才可接受。最终验证器摘要包含每个子运行的最慢作业表,因此发布经理无需下载日志就能看到当前关键路径。
请参阅 [完整发布验证](/zh-CN/reference/full-release-validation),了解完整阶段矩阵、精确工作流作业名称、稳定与完整配置档差异、产物以及聚焦重跑句柄。
子工作流从运行 `Full Release Validation` 的受信任引用调度,通常是 `--ref main`,即使目标 `ref` 指向较旧的发布分支或标签也是如此。没有单独的 Full Release Validation 工作流引用输入;通过选择工作流运行引用来选择受信任的 harness。
该工作流会解析目标 ref,使用 `target_ref=<release-ref>` 调度手动 `CI`,调度 `OpenClaw Release Checks`,并在 `release_profile=full``rerun_group=all` 时,或在设置 `npm_telegram_package_spec` 时,调度独立的包 Telegram E2E。随后 `OpenClaw Release Checks` 会扇出安装烟雾测试、跨 OS 发布检查、live/E2E Docker 发布路径覆盖、带 Telegram 包 QA 的 Package Acceptance、QA Lab parity、live Matrix 和 live Telegram。只有当 `Full Release Validation` 摘要显示 `normal_ci``release_checks` 成功时,完整运行才可接受。在 full/all 模式下,`npm_telegram` 子项也必须成功;在 full/all 之外,除非提供了已发布的 `npm_telegram_package_spec`,否则会跳过它。最终验证器摘要包含每个子运行的最慢作业表,因此发布经理无需下载日志即可看到当前关键路径。
请参阅 [完整发布验证](/zh-CN/reference/full-release-validation),了解完整阶段矩阵、精确工作流作业名称、stable 与 full 配置文件差异、产物以及聚焦重跑句柄。
子工作流从运行 `Full Release Validation` 的受信任 ref 调度,通常是 `--ref main`,即使目标 `ref` 指向较旧的发布分支或标签也是如此。没有单独的 Full Release Validation 工作流 ref 输入;通过选择工作流运行 ref 来选择受信任的 harness。
使用 `release_profile` 选择实时/提供商广度
使用 `release_profile` 选择 live/提供商覆盖范围
- `minimum`:最快的发布关键 OpenAI/核心实时和 Docker 路径
- `minimum`:最快的发布关键 OpenAI/core live 和 Docker 路径
- `stable`minimum 加上用于发布批准的稳定提供商/后端覆盖
- `full`stable 加上广泛的建议性提供商/媒体覆盖
- `full`stable 加上广泛的 advisory 提供商/媒体覆盖
`OpenClaw Release Checks` 使用可信工作流 ref 将目标 ref 一次性解析为 `release-package-under-test`,并在发布路径 Docker 检查和 Package Acceptance 中复用该构件。这样可以让所有面向包的检查箱使用相同字节,并避免重复构建包。跨 OS OpenAI 安装冒烟检查在设置了 repo/org 变量时使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用 `openai/gpt-5.5`,因为这个通道验证的是包安装、新手引导、Gateway 网关启动,以及一次实时智能体轮次,而不是对最慢的默认模型做基准测试。更广泛的实时提供商矩阵仍然是模型专项覆盖的地方。
`OpenClaw Release Checks` 使用受信任的工作流 ref将目标 ref 一次性解析为 `release-package-under-test`,并在 release-path Docker 检查和 Package Acceptance 中复用该构件。这会让所有面向软件包的检查项使用相同字节,并避免重复构建软件包。跨 OS 的 OpenAI 安装冒烟测试会在设置了仓库/组织变量时使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用 `openai/gpt-5.5`,因为该通道验证的是软件包安装、新手引导、Gateway 网关启动和一次实时智能体轮次,而不是对最慢的默认模型做基准测试。更广泛的实时提供商矩阵仍然是覆盖特定模型的地方。
根据发布阶段使用这些变体:
@ -199,27 +193,28 @@ gh workflow run full-release-validation.yml \
-f ref=release/YYYY.M.D \
-f provider=openai \
-f mode=both \
-f release_profile=full \
-f evidence_package_spec=openclaw@YYYY.M.D-beta.N \
-f npm_telegram_package_spec=openclaw@YYYY.M.D-beta.N \
-f npm_telegram_provider_mode=mock-openai
```
不要把完整总控工作流作为聚焦修复后的首次重跑。如果某个检查箱失败请使用失败的子工作流、作业、Docker 通道、包配置、模型提供商或 QA 通道作为下一次证。只有当修复更改了共享发布编排,或让此前的全检查箱证据过期时,才再次运行完整总控工作流。总控工作流的最终验证器会重新检查记录的子工作流运行 ID因此在子工作流成功重跑后重跑失败的 `Verify full validation` 父作业。
不要把完整总括流程用作聚焦修复后的第一次重跑。如果某个检查项失败请使用失败的子工作流、作业、Docker 通道、软件包配置、模型提供商或 QA 通道作为下一次证。只有当修复更改了共享发布编排,或让早先的全检查项证据过期时,才再次运行完整总括流程。总括流程的最终验证器会重新检查记录的子工作流运行 ID因此在子工作流成功重跑后只重跑失败的 `Verify full validation` 父作业。
对于有界恢复,向总控工作流传递 `rerun_group`。`all` 是真正的候选发布运行,`ci` 只运行普通 CI 子工作流,`plugin-prerelease` 只运行仅发布使用的插件子工作流,`release-checks` 运行每个发布检查箱,更窄的发布组包括 `install-smoke`、`cross-os`、`live-e2e`、`package`、`qa`、`qa-parity`、`qa-live`,以及在提供独立包 Telegram 通道时的 `npm-telegram`
对于有边界的恢复,请向总括流程传入 `rerun_group`。`all` 是真正的候选发布运行,`ci` 只运行普通 CI 子流`plugin-prerelease` 只运行仅发布使用的插件子流程,`release-checks` 运行每个发布检查项,更窄的发布分组是 `install-smoke`、`cross-os`、`live-e2e`、`package`、`qa`、`qa-parity`、`qa-live` 和 `npm-telegram`。聚焦的 `npm-telegram` 重跑需要 `npm_telegram_package_spec`;带有 `release_profile=full` 的 full/all 运行会使用 release-checks 软件包构件
### Vitest
Vitest 检查箱是手动 `CI` 子工作流。手动 CI 会有意绕过变更范围筛选,并为候选发布强制运行正常测试图Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建冒烟检查、文档检查、Python Skills、Windows、macOS、Android,以及 Control UI i18n。
Vitest 检查项是手动 `CI` 子工作流。手动 CI 会有意绕过变更范围限制,并对候选发布强制执行普通测试图Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建冒烟、文档检查、Python Skills、Windows、macOS、Android Control UI i18n。
使用这个检查箱回答“源代码树是否通过了完整的正常测试套件?”它不同于发布路径产品验证。需要保留的证据:
用这个检查项回答“源代码树是否通过了完整的普通测试套件?”它与 release-path 产品验证不同。需要保留的证据:
- `Full Release Validation` 摘要,显示已发的 `CI` 运行 URL
- `CI` 在精确目标 SHA 上通过
- 调查回归时来自 CI 作业的失败或慢分片名称
- 当某次运行需要性能分析时Vitest 计时构件,例如 `.artifacts/vitest-shard-timings.json`
- `Full Release Validation` 摘要,显示已发的 `CI` 运行 URL
- `CI` 在精确目标 SHA 上为绿色
- 调查回归时来自 CI 作业的失败或慢分片名称
- 当某次运行需要性能分析时,保留 Vitest 计时构件,例如 `.artifacts/vitest-shard-timings.json`
仅当发布需要确定性的正常 CI而不需要 Docker、QA Lab、实时、跨 OS 或包检查箱时,才直接运行手动 CI
只有当发布需要确定性的普通 CI而不需要 Docker、QA Lab、实时、跨 OS 或软件包检查项时,才直接运行手动 CI
```bash
gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
@ -227,51 +222,51 @@ gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
### Docker
Docker 检查位于 `OpenClaw Release Checks` 中,通过 `openclaw-live-and-e2e-checks-reusable.yml` 以及发布模式的 `install-smoke` 工作流运行。它通过打包后的 Docker 环境验证候选发布,而不只是源代码级测试。
Docker 检查位于 `OpenClaw Release Checks` 中,通过 `openclaw-live-and-e2e-checks-reusable.yml` 以及 release-mode `install-smoke` 工作流执行。它通过已打包的 Docker 环境验证候选发布,而不只是源代码级测试。
发布 Docker 覆盖包括:
- 启用慢 Bun 全局安装冒烟检查的完整安装冒烟检查
- 按目标 SHA 准备/复用根 Dockerfile 冒烟镜像,其中 QR、root/gateway以及 installer/Bun 冒烟作业作为独立 install-smoke 分片运行
- 启用慢 Bun 全局安装冒烟的完整安装冒烟
- 按目标 SHA 准备/复用根 Dockerfile 冒烟镜像,并将 QR、root/gateway 和 installer/Bun 冒烟作业作为单独的 install-smoke 分片运行
- 仓库 E2E 通道
- 发布路径 Docker 分块:`core`、`package-update-openai`、`package-update-anthropic`、`package-update-core`、`plugins-runtime-plugins`、`plugins-runtime-services`、`plugins-runtime-install-a`、`plugins-runtime-install-b`、`plugins-runtime-install-c`、`plugins-runtime-install-d`、`plugins-runtime-install-e`、`plugins-runtime-install-f`、`plugins-runtime-install-g` 和 `plugins-runtime-install-h`
- 请求时,在 `plugins-runtime-services` 分块内包含 OpenWebUI 覆盖
- release-path Docker 分块:`core`、`package-update-openai`、`package-update-anthropic`、`package-update-core`、`plugins-runtime-plugins`、`plugins-runtime-services`、`plugins-runtime-install-a`、`plugins-runtime-install-b`、`plugins-runtime-install-c`、`plugins-runtime-install-d`、`plugins-runtime-install-e`、`plugins-runtime-install-f`、`plugins-runtime-install-g` 和 `plugins-runtime-install-h`
- 请求时,在 `plugins-runtime-services` 分块内覆盖 OpenWebUI
- 拆分的内置插件安装/卸载通道,从 `bundled-plugin-install-uninstall-0``bundled-plugin-install-uninstall-23`
- 当发布检查包含实时套件时,包含实时/E2E 提供商套件和 Docker 实时模型覆盖
- 当发布检查包含实时套件时,覆盖 live/E2E 提供商套件和 Docker 实时模型
重跑前先使用 Docker 构件。发布路径调度器会上传 `.artifacts/docker-tests/`,其中包含通道日志、`summary.json`、`failures.json`、阶段计时、调度器计划 JSON以及重跑命令。对于聚焦恢复请在可复用实时/E2E 工作流上使用 `docker_lanes=<lane[,lane]>`,而不是重跑所有发布分块。生成的重跑命令会在可用时包含前的 `package_artifact_run_id` 和已准备 Docker 镜像输入,因此失败通道可以复用同一个 tarball 和 GHCR 镜像。
重跑前先使用 Docker 构件。release-path 调度器会上传 `.artifacts/docker-tests/`,其中包含通道日志、`summary.json`、`failures.json`、阶段计时、调度计划 JSON 和重跑命令。对于聚焦恢复,请在可复用 live/E2E 工作流上使用 `docker_lanes=<lane[,lane]>`,而不是重跑所有发布分块。生成的重跑命令会在可用时包含前的 `package_artifact_run_id` 和已准备 Docker 镜像输入,因此失败通道可以复用同一个 tarball 和 GHCR 镜像。
### QA Lab
QA Lab 检查也是 `OpenClaw Release Checks` 的一部分。它是智能体行为和渠道级发布门禁,独立于 Vitest 和 Docker 包机制
QA Lab 检查也是 `OpenClaw Release Checks` 的一部分。它是智能体行为和渠道级发布门禁,与 Vitest 和 Docker 软件包机制分开
发布 QA Lab 覆盖包括:
- 使用智能体一致性包,将 OpenAI 候选通道与 Opus 4.6 基线进行比较的模拟一致性门禁
- 使用 `qa-live-shared` 环境的快速实时 Matrix QA 配置
- 使用 Convex CI 凭租约的实时 Telegram QA 通道
- 使用 agentic parity pack将 OpenAI 候选通道与 Opus 4.6 基线进行比较的 mock parity gate
- 使用 `qa-live-shared` 环境的快速实时 Matrix QA 配置
- 使用 Convex CI 凭租约的实时 Telegram QA 通道
- 当发布遥测需要显式本地证明时运行 `pnpm qa:otel:smoke`
使用这个检查箱回答“发布在 QA 场景和实时渠道流中是否行为正确?”批准发布时,请保留一致性、Matrix 和 Telegram 通道的构件 URL。完整 Matrix 覆盖仍可作为手动分片 QA-Lab 运行使用,而不是默认发布关键通道。
用这个检查项回答“发布在 QA 场景和实时渠道流中表现是否正确?”批准发布时保留 parity、Matrix 和 Telegram 通道的构件 URL。完整 Matrix 覆盖仍作为手动分片 QA-Lab 运行使用,而不是默认发布关键通道。
### 包
### 软件
包检查箱是可安装产品门禁。它由 `Package Acceptance` 和解析器 `scripts/resolve-openclaw-package-candidate.mjs` 支撑。解析器会将候选项规范化为 Docker E2E 使用的 `package-under-test` tarball验证包清单记录包版本和 SHA-256并将工作流 harness ref 与包源 ref 分开
软件包检查项是可安装产品门禁。它由 `Package Acceptance` 和解析器 `scripts/resolve-openclaw-package-candidate.mjs` 支撑。解析器会将候选项标准化为 Docker E2E 使用的 `package-under-test` tarball验证软件包清单记录软件包版本和 SHA-256并让工作流 harness ref 与软件包来源 ref 保持分离
支持的候选来源:
- `source=npm``openclaw@beta`、`openclaw@latest`,或精确的 OpenClaw 发布版本
- `source=ref`:使用选定的 `workflow_ref` harness 打包可信`package_ref` 分支、标签或完整提交 SHA
- `source=url`:下载 HTTPS `.tgz`,并要求提供 `package_sha256`
- `source=ref`:使用选定的 `workflow_ref` harness 打包受信任`package_ref` 分支、标签或完整提交 SHA
- `source=url`:下载需要 `package_sha256` 的 HTTPS `.tgz`
- `source=artifact`:复用另一个 GitHub Actions 运行上传的 `.tgz`
`OpenClaw Release Checks` 使用 `source=artifact`、已准备的发布包构件、`suite_profile=custom`、`docker_lanes=doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update`、`published_upgrade_survivor_baselines=release-history`、`published_upgrade_survivor_scenarios=reported-issues` 和 `telegram_mode=mock-openai` 运行 Package Acceptance。Package Acceptance 会让迁移、更新、陈旧插件依赖清理、离线插件夹具、插件更新,以及 Telegram 包 QA 都针对同一个已解析 tarball。它是 GitHub 原生替代方案,用于覆盖过去多数需要 Parallels 的包/更新验证。跨 OS 发布检查对于 OS 专项的新手引导、安装器和平台行为仍然重要,但包/更新产品验证应优先使用 Package Acceptance。
`OpenClaw Release Checks` 使用 `source=artifact`、已准备的发布软件包构件、`suite_profile=custom`、`docker_lanes=doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update`、`published_upgrade_survivor_baselines=release-history`、`published_upgrade_survivor_scenarios=reported-issues` 和 `telegram_mode=mock-openai` 运行 Package Acceptance。Package Acceptance 会针对同一个已解析 tarball 保持迁移、更新、陈旧插件依赖清理、离线插件 fixture、插件更新和 Telegram 软件包 QA。它是大多数软件包/更新覆盖的 GitHub 原生替代方案,这些覆盖以前需要 Parallels。跨 OS 发布检查对 OS 特定的新手引导、安装器和平台行为仍然重要,但软件包/更新产品验证应优先使用 Package Acceptance。
更新和插件验证的规范清单是 [更新和插件测试](/zh-CN/help/testing-updates-plugins)。在判断哪个本地、Docker、Package Acceptance 或发布检查通道能证明插件安装/更新、Doctor 清理或已发布包迁移变更时,请使用它。
更新和插件验证的规范清单是 [更新和插件测试](/zh-CN/help/testing-updates-plugins)。在决定哪个本地、Docker、Package Acceptance 或 release-check 通道能够证明插件安装/更新、Doctor 清理或已发布软件包迁移变更时,请使用它。
旧版 package-acceptance 宽容行为有意设置了时间边界。到 `2026.4.25` 为止的包可以对已发布到 npm 的元数据缺口使用兼容路径tarball 中缺失私有 QA 清单条目、缺失 `gateway install --wrapper`、tarball 派生的 git 夹具中缺失补丁文件、缺失持久化的 `update.channel`、旧版插件安装记录位置、缺失 marketplace 安装记录持久化,以及 `plugins update` 期间的配置元数据迁移。已发布的 `2026.4.26` 包可能会因已随包发布的本地构建元数据戳文件而警告。后续包必须满足现代包契约;同样的缺口会导致发布验证失败。
旧版 package-acceptance 宽容路径有意设置了时间边界。截至 `2026.4.25` 的软件包可以对已发布到 npm 的元数据缺口使用兼容路径tarball 中缺少私有 QA 清单条目、缺少 `gateway install --wrapper`、tarball 派生 git fixture 中缺少补丁文件、缺少持久化的 `update.channel`、旧版插件安装记录位置、缺少 marketplace 安装记录持久化,以及 `plugins update` 期间的配置元数据迁移。已发布的 `2026.4.26` 软件包可能会对已经发货的本地构建元数据戳文件发出警告。后续软件包必须满足现代软件包契约;相同缺口会导致发布验证失败。
当发布问题涉及实际可安装包时,使用更广泛的 Package Acceptance 配置
当发布问题涉及实际可安装软件包时,使用更广泛的 Package Acceptance 配置:
```bash
gh workflow run package-acceptance.yml \
@ -283,72 +278,73 @@ gh workflow run package-acceptance.yml \
-f published_upgrade_survivor_baseline=openclaw@2026.4.26
```
常见包配置
常见软件包配置:
- `smoke`:快速包安装/渠道/智能体、Gateway 网关网络和配置重载通道
- `package`没有实时 ClawHub 的安装/更新/插件包契约;这是发布检查默认值
- `product``package` 加上 MCP 渠道、cron/子智能体清理、OpenAI Web 搜索和 OpenWebUI
- `full`包含 OpenWebUI 的 Docker 发布路径分块
- `smoke`:快速软件包安装/渠道/智能体、Gateway 网关网络和配置重载通道
- `package`不依赖实时 ClawHub 的安装/更新/插件软件包契约;这是 release-check 默认值
- `product``package` 加上 MCP 渠道、cron/subagent 清理、OpenAI Web 搜索和 OpenWebUI
- `full`带 OpenWebUI 的 Docker release-path 分块
- `custom`:用于聚焦重跑的精确 `docker_lanes` 列表
对于包候选 Telegram 证明,请在 Package Acceptance 上启用 `telegram_mode=mock-openai``telegram_mode=live-frontier`。该工作流会把已解析的 `package-under-test` tarball 传入 Telegram 通道;独立 Telegram 工作流仍接受已发布的 npm spec用于发布后检查。
对于软件包候选 Telegram 证明,请在 Package Acceptance 上启用 `telegram_mode=mock-openai``telegram_mode=live-frontier`。该工作流会把已解析的 `package-under-test` tarball 传入 Telegram 通道;独立 Telegram 工作流仍接受已发布的 npm spec用于发布后检查。
## NPM 工作流输入
`OpenClaw NPM Release` 接受这些由操作控制的输入:
`OpenClaw NPM Release` 接受这些由操作控制的输入:
- `tag`:必发布标签,例如 `v2026.4.2`、`v2026.4.2-1` 或 `v2026.4.2-beta.1`;当 `preflight_only=true` 时,它也可以是当前完整的 40 字符工作流分支提交 SHA用于仅验证的预检
- `preflight_only``true` 表示验证/构建/打包,`false` 表示真实发布路径
- `preflight_run_id`:真实发布路径必填,使工作流复用成功预检运行准备的 tarball
- `npm_dist_tag`:发布路径的 npm 目标标签;默认为 `beta`
- `tag`:必需的发布标签,例如 `v2026.4.2`、`v2026.4.2-1` 或 `v2026.4.2-beta.1`;当 `preflight_only=true` 时,它也可以是当前完整的 40 字符工作流分支提交 SHA用于仅验证的 preflight
- `preflight_only``true` 表示只进行验证/构建/打包,`false` 表示真实发布路径
- `preflight_run_id`:真实发布路径必填,这样工作流会复用成功 preflight 运行中准备好的 tarball
- `npm_dist_tag`:发布路径的 npm 目标标签;默认`beta`
`OpenClaw Release Checks` 接受这些由操作控制的输入:
`OpenClaw Release Checks` 接受这些由操作控制的输入:
- `ref`:要验证的分支、标签或完整提交 SHA。带有密钥的检查要求已解析提交可从 OpenClaw 分支或发布标签到达
- `ref`:要验证的分支、标签或完整提交 SHA。带有密钥的检查要求解析后的提交可从 OpenClaw 分支或发布标签访问
规则:
- 稳定版和修正版标签可以发布到 `beta``latest`
- Beta 预发布标签只能发布到 `beta`
- 对于 `OpenClaw NPM Release`,只有`preflight_only=true` 时才允许完整提交 SHA 输入
- `OpenClaw Release Checks``Full Release Validation` 始终只验证
- 真实发布路径必须使用预检期间使用的同一个 `npm_dist_tag`;工作流会在发布继续前验证该元数据
- 对于 `OpenClaw NPM Release`,只有`preflight_only=true` 时才允许输入完整提交 SHA
- `OpenClaw Release Checks``Full Release Validation` 始终只用于验证
- 真实发布路径必须使用 preflight 期间使用的同一个 `npm_dist_tag`;工作流会在发布继续前验证该元数据
## 稳定 npm 发布序列
## 稳定 npm 发布流程
切稳定 npm 发布时:
切稳定 npm 发布时:
1. 使用 `preflight_only=true` 运行 `OpenClaw NPM Release`
1. 使用 `OpenClaw NPM Release` 并设置 `preflight_only=true`
- 在标签存在之前,你可以使用当前完整工作流分支提交
SHA对预检工作流执行仅验证的空运行
2. 为常规 beta 优先流程选择 `npm_dist_tag=beta`;仅当你有意直接发布稳定版时才选择 `latest`
3. 当你希望通过一个手动工作流获得常规 CI以及 live prompt cache、Docker、QA Lab、
Matrix 和 Telegram 覆盖时,请在发布分支、发布标签或完整
SHA对预检工作流进行仅验证的 dry run
2. 为常规 beta 优先流程选择 `npm_dist_tag=beta`,仅在
你有意直接发布稳定版时才选择 `latest`
3. 当你希望从一个手动工作流获得常规 CI 以及实时 prompt cache、Docker、QA Lab、
Matrix 和 Telegram 覆盖时,在发布分支、发布标签或完整
提交 SHA 上运行 `Full Release Validation`
4. 如果你有意只需要确定性的常规测试图,请改为在发布引用上运行
手动 `CI` 工作流
5. 保存成功的 `preflight_run_id`
6. 使用 `preflight_only=false`、相同的
`tag`、相同的 `npm_dist_tag` 以及已保存的 `preflight_run_id`,再次运行 `OpenClaw NPM Release`
6. 再次运行 `OpenClaw NPM Release`,并设置 `preflight_only=false`、相同的
`tag`、相同的 `npm_dist_tag`,以及保存的 `preflight_run_id`
7. 如果发布落在 `beta` 上,请使用私有
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
工作流,将该稳定版本从 `beta` 提升到 `latest`
8. 如果发布有意直接发布到 `latest`,且 `beta`
应立即跟随同一个稳定构建,请使用同一个私有
工作流将两个 dist-tags 都指向该稳定版本,或让其定时
工作流将两个 dist-tag 都指向该稳定版本,或让其定时
自愈同步稍后移动 `beta`
出于安全原因dist-tag 变更位于私有仓库中,因为它仍然
需要 `NPM_TOKEN`,而公仓库保持仅 OIDC 发布。
需要 `NPM_TOKEN`,而公仓库保持仅 OIDC 发布。
让直接发布路径和 beta 优先提升路径都
文档记录并对操作员可见。
这让直接发布路径和 beta 优先提升路径都得到
文档记录对操作员可见。
如果维护者必须回退到本地 npm 身份验证,请仅在专用 tmux 会话运行任何 1Password
CLI`op`)命令。不要直接从主智能体 shell 调用 `op`;将其保留在 tmux 内部可以让提示、
如果维护者必须回退到本地 npm 身份验证,请仅在专用 tmux 会话运行任何 1Password
CLI`op`)命令。不要直接从主 agent shell 调用 `op`;将其放在 tmux 内可让提示、
警报和 OTP 处理可观察,并防止重复的主机警报。
## 公参考
## 公参考
- [`.github/workflows/full-release-validation.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/full-release-validation.yml)
- [`.github/workflows/package-acceptance.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/package-acceptance.yml)

View File

@ -1,22 +1,22 @@
---
read_when:
- 运行或重新运行完整发布验证
- 比较稳定版和完整发布验证配置文件
- 比较稳定版和完整发布验证配置文件
- 调试发布验证阶段失败
summary: 完整发布验证阶段、子工作流、发布配置、重新运行句柄和证据
summary: 完整发布验证阶段、子工作流、发布配置文件、重新运行句柄和证据
title: 完整发布验证
x-i18n:
generated_at: "2026-05-01T20:40:28Z"
generated_at: "2026-05-01T23:10:04Z"
model: gpt-5.5
provider: openai
source_hash: 032cf35578bc56187cdf3776dada58ccbde9a24183896bc71c3a782e85fc834f
source_hash: feb4edec850fb97405575c869547b4851bc773507321690670553e6faafc8b0b
source_path: reference/full-release-validation.md
workflow: 16
---
`Full Release Validation` 是发布总控工作流。它是预发布验证的唯一手动入口点,但大多数工作在子工作流中完成,因此失败的运行环境可以重新运行,而无需重启整个发布流程。
`Full Release Validation` 是发布验证总控。它是预发布证明的单一手动入口点,但大部分工作发生在子工作流中,因此失败的执行环境可以重新运行,而不必重启整个发布流程。
从受信任的工作流 ref 运行,通常是 `main`,并将发布分支、标签或完整提交 SHA 作为 `ref` 传入:
从受信任的工作流 ref 运行,通常是 `main`,并将发布分支、标签或完整提交 SHA 作为 `ref` 传入:
```bash
gh workflow run full-release-validation.yml \
@ -27,101 +27,102 @@ gh workflow run full-release-validation.yml \
-f release_profile=stable
```
子工作流使用受信任的工作流 ref 作为 harness并使用输入 `ref` 作为待测候选版本。这样在验证较旧的发布分支或标签时,也能使用新的验证逻辑。
子工作流使用受信任的工作流 ref 作为 harness并使用输入
`ref` 作为被测候选版本。这样在验证较旧的发布分支或标签时,也能使用新的验证逻辑。
## 顶层阶段
| 阶段 | 详情 |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 目标解析 | **Job:** `Resolve target ref`<br />**子工作流:**无<br />**证**解析发布分支、标签或完整提交 SHA并记录选输入。<br />**重新运行:**如果此阶段失败,请重新运行总控工作流。 |
| Vitest 和普通 CI | **Job:** `Run normal full CI`<br />**子工作流:**`CI`<br />**证**针对目标 ref 的手动完整 CI 图,包括 Linux Node lanes、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建 smoke、文档检查、Python Skills、Windows、macOS、Control UI i18n以及通过总控工作流运行的 Android。<br />**重新运行:**`rerun_group=ci`。 |
| 插件预发布 | **Job:** `Run plugin prerelease validation`<br />**子工作流:**`Plugin Prerelease`<br />**证**仅发布使用的插件静态检查、智能体式插件覆盖、完整插件批量分片,以及插件预发布 Docker lanes<br />**重新运行:**`rerun_group=plugin-prerelease`。 |
| 发布检查 | **Job:** `Run release/live/Docker/QA validation`<br />**子工作流:**`OpenClaw Release Checks`<br />**证明:**安装 smoke、跨操作系统包检查、live/E2E 套件、Docker 发布路径分块、Package Acceptance、QA Lab parity、live Matrix 和 live Telegram。<br />**重新运行:**`rerun_group=release-checks` 或更窄的 release-checks handle。 |
| 发布后 Telegram | **Job:** `Run post-publish Telegram E2E`<br />**子工作流:**`NPM Telegram Beta E2E`<br />**证明:**当设置 `npm_telegram_package_spec` 时,提供可选的已发布包 Telegram 验证<br />**重新运行:**`rerun_group=npm-telegram`。 |
| 总控验证器 | **Job:** `Verify full validation`<br />**子工作流:**无<br />**证明:**重新检查记录的子工作流运行结论,并追加来自子工作流的最慢 job 表。<br />**重新运行:**在重新运行失败的子工作流并通过后,仅重新运行此 job 以转为绿色。 |
| 阶段 | 详情 |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 目标解析 | **作业:** `Resolve target ref`<br />**子工作流:** <br />**证:** 解析发布分支、标签或完整提交 SHA并记录选定的输入。<br />**重新运行:** 如果这里失败,重新运行总控工作流。 |
| Vitest 和普通 CI | **作业:** `Run normal full CI`<br />**子工作流:** `CI`<br />**证:** 针对目标 ref 的手动完整 CI 图,包括 Linux Node 通道、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建冒烟、文档检查、Python Skills、Windows、macOS、Control UI i18n以及通过总控工作流运行的 Android。<br />**重新运行:** `rerun_group=ci`。 |
| 插件预发布 | **作业:** `Run plugin prerelease validation`<br />**子工作流:** `Plugin Prerelease`<br />**证:** 仅发布使用的插件静态检查、智能体式插件覆盖、完整插件批次分片,以及插件预发布 Docker 通道<br />**重新运行:** `rerun_group=plugin-prerelease`。 |
| 发布检查 | **作业:** `Run release/live/Docker/QA validation`<br />**子工作流:** `OpenClaw Release Checks`<br />**验证:** 安装冒烟、跨 OS 包检查、live/E2E 套件、Docker 发布路径分块、Package Acceptance、QA Lab 对等性、live Matrix 和 live Telegram。<br />**重新运行:** `rerun_group=release-checks` 或更窄的 release-checks 句柄。 |
| Telegram 包 | **作业:** `Run package Telegram E2E`<br />**子工作流:** `NPM Telegram Beta E2E`<br />**验证:** 当 `rerun_group=all``release_profile=full` 时,进行基于构件的 Telegram 包证明;或当设置了 `npm_telegram_package_spec` 时,进行已发布包的 Telegram 证明<br />**重新运行:** 使用 `npm_telegram_package_spec``rerun_group=npm-telegram`。 |
| 总控验证器 | **作业:** `Verify full validation`<br />**子工作流:** 无<br />**验证:** 重新检查已记录的子运行结论,并从子工作流附加最慢作业表。<br />**重新运行:** 在重新运行失败的子工作流并变绿后,只重新运行此作业。 |
对于 `ref=main``rerun_group=all`,较新的总控工作流会取代较旧的总控工作流。当父工作流被取消时,它的监控器会取消任何已经派发的子工作流。默认情况下,发布分支和标签验证运行不会相互取消。
对于 `ref=main``rerun_group=all`,较新的总控工作流会取代较旧的总控工作流。当父工作流被取消时,它的监视器会取消已分派的所有子工作流。发布分支和标签验证运行默认不会相互取消。
## 发布检查阶段
`OpenClaw Release Checks` 是最大的子工作流。它会一次性解析目标,并在包或面向 Docker 的阶段需要时,准备共享的 `release-package-under-test` 构件。
`OpenClaw Release Checks` 是最大的子工作流。它会解析一次目标,并在面向包或 Docker 的阶段需要时,准备共享的 `release-package-under-test` 构件。
| 阶段 | 详情 |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 发布目标 | **Job:** `Resolve target ref`<br />**支撑工作流:**无<br />**测试:**所选 ref、可选的预期 SHA、配置档、重新运行组,以及聚焦的 live 套件过滤器。<br />**重新运行:**`rerun_group=release-checks`。 |
| 包构件 | **Job:** `Prepare release package artifact`<br />**支撑工作流:**无<br />**测试:**打包或解析一个候选 tarball并上传 `release-package-under-test`,供下游面向包的检查使用。<br />**重新运行:**受影响的包、跨操作系统或 live/E2E 组。 |
| 安装 smoke | **Job:** `Run install smoke`<br />**支撑工作流:**`Install Smoke`<br />**测试:**完整安装路径,包括复用根 Dockerfile smoke 镜像、QR 包安装、根和 Gateway 网关 Docker smoke、安装器 Docker 测试、Bun 全局安装 image-provider smoke,以及快速内置插件安装/卸载 E2E。<br />**重新运行:**`rerun_group=install-smoke`。 |
| 跨操作系统 | **Job:** `cross_os_release_checks`<br />**支撑工作流:**`OpenClaw Cross-OS Release Checks (Reusable)`<br />**测试:**在 Linux、Windows 和 macOS 上针对所选提供商和模式运行全新安装与升级 lanes,使用候选 tarball 加基线包。<br />**重新运行:**`rerun_group=cross-os`。 |
| 仓库和 live E2E | **Job:** `Run repo/live E2E validation`<br />**支撑工作流:**`OpenClaw Live And E2E Checks (Reusable)`<br />**测试:**仓库 E2E、live cache、OpenAI websocket streaming、原生 live 提供商和插件分片,以及由 `release_profile` 选择的 Docker 支撑的 live 模型/backend/gateway harnesses。<br />**重新运行:**`rerun_group=live-e2e`,可选配 `live_suite_filter`。 |
| Docker 发布路径 | **Job:** `Run Docker release-path validation`<br />**支撑工作流:**`OpenClaw Live And E2E Checks (Reusable)`<br />**测试:**针对共享包构件运行发布路径 Docker 分块。<br />**重新运行:**`rerun_group=live-e2e`。 |
| 包验收 | **Job:** `Run package acceptance`<br />**支撑工作流:**`Package Acceptance`<br />**测试:**离线插件包 fixtures、插件更新以及针对同一 tarball 的 mock-OpenAI Telegram 包验收。<br />**重新运行:**`rerun_group=package`。 |
| QA 对等性 | **Job:** `Run QA Lab parity lane``Run QA Lab parity report`<br />**支撑工作流:**直接 jobs<br />**测试:**候选版本和基线智能体式对等包,然后生成对等性报告。<br />**重新运行:**`rerun_group=qa-parity` 或 `rerun_group=qa`。 |
| QA live Matrix | **Job:** `Run QA Lab live Matrix lane`<br />**支撑工作流:**直接 job<br />**测试:**在 `qa-live-shared` 环境中运行快速 live Matrix QA 配置档<br />**重新运行:**`rerun_group=qa-live` 或 `rerun_group=qa`。 |
| QA live Telegram | **Job:** `Run QA Lab live Telegram lane`<br />**支撑工作流:**直接 job<br />**测试:**使用 Convex CI 凭据租约运行 live Telegram QA。<br />**重新运行:**`rerun_group=qa-live` 或 `rerun_group=qa`。 |
| 发布验证器 | **Job:** `Verify release checks`<br />**支撑工作流:**无<br />**测试:**所选重新运行组所需的 release-check jobs。<br />**重新运行:**在聚焦的子 jobs 通过后重新运行。 |
| 阶段 | 详情 |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 发布目标 | **作业:** `Resolve target ref`<br />**支撑工作流:** <br />**测试:** 选定 ref、可选的预期 SHA、profile、rerun group,以及聚焦的 live 套件过滤器。<br />**重新运行:** `rerun_group=release-checks`。 |
| 包构件 | **作业:** `Prepare release package artifact`<br />**支撑工作流:** <br />**测试:** 打包或解析一个候选 tarball并上传 `release-package-under-test`,供下游面向包的检查使用。<br />**重新运行:** 受影响的包、跨 OS 或 live/E2E 组。 |
| 安装冒烟 | **作业:** `Run install smoke`<br />**支撑工作流:** `Install Smoke`<br />**测试:** 完整安装路径,包括根 Dockerfile 冒烟镜像复用、QR 包安装、根和 Gateway 网关 Docker 冒烟、安装器 Docker 测试、Bun 全局安装 image-provider 冒烟,以及快速内置插件安装/卸载 E2E。<br />**重新运行:** `rerun_group=install-smoke` |
| 跨 OS | **作业:** `cross_os_release_checks`<br />**支撑工作流:** `OpenClaw Cross-OS Release Checks (Reusable)`<br />**测试:** 在 Linux、Windows 和 macOS 上针对选定提供商和模式运行全新安装与升级通道,使用候选 tarball 加基线包。<br />**重新运行:** `rerun_group=cross-os` |
| 仓库和 live E2E | **作业:** `Run repo/live E2E validation`<br />**支撑工作流:** `OpenClaw Live And E2E Checks (Reusable)`<br />**测试:** 仓库 E2E、live 缓存、OpenAI websocket 流式传输、原生 live 提供商和插件分片,以及由 `release_profile` 选择的 Docker 支撑 live 模型/后端/Gateway 网关 harness。<br />**重新运行:** `rerun_group=live-e2e`,可选`live_suite_filter`。 |
| Docker 发布路径 | **作业:** `Run Docker release-path validation`<br />**支撑工作流:** `OpenClaw Live And E2E Checks (Reusable)`<br />**测试:** 针对共享包构件的发布路径 Docker 分块。<br />**重新运行:** `rerun_group=live-e2e` |
| Package Acceptance | **作业:** `Run package acceptance`<br />**支撑工作流:** `Package Acceptance`<br />**测试:** 离线插件包夹具、插件更新,以及针对同一 tarball 的模拟 OpenAI Telegram 包验收。<br />**重新运行:** `rerun_group=package` |
| QA 对等性 | **作业:** `Run QA Lab parity lane``Run QA Lab parity report`<br />**支撑工作流:** 直接作业<br />**测试:** 候选版本和基线的智能体式对等包,然后生成对等性报告。<br />**重新运行:** `rerun_group=qa-parity``rerun_group=qa` |
| QA live Matrix | **作业:** `Run QA Lab live Matrix lane`<br />**支撑工作流:** 直接作业<br />**测试:** `qa-live-shared` 环境中的快速 live Matrix QA profile<br />**重新运行:** `rerun_group=qa-live``rerun_group=qa` |
| QA live Telegram | **作业:** `Run QA Lab live Telegram lane`<br />**支撑工作流:** 直接作业<br />**测试:** 使用 Convex CI 凭证租约的 live Telegram QA。<br />**重新运行:** `rerun_group=qa-live``rerun_group=qa` |
| 发布验证器 | **作业:** `Verify release checks`<br />**支撑工作流:** <br />**测试:** 选定 rerun group 所需的 release-check 作业。<br />**重新运行:** 在聚焦的子作业通过后重新运行。 |
## Docker 发布路径分块
`live_suite_filter` 为空时Docker 发布路径阶段会运行这些分块:
| 分块 | 覆盖范围 |
| --------------------------------------------------------------- | ------------------------------------------------------------------------ |
| `core` | Core Docker 发布路径 smoke lanes。 |
| `package-update-openai` | OpenAI 包安装和更新行为。 |
| `package-update-anthropic` | Anthropic 包安装和更新行为。 |
| `package-update-core` | 提供商中立的包和更新行为。 |
| `plugins-runtime-plugins` | 执行插件行为的插件运行时 lanes。 |
| `plugins-runtime-services` | 服务支撑的插件运行时 lanes按需包含 OpenWebUI。 |
| `plugins-runtime-install-a` through `plugins-runtime-install-h` | 为并行发布验证拆分的插件安装/运行时批次。 |
| 分块 | 覆盖范围 |
| --------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `core` | 核心 Docker 发布路径冒烟通道。 |
| `package-update-openai` | OpenAI 包安装和更新行为。 |
| `package-update-anthropic` | Anthropic 包安装和更新行为。 |
| `package-update-core` | 与提供商无关的包和更新行为。 |
| `plugins-runtime-plugins` | 运行插件行为的插件运行时通道。 |
| `plugins-runtime-services` | 服务支撑的插件运行时通道;按请求包含 OpenWebUI。 |
| `plugins-runtime-install-a` through `plugins-runtime-install-h` | 为并行发布验证拆分的插件安装/运行时批次。 |
当只有一个 Docker lane 失败时,请在可复用的 live/E2E 工作流上使用定向 `docker_lanes=<lane[,lane]>`。发布构件包含按 lane 的重新运行命令,并在可用时带有包构件和镜像复用输入。
当只有一个 Docker 通道失败时,在可复用 live/E2E 工作流上使用定向的 `docker_lanes=<lane[,lane]>`。发布构件包含每个通道的重新运行命令,并在可用时带有包构件和镜像复用输入。
## 发布配置档
## 发布 profile
`release_profile` 只控制发布检查内部的 live/提供商覆盖范围。它不会移除普通完整 CI、Plugin Prerelease、安装 smoke、包验收、QA Lab 或 Docker 发布路径分块。
`release_profile` 主要控制发布检查中的 live/提供商覆盖广度。它不会移除普通完整 CI、Plugin Prerelease、安装冒烟、包验收、QA Lab 或 Docker 发布路径分块。`full` 还会让总控工作流在 `rerun_group=all` 时针对发布包构件运行 Telegram 包 E2E因此完整的发布前候选版本不会默默跳过该 Telegram 包通道。
| 配置档 | 预期用途 | 包含的实时/提供商覆盖范围 |
| 配置档案 | 预期用途 | 包含的实时/提供商覆盖范围 |
| --------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `minimum` | 最快的发布关键冒烟测试。 | OpenAI/核心实时路径、OpenAI 的 Docker 实时模型、原生 Gateway 网关核心、原生 OpenAI Gateway 网关配置档、原生 OpenAI 插件,以及 Docker 实时 Gateway 网关 OpenAI。 |
| `stable` | 默认发布批准配置档。 | `minimum` 加上 Anthropic、Google、MiniMax、后端、原生实时测试框架、Docker 实时 CLI 后端、Docker ACP 绑定、Docker Codex harness以及一个 OpenCode Go 冒烟分片。 |
| `full` | 广泛的咨询性扫描。 | `stable` 加上咨询性提供商、插件实时分片和媒体实时分片。 |
| `minimum` | 最快的发布关键冒烟测试。 | OpenAI/核心实时路径、OpenAI 的 Docker 实时模型、原生 Gateway 网关核心、原生 OpenAI Gateway 网关配置档、原生 OpenAI 插件,以及 Docker 实时 Gateway 网关 OpenAI。 |
| `stable` | 默认发布批准配置档。 | `minimum` 加上 Anthropic、Google、MiniMax、后端、原生实时测试工具、Docker 实时 CLI 后端、Docker ACP 绑定、Docker Codex harness以及一个 OpenCode Go 冒烟分片。 |
| `full` | 广泛的建议性扫描。 | `stable` 加上建议性提供商、插件实时分片和媒体实时分片。 |
## 仅 full 添加
## 仅 Full 的新增
这些套件会被 `stable` 跳过,并由 `full` 包含:
| 区域 | 仅 full 覆盖范围 |
| 区域 | 仅 Full 的覆盖范围 |
| -------------------------------- | ------------------------------------------------------------------------------- |
| Docker 实时模型 | OpenCode Go、OpenRouter、xAI、Z.ai 和 Fireworks。 |
| Docker 实时 Gateway 网关 | DeepSeek、Fireworks、OpenCode Go、OpenRouter、xAI 和 Z.ai 的咨询性分片。 |
| 原生 Gateway 网关提供商配置档 | Fireworks、DeepSeek、完整 OpenCode Go 模型分片、OpenRouter、xAI 和 Z.ai。 |
| 原生插件实时分片 | 插件 A-K、L-N、O-Z 其他、Moonshot 和 xAI。 |
| 原生媒体实时分片 | 音频、Google 音乐、MiniMax 音乐,以及视频组 A-D。 |
| Docker 实时模型 | OpenCode Go、OpenRouter、xAI、Z.ai 和 Fireworks。 |
| Docker 实时 Gateway 网关 | DeepSeek、Fireworks、OpenCode Go、OpenRouter、xAI 和 Z.ai 的建议性分片。 |
| 原生 Gateway 网关提供商配置档 | Fireworks、DeepSeek、完整 OpenCode Go 模型分片、OpenRouter、xAI 和 Z.ai。 |
| 原生插件实时分片 | 插件 A-K、L-N、O-Z 其他、Moonshot 和 xAI。 |
| 原生媒体实时分片 | 音频、Google 音乐、MiniMax 音乐,以及视频组 A-D。 |
`stable` 包含 `native-live-src-gateway-profiles-opencode-go-smoke``full`
改用更广的 OpenCode Go 模型分片。
改用范围更广的 OpenCode Go 模型分片。
## 聚焦重跑
使用 `rerun_group`避免重复运行无关的发布盒:
使用 `rerun_group` 避免重复运行无关的发布盒:
| 句柄 | 范围 |
| ------------------- | ------------------------------------------------- |
| `all` | 所有 Full Release Validation 阶段。 |
| `ci` | 仅手动完整 CI 子项。 |
| `plugin-prerelease` | 仅 Plugin Prerelease 子项。 |
| `release-checks` | 所有 OpenClaw Release Checks 阶段。 |
| `install-smoke` | 从 Install Smoke 到发布检查。 |
| `cross-os` | 跨操作系统发布检查。 |
| 句柄 | 范围 |
| ------------------- | --------------------------------------------------------------------- |
| `all` | 所有 Full Release Validation 阶段。 |
| `ci` | 仅手动完整 CI 子项。 |
| `plugin-prerelease` | 仅插件预发布子项。 |
| `release-checks` | 所有 OpenClaw Release Checks 阶段。 |
| `install-smoke` | 安装冒烟到发布检查。 |
| `cross-os` | 跨操作系统发布检查。 |
| `live-e2e` | 仓库/实时 E2E 和 Docker 发布路径验证。 |
| `package` | Package Acceptance。 |
| `qa` | QA parity 加上 QA 实时通道。 |
| `qa-parity` | 仅 QA parity 通道和报告。 |
| `qa-live` | 仅 QA 实时 Matrix 和 Telegram。 |
| `npm-telegram` | 仅可选的发布后 Telegram E2E。 |
| `package` | Package Acceptance。 |
| `qa` | QA 对等性加 QA 实时通道。 |
| `qa-parity` | 仅 QA 对等性通道和报告。 |
| `qa-live` | 仅 QA 实时 Matrix 和 Telegram。 |
| `npm-telegram` | 已发布包的 Telegram E2E需要 `npm_telegram_package_spec` |
当某个实时套件失败时,将 `live_suite_filter``rerun_group=live-e2e` 一起使用。
有效的过滤器 ID 定义在可复用的实时/E2E workflow 中,包括
有效的过滤器 ID 在可复用实时/E2E 工作流中定义,包括
`docker-live-models`、`live-gateway-docker`、
`live-gateway-anthropic-docker`、`live-gateway-google-docker`、
`live-gateway-minimax-docker`、`live-gateway-advisory-docker`、
@ -130,19 +131,19 @@ gh workflow run full-release-validation.yml \
## 需要保留的证据
保留 `Full Release Validation` 摘要作为发布级索引。它链接
子运行 ID并包含最慢作业表。对于失败,先检查子
workflow然后重跑上面最小匹配的句柄。
保留 `Full Release Validation` 摘要作为发布级索引。它链接
子运行 ID并包含最慢作业表。对于失败先检查子
工作流,然后重跑上方匹配范围最小的句柄。
有用的工件:
- 来自 `OpenClaw Release Checks``release-package-under-test`
- `.artifacts/docker-tests/` 下的 Docker 发布路径工件
- Package Acceptance `package-under-test` 和 Docker 验收工件
- Package Acceptance `package-under-test` 和 Docker 验收工件
- 每个操作系统和套件的跨操作系统发布检查工件
- QA parity、Matrix 和 Telegram 工件
- QA 对等性、Matrix 和 Telegram 工件
## Workflow 文件
## 工作流文件
- `.github/workflows/full-release-validation.yml`
- `.github/workflows/openclaw-release-checks.yml`