chore(i18n): refresh zh-CN translations
This commit is contained in:
parent
c082c85e0e
commit
a9b4c2c0cf
386
docs/zh-CN/ci.md
386
docs/zh-CN/ci.md
@ -1,94 +1,94 @@
|
||||
---
|
||||
read_when:
|
||||
- 你需要了解某个 CI 作业为什么运行或没有运行
|
||||
- 你正在调试一项失败的 GitHub Actions 检查
|
||||
- 你正在协调一次发布验证运行或重新运行
|
||||
- 你需要了解为什么某个 CI 作业运行了或没有运行
|
||||
- 你正在调试一个失败的 GitHub Actions 检查
|
||||
- 你正在协调一次发布验证的运行或重新运行
|
||||
- 你正在更改 ClawSweeper 调度或 GitHub 活动转发
|
||||
summary: 持续集成作业图、范围门禁、发布总括项和本地等效命令
|
||||
summary: CI 作业图、作用域门禁、发布总括任务和本地等价命令
|
||||
title: CI 流水线
|
||||
x-i18n:
|
||||
generated_at: "2026-05-04T22:29:55Z"
|
||||
generated_at: "2026-05-05T01:33:54Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 88d0f7f6cd61d550ec399e8250f685929637cd28638e77aa5a5558775767cac6
|
||||
source_hash: 16771940889d1fa944a5bfafe1152a033d96625595a2d89ff2cedbd3022cee66
|
||||
source_path: ci.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
OpenClaw CI 会在每次推送到 `main` 和每个拉取请求时运行。`preflight` 作业会对差异进行分类,并在只有无关区域发生变化时关闭昂贵的执行通道。手动 `workflow_dispatch` 运行会有意绕过智能作用域限定,并为候选版本和广泛验证展开完整图。Android 通道仍通过 `include_android` 保持选择加入。仅发布使用的插件覆盖位于单独的 [`插件预发布`](#plugin-prerelease) 工作流中,并且只会从 [`完整发布验证`](#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` | 核心 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 相关变更 |
|
||||
| `security-dependency-audit` | 针对 npm advisories 进行无依赖的生产锁文件审计 | 始终在非草稿推送和 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` | 核心 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 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 成功或手动分发 |
|
||||
| `openclaw-performance` | 按日/按需生成 Kova 运行时性能报告,包含 mock provider、深度 profile 和 GPT 5.4 live 通道 | 定时和手动分发 |
|
||||
| `android` | 两种 flavor 的 Android 单元测试加一个 debug APK 构建 | Android 相关变更 |
|
||||
| `test-performance-agent` | 受信任活动后的每日 Codex 慢测试优化 | 主 CI 成功或手动分发 |
|
||||
| `openclaw-performance` | 每日/按需 Kova 运行时性能报告,包含 mock-provider、deep-profile 和 GPT 5.4 live 流水线 | 定时和手动分发 |
|
||||
|
||||
## 快速失败顺序
|
||||
## Fail-fast 顺序
|
||||
|
||||
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 专用清单路径:`preflight`、security,以及单个 `checks-fast-core` 任务。当变更仅限于该快速任务直接覆盖的路由或 helper 表面时,该路径会跳过构建产物、Node 22 兼容性、渠道契约、完整核心分片、内置插件分片和额外守卫矩阵。
|
||||
- **Windows Node 检查**限定于 Windows 专用进程/路径包装器、npm/pnpm/UI runner helper、包管理器配置,以及执行该通道的 CI 工作流表面;无关源码、插件、安装冒烟和仅测试变更仍停留在 Linux Node 通道上。
|
||||
- **CI 工作流编辑**会验证 Node CI 图和工作流 linting,但不会单独强制 Windows、Android 或 macOS 原生构建;这些平台流水线仍限定为平台源代码变更。
|
||||
- **仅 CI 路由编辑、选定的廉价核心测试 fixture 编辑,以及窄范围插件契约 helper/测试路由编辑**使用快速 Node-only 清单路径:`preflight`、security 和单个 `checks-fast-core` 任务。当变更仅限于该快速任务直接执行的路由或 helper 表面时,该路径会跳过构建产物、Node 22 兼容性、渠道契约、完整核心分片、内置插件分片和额外守卫矩阵。
|
||||
- **Windows Node 检查**限定于 Windows 专用进程/路径 wrapper、npm/pnpm/UI runner helper、包管理器配置,以及执行该流水线的 CI 工作流表面;无关源码、插件、install-smoke 和仅测试变更仍留在 Linux Node 流水线上。
|
||||
|
||||
最慢的 Node 测试族会被拆分或平衡,使每个作业保持较小规模而不过度预留 runner:渠道契约作为三个加权分片运行,核心单元 fast/support 通道单独运行,核心运行时基础设施在 state 和 process/config 分片之间拆分,auto-reply 作为平衡 worker 运行(reply 子树拆分为 agent-runner、dispatch 和 commands/state-routing 分片),而 agentic gateway/server 配置会跨 chat/auth/model/http-plugin/runtime/startup 通道拆分,而不是等待构建产物。广泛的浏览器、QA、媒体和杂项插件测试使用各自专用的 Vitest 配置,而不是共享插件 catch-all。include-pattern 分片会使用 CI 分片名称记录计时条目,因此 `.artifacts/vitest-shard-timings.json` 可以区分整个配置和过滤后的分片。`check-additional` 将包边界编译/canary 工作保持在一起,并把运行时拓扑架构与 Gateway 网关 watch 覆盖分离;边界守卫列表按四个矩阵分片条带化,每个分片并发运行选定的独立守卫并打印每项检查的计时,包括 `pnpm prompt:snapshots:check`,这样 Codex 运行时 happy-path 提示词漂移会固定到造成它的 PR。Gateway 网关 watch、渠道测试和核心 support-boundary 分片会在 `dist/` 和 `dist-runtime/` 已构建完成后,在 `build-artifacts` 内并发运行。
|
||||
最慢的 Node 测试族会被拆分或均衡,使每个作业保持较小规模且不过度预留 runner:渠道契约作为三个加权分片运行,核心单元 fast/support 流水线单独运行,核心运行时基础设施拆分为 state 和 process/config 分片,auto-reply 以均衡 worker 运行(reply 子树拆分为 agent-runner、dispatch 和 commands/state-routing 分片),agentic Gateway 网关/server 配置拆分到 chat/auth/model/http-plugin/runtime/startup 流水线,而不是等待构建产物。广泛的浏览器、QA、媒体和杂项插件测试使用各自专用的 Vitest 配置,而不是共享插件 catch-all。Include-pattern 分片使用 CI 分片名称记录 timing 条目,因此 `.artifacts/vitest-shard-timings.json` 可以区分整个配置和过滤后的分片。`check-additional` 将 package-boundary compile/canary 工作放在一起,并将运行时拓扑架构与 Gateway 网关 watch 覆盖分开;边界守卫列表跨四个矩阵分片条带化,每个分片并发运行选定的独立守卫并打印每项检查的 timing,包括 `pnpm prompt:snapshots:check`,这样 Codex 运行时 happy-path 提示词漂移会固定到导致它的 PR 上。Gateway 网关 watch、渠道测试和核心 support-boundary 分片会在 `dist/` 和 `dist-runtime/` 已经构建完成后,在 `build-artifacts` 内并发运行。
|
||||
|
||||
Android CI 会运行 `testPlayDebugUnitTest` 和 `testThirdPartyDebugUnitTest`,然后构建 Play debug APK。third-party flavor 没有单独的 source set 或 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 无法静态解析的有意动态插件、生成内容、构建、live-test 和包桥接表面。
|
||||
`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 和包桥接表面。
|
||||
|
||||
## ClawSweeper 活动转发
|
||||
|
||||
`.github/workflows/clawsweeper-dispatch.yml` 是从 OpenClaw 仓库活动到 ClawSweeper 的目标侧桥接。它不会检出或执行不受信任的拉取请求代码。该工作流会从 `CLAWSWEEPER_APP_PRIVATE_KEY` 创建 GitHub App 令牌,然后向 `openclaw/clawsweeper` 分发紧凑的 `repository_dispatch` payload。
|
||||
`.github/workflows/clawsweeper-dispatch.yml` 是从 OpenClaw 仓库活动到 ClawSweeper 的目标侧桥接。它不会检出或执行不受信任的拉取请求代码。该工作流会从 `CLAWSWEEPER_APP_PRIVATE_KEY` 创建 GitHub App token,然后向 `openclaw/clawsweeper` 分发紧凑的 `repository_dispatch` payload。
|
||||
|
||||
该工作流有四个通道:
|
||||
该工作流有四条流水线:
|
||||
|
||||
- `clawsweeper_item` 用于精确的问题和拉取请求 review 请求;
|
||||
- `clawsweeper_comment` 用于 issue comments 中的显式 ClawSweeper 命令;
|
||||
- `clawsweeper_commit_review` 用于 `main` 推送上的 commit 级 review 请求;
|
||||
- `github_activity` 用于 ClawSweeper 智能体可能检查的一般 GitHub 活动。
|
||||
- `clawsweeper_item` 用于精确的 issue 和拉取请求审查请求;
|
||||
- `clawsweeper_comment` 用于 issue 评论中的显式 ClawSweeper 命令;
|
||||
- `clawsweeper_commit_review` 用于 `main` 推送上的提交级审查请求;
|
||||
- `github_activity` 用于 ClawSweeper agent 可能检查的一般 GitHub 活动。
|
||||
|
||||
`github_activity` 通道仅转发规范化元数据:事件类型、操作、actor、仓库、项目编号、URL、标题、状态,以及存在时评论或 review 的短摘录。它有意避免转发完整 webhook body。`openclaw/clawsweeper` 中的接收工作流是 `.github/workflows/github-activity.yml`,它会把规范化事件发布到用于 ClawSweeper 智能体的 OpenClaw Gateway 网关 hook。
|
||||
`github_activity` 流水线仅转发规范化元数据:事件类型、操作、actor、仓库、条目编号、URL、标题、状态,以及存在评论或审查时的短摘录。它有意避免转发完整 webhook body。`openclaw/clawsweeper` 中的接收工作流是 `.github/workflows/github-activity.yml`,它会将规范化事件发布到 OpenClaw Gateway 网关 hook,供 ClawSweeper agent 使用。
|
||||
|
||||
一般活动是观察,而不是默认投递。ClawSweeper 智能体会在提示词中收到 Discord 目标,并且只应在事件令人意外、可操作、有风险或对运维有用时发布到 `#clawsweeper`。常规打开、编辑、机器人 churn、重复 webhook 噪声和正常 review 流量应产生 `NO_REPLY`。
|
||||
一般活动是观察,而不是默认投递。ClawSweeper agent 会在其提示词中接收 Discord 目标,并且只有当事件令人意外、可操作、有风险或对运营有用时,才应发布到 `#clawsweeper`。常规打开、编辑、bot 变动、重复 webhook 噪声和正常审查流量都应产生 `NO_REPLY`。
|
||||
|
||||
在整个路径中,将 GitHub 标题、评论、正文、review 文本、分支名称和 commit 消息视为不受信任的数据。它们是摘要和分诊的输入,不是工作流或智能体运行时的指令。
|
||||
在这条路径中,始终将 GitHub 标题、评论、正文、审查文本、分支名称和提交消息视为不受信任的数据。它们是摘要和分流的输入,而不是工作流或 agent 运行时的指令。
|
||||
|
||||
## 手动分发
|
||||
|
||||
手动 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` 工作流时运行。
|
||||
手动 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` 工作流并启用发布验证门禁时运行。
|
||||
|
||||
手动运行使用唯一的并发组,因此发布候选的完整套件不会被同一 ref 上的另一次 push 或 PR 运行取消。可选的 `target_ref` 输入允许受信任的调用方针对某个分支、标签或完整提交 SHA 运行该作业图,同时使用所选调度 ref 中的工作流文件。
|
||||
手动运行使用唯一的并发组,因此候选发布版本的完整套件不会被同一 ref 上的其他 push 或 PR 运行取消。可选的 `target_ref` 输入允许受信任的调用方在使用所选触发 ref 中工作流文件的同时,针对某个分支、标签或完整提交 SHA 运行该作业图。
|
||||
|
||||
```bash
|
||||
gh workflow run ci.yml --ref release/YYYY.M.D
|
||||
@ -100,15 +100,15 @@ gh workflow run full-release-validation.yml --ref main -f ref=<branch-or-sha>
|
||||
|
||||
| 运行器 | 作业 |
|
||||
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `ubuntu-24.04` | `preflight`、快速安全作业和聚合作业(`security-scm-fast`、`security-dependency-audit`、`security-fast`)、快速协议/契约/内置检查、分片渠道契约检查、除 lint 外的 `check` 分片、`check-additional` 分片和聚合作业、Node 测试聚合验证器、文档检查、Python Skills、workflow-sanity、labeler、auto-response;install-smoke 预检也使用 GitHub 托管的 Ubuntu,以便 Blacksmith 矩阵可以更早排队 |
|
||||
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`、较轻量的插件分片、`checks-fast-core`、`checks-node-compat-node22`、`check-prod-types` 和 `check-test-types` |
|
||||
| `ubuntu-24.04` | `preflight`、快速安全作业和聚合(`security-scm-fast`、`security-dependency-audit`、`security-fast`)、快速协议/契约/内置检查、分片渠道契约检查、除 lint 之外的 `check` 分片、`check-additional` 分片和聚合、Node 测试聚合验证器、文档检查、Python Skills、workflow-sanity、labeler、auto-response;install-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` |
|
||||
| `blacksmith-6vcpu-macos-latest` | `openclaw/openclaw` 上的 `macos-node`;fork 回退到 `macos-latest` |
|
||||
| `blacksmith-12vcpu-macos-latest` | `openclaw/openclaw` 上的 `macos-swift`;fork 回退到 `macos-latest` |
|
||||
|
||||
## 本地等效命令
|
||||
## 本地等价命令
|
||||
|
||||
```bash
|
||||
pnpm changed:lanes # inspect the local changed-lane classifier for origin/main...HEAD
|
||||
@ -137,7 +137,7 @@ pnpm perf:kova:summary --report .artifacts/kova/reports/mock-provider/report.jso
|
||||
|
||||
## OpenClaw 性能
|
||||
|
||||
`OpenClaw Performance` 是产品/运行时性能工作流。它每天在 `main` 上运行,也可以手动调度:
|
||||
`OpenClaw Performance` 是产品/运行时性能工作流。它每天在 `main` 上运行,也可以手动触发:
|
||||
|
||||
```bash
|
||||
gh workflow run openclaw-performance.yml --ref main -f profile=diagnostic -f repeat=3
|
||||
@ -145,25 +145,25 @@ gh workflow run openclaw-performance.yml --ref main -f profile=smoke -f repeat=1
|
||||
gh workflow run openclaw-performance.yml --ref main -f target_ref=v2026.5.2 -f profile=diagnostic -f repeat=3
|
||||
```
|
||||
|
||||
手动调度通常会对工作流 ref 进行基准测试。设置 `target_ref` 可使用当前工作流实现对发布标签或其他分支进行基准测试。发布的报告路径和 latest 指针按被测试的 ref 建立键名,每个 `index.md` 都记录被测试的 ref/SHA、工作流 ref/SHA、Kova ref、profile、通道鉴权模式、模型、重复次数和场景过滤器。
|
||||
手动触发通常会对工作流 ref 进行基准测试。设置 `target_ref` 可使用当前工作流实现对发布标签或其他分支进行基准测试。已发布报告路径和 latest 指针按被测试 ref 编排,每个 `index.md` 都会记录被测试的 ref/SHA、工作流 ref/SHA、Kova ref、profile、通道认证模式、模型、重复次数和场景过滤器。
|
||||
|
||||
该工作流会从固定发布版本安装 OCM,并从 `openclaw/Kova` 的固定 `kova_ref` 输入安装 Kova,然后运行三个通道:
|
||||
该工作流会从固定版本安装 OCM,并从 `openclaw/Kova` 的固定 `kova_ref` 输入安装 Kova,然后运行三个通道:
|
||||
|
||||
- `mock-provider`:针对本地构建运行时运行 Kova 诊断场景,并使用确定性的假 OpenAI 兼容鉴权。
|
||||
- `mock-deep-profile`:针对启动、Gateway 网关和智能体回合热点进行 CPU/堆/跟踪分析。
|
||||
- `live-gpt54`:真实的 OpenAI `openai/gpt-5.4` 智能体回合,在 `OPENAI_API_KEY` 不可用时跳过。
|
||||
- `mock-provider`:Kova 诊断场景,针对使用确定性伪 OpenAI 兼容认证的本地构建运行时。
|
||||
- `mock-deep-profile`:针对启动、Gateway 网关和智能体轮次热点的 CPU/堆/跟踪性能分析。
|
||||
- `live-gpt54`:一次真实的 OpenAI `openai/gpt-5.4` 智能体轮次;当 `OPENAI_API_KEY` 不可用时跳过。
|
||||
|
||||
mock-provider 通道还会在 Kova 通过后运行 OpenClaw 原生源码探针:默认、钩子和 50 插件启动场景下的 Gateway 网关启动耗时和内存;重复的 mock-OpenAI `channel-chat-baseline` hello 循环;以及针对已启动 Gateway 网关的 CLI 启动命令。源码探针 Markdown 摘要位于报告包中的 `source/index.md`,原始 JSON 位于旁边。
|
||||
mock-provider 通道还会在 Kova 通过后运行 OpenClaw 原生源码探测:默认、hook 和 50 插件启动场景下的 Gateway 网关启动时间和内存;重复的 mock-OpenAI `channel-chat-baseline` hello 循环;以及针对已启动 Gateway 网关的 CLI 启动命令。源码探测 Markdown 摘要位于报告包中的 `source/index.md`,原始 JSON 放在旁边。
|
||||
|
||||
每个通道都会上传 GitHub artifacts。配置 `CLAWGRIT_REPORTS_TOKEN` 后,该工作流还会将 `report.json`、`report.md`、包、`index.md` 和源码探针 artifacts 提交到 `openclaw/clawgrit-reports` 的 `openclaw-performance/<tested-ref>/<run-id>-<attempt>/<lane>/` 下。当前被测试 ref 指针会写入为 `openclaw-performance/<tested-ref>/latest-<lane>.json`。
|
||||
每个通道都会上传 GitHub 构件。配置 `CLAWGRIT_REPORTS_TOKEN` 后,该工作流还会将 `report.json`、`report.md`、包、`index.md` 和源码探测构件提交到 `openclaw/clawgrit-reports`,路径为 `openclaw-performance/<tested-ref>/<run-id>-<attempt>/<lane>/`。当前被测试 ref 指针会写入为 `openclaw-performance/<tested-ref>/latest-<lane>.json`。
|
||||
|
||||
## 完整发布验证
|
||||
|
||||
`Full Release Validation` 是用于“发布前运行所有内容”的手动总控工作流。它接受分支、标签或完整提交 SHA,使用该目标调度手动 `CI` 工作流,调度 `Plugin Prerelease` 以获得仅发布使用的插件/包/静态/Docker 证明,并调度 `OpenClaw Release Checks` 以执行安装冒烟、包验收、跨 OS 包检查、QA Lab parity、Matrix 和 Telegram 通道。稳定/默认运行会把详尽的 live/E2E 和 Docker 发布路径覆盖保留在 `run_release_soak=true` 后面;`release_profile=full` 会强制启用该 soak 覆盖,以保持广泛的公告验证覆盖范围。当 `rerun_group=all` 且 `release_profile=full` 时,它还会针对来自 release checks 的 `release-package-under-test` artifact 运行 `NPM Telegram Beta E2E`。发布后,传递 `npm_telegram_package_spec` 可针对已发布的 npm 包重新运行同一 Telegram 包通道。
|
||||
`Full Release Validation` 是用于“发布前运行所有内容”的手动总括工作流。它接受分支、标签或完整提交 SHA,使用该目标触发手动 `CI` 工作流,触发 `Plugin Prerelease` 以提供仅发布使用的插件/包/静态/Docker 证明,并触发 `OpenClaw Release Checks` 以执行安装冒烟、包验收、跨 OS 包检查、QA Lab parity、Matrix 和 Telegram 通道。稳定版/默认运行会把完整的 live/E2E 和 Docker 发布路径覆盖保留在 `run_release_soak=true` 之后;`release_profile=full` 会强制启用该 soak 覆盖,因此广泛的 advisory 验证仍然保持广泛。使用 `rerun_group=all` 和 `release_profile=full` 时,它还会针对来自 release checks 的 `release-package-under-test` 构件运行 `NPM Telegram Beta E2E`。发布后,传入 `npm_telegram_package_spec` 可针对已发布的 npm 包重新运行同一个 Telegram 包通道。
|
||||
|
||||
请参阅[完整发布验证](/zh-CN/reference/full-release-validation),了解阶段矩阵、精确的工作流作业名称、profile 差异、artifacts 和聚焦重新运行句柄。
|
||||
请参阅[完整发布验证](/zh-CN/reference/full-release-validation),了解阶段矩阵、确切工作流作业名称、profile 差异、构件和定向重运行句柄。
|
||||
|
||||
`OpenClaw Release Publish` 是会执行变更的手动发布工作流。在发布标签已存在且 OpenClaw npm 预检已成功后,从 `release/YYYY.M.D` 或 `main` 调度它。它会验证 `pnpm plugins:sync:check`,为所有可发布的插件包调度 `Plugin NPM Release`,为同一发布 SHA 调度 `Plugin ClawHub Release`,然后才会使用已保存的 `preflight_run_id` 调度 `OpenClaw NPM Release`。
|
||||
`OpenClaw Release Publish` 是手动的变更型发布工作流。发布标签存在且 OpenClaw npm preflight 成功后,从 `release/YYYY.M.D` 或 `main` 触发它。它会验证 `pnpm plugins:sync:check`,为所有可发布插件包触发 `Plugin NPM Release`,为同一发布 SHA 触发 `Plugin ClawHub Release`,然后才会使用保存的 `preflight_run_id` 触发 `OpenClaw NPM Release`。
|
||||
|
||||
```bash
|
||||
gh workflow run openclaw-release-publish.yml \
|
||||
@ -179,29 +179,29 @@ gh workflow run openclaw-release-publish.yml \
|
||||
pnpm ci:full-release --sha <full-sha>
|
||||
```
|
||||
|
||||
GitHub 工作流调度 ref 必须是分支或标签,不能是原始提交 SHA。该辅助命令会在目标 SHA 处推送一个临时 `release-ci/<sha>-...` 分支,从该固定 ref 调度 `Full Release Validation`,验证每个子工作流的 `headSha` 都与目标匹配,并在运行完成后删除临时分支。如果任何子工作流运行在不同的 SHA 上,总控验证器也会失败。
|
||||
GitHub 工作流触发 ref 必须是分支或标签,不能是原始提交 SHA。该辅助命令会在目标 SHA 处推送一个临时 `release-ci/<sha>-...` 分支,从该固定 ref 触发 `Full Release Validation`,验证每个子工作流的 `headSha` 都与目标匹配,并在运行完成时删除临时分支。如果任何子工作流运行在不同的 SHA 上,总括验证器也会失败。
|
||||
|
||||
`release_profile` 控制传递给发布检查的实时/提供商覆盖范围。手动发布工作流默认使用 `stable`;只有在你有意需要广泛的 advisory 提供商/媒体矩阵时,才使用 `full`。`run_release_soak` 控制稳定/默认发布检查是否运行穷尽式实时/E2E 和 Docker 发布路径 soak;`full` 会强制开启 soak。
|
||||
`release_profile` 控制传递给发布检查的实时/提供商覆盖范围。手动发布工作流默认使用 `stable`;只有在你有意需要宽泛的 advisory provider/media 矩阵时才使用 `full`。`run_release_soak` 控制 stable/default 发布检查是否运行详尽的实时/E2E 和 Docker 发布路径 soak;`full` 会强制启用 soak。
|
||||
|
||||
- `minimum` 保留最快的 OpenAI/core 发布关键通道。
|
||||
- `stable` 添加稳定的提供商/后端集合。
|
||||
- `full` 运行广泛的 advisory 提供商/媒体矩阵。
|
||||
- `stable` 添加 stable provider/backend 集合。
|
||||
- `full` 运行宽泛的 advisory provider/media 矩阵。
|
||||
|
||||
总控工作流会记录已分派的子运行 ID,最终的 `Verify full validation` 作业会重新检查当前子运行结论,并为每个子运行附加最慢作业表。如果某个子工作流重新运行后变绿,只需重新运行父验证作业,以刷新总控结果和时间摘要。
|
||||
总控流程会记录已调度的子运行 ID,最终的 `Verify full validation` 作业会重新检查当前子运行结论,并为每个子运行追加最慢作业表。如果某个子工作流被重新运行并转为绿色,只需重新运行父级 verifier 作业,以刷新总控结果和耗时摘要。
|
||||
|
||||
对于恢复,`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`;仅正常 full CI 子项使用 `ci`;仅插件预发布子项使用 `plugin-prerelease`;每个发布子项使用 `release-checks`;也可以在总控流程上使用更窄的分组:`install-smoke`、`cross-os`、`live-e2e`、`package`、`qa`、`qa-parity`、`qa-live` 或 `npm-telegram`。这样可以在完成聚焦修复后,将失败发布环境的重跑范围控制住。对于单个失败的 cross-OS 通道,将 `rerun_group=cross-os` 与 `cross_os_suite_filter` 结合使用,例如 `windows/packaged-upgrade`;长时间运行的 cross-OS 命令会输出 heartbeat 行,packaged-upgrade 摘要会包含各阶段耗时。QA release-check 通道是 advisory,因此仅 QA 失败会发出警告,但不会阻塞 release-check verifier。
|
||||
|
||||
`OpenClaw Release Checks` 使用受信任的工作流引用,将选定引用解析一次为 `release-package-under-test` tarball,然后把该产物传递给跨 OS 检查和 Package Acceptance,并在运行 soak 覆盖时传递给实时/E2E 发布路径 Docker 工作流。这样可以让发布盒子之间的包字节保持一致,并避免在多个子作业中重新打包同一个候选版本。
|
||||
`OpenClaw Release Checks` 使用受信任的工作流 ref 将选定 ref 一次解析为 `release-package-under-test` tarball,然后将该 artifact 传递给 cross-OS 检查和包验收,以及在运行 soak 覆盖时传递给 live/E2E 发布路径 Docker 工作流。这样可以让各个发布环境中的包字节保持一致,并避免在多个子作业中重复打包同一个候选版本。
|
||||
|
||||
`ref=main` 和 `rerun_group=all` 的重复 `Full Release Validation` 运行会取代较旧的总控。父监视器会在父运行被取消时,取消它已经分派的任何子工作流,因此较新的 main 验证不会排在陈旧的两小时发布检查运行之后。发布分支/标签验证和聚焦重跑组会保持 `cancel-in-progress: false`。
|
||||
针对 `ref=main` 和 `rerun_group=all` 的重复 `Full Release Validation` 运行会取代较旧的总控流程。当父级被取消时,父级 monitor 会取消它已调度的任何子工作流,因此较新的 main 验证不会排在过期的两小时 release-check 运行之后。发布分支/tag 验证和聚焦重跑分组会保持 `cancel-in-progress: false`。
|
||||
|
||||
## 实时和 E2E 分片
|
||||
|
||||
发布实时/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`
|
||||
- 提供商过滤的 `native-live-src-gateway-profiles` 作业
|
||||
- provider-filtered `native-live-src-gateway-profiles` 作业
|
||||
- `native-live-src-gateway-backends`
|
||||
- `native-live-test`
|
||||
- `native-live-extensions-a-k`
|
||||
@ -209,59 +209,59 @@ GitHub 工作流调度 ref 必须是分支或标签,不能是原始提交 SHA
|
||||
- `native-live-extensions-openai`
|
||||
- `native-live-extensions-o-z-other`
|
||||
- `native-live-extensions-xai`
|
||||
- 拆分的媒体音频/视频分片,以及提供商过滤的音乐分片
|
||||
- 拆分后的媒体音频/视频分片,以及 provider-filtered 音乐分片
|
||||
|
||||
这会保持相同的文件覆盖,同时让缓慢的实时提供商失败更容易重跑和诊断。聚合的 `native-live-extensions-o-z`、`native-live-extensions-media` 和 `native-live-extensions-media-music` 分片名称仍然可用于手动一次性重跑。
|
||||
这会保持相同的文件覆盖,同时让缓慢的实时提供商失败更容易重跑和诊断。聚合分片名称 `native-live-extensions-o-z`、`native-live-extensions-media` 和 `native-live-extensions-media-music` 对手动一次性重跑仍然有效。
|
||||
|
||||
原生实时媒体分片在 `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04` 中运行,该镜像由 `Live Media Runner Image` 工作流构建。该镜像预装了 `ffmpeg` 和 `ffprobe`;媒体作业只在设置前验证这些二进制文件。将 Docker 支持的实时套件保留在普通 Blacksmith runner 上,容器作业不适合启动嵌套 Docker 测试。
|
||||
原生实时媒体分片在 `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04` 中运行,该镜像由 `Live Media Runner Image` 工作流构建。该镜像预装了 `ffmpeg` 和 `ffprobe`;媒体作业只会在设置前验证这些二进制文件。将 Docker 支持的实时套件保留在普通 Blacksmith runner 上运行,因为容器作业不适合启动嵌套 Docker 测试。
|
||||
|
||||
Docker 支持的实时模型/后端分片会为每个选定提交使用单独的共享 `ghcr.io/openclaw/openclaw-live-test:<sha>` 镜像。实时发布工作流只构建并推送该镜像一次,然后 Docker 实时模型、按提供商分片的 Gateway 网关、CLI 后端、ACP 绑定和 Codex harness 分片会使用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行。Gateway 网关 Docker 分片带有明确的脚本级 `timeout` 上限,低于工作流作业超时,因此卡住的容器或清理路径会快速失败,而不是耗尽整个发布检查预算。如果这些分片独立重建完整源 Docker 目标,则表示发布运行配置错误,并会在重复镜像构建上浪费墙钟时间。
|
||||
Docker 支持的实时 model/backend 分片会为每个选定提交使用一个单独共享的 `ghcr.io/openclaw/openclaw-live-test:<sha>` 镜像。实时发布工作流会构建并推送该镜像一次,然后 Docker 实时模型、按提供商分片的 Gateway 网关、CLI 后端、ACP bind 和 Codex harness 分片会以 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行。Gateway 网关 Docker 分片带有显式的脚本级 `timeout` 上限,低于工作流作业超时时间,因此卡住的容器或清理路径会快速失败,而不是耗尽整个 release-check 预算。如果这些分片独立重建完整 source Docker target,则发布运行配置有误,并会把 wall clock 浪费在重复镜像构建上。
|
||||
|
||||
## Package Acceptance
|
||||
## 包验收
|
||||
|
||||
当问题是“这个可安装的 OpenClaw 包作为产品是否可用?”时,使用 `Package Acceptance`。它不同于普通 CI:普通 CI 验证源码树,而包验收会通过用户在安装或更新后实际使用的同一个 Docker E2E harness 验证单个 tarball。
|
||||
当问题是“这个可安装的 OpenClaw 包作为产品是否可用?”时,使用 `Package Acceptance`。它不同于普通 CI:普通 CI 验证 source tree,而包验收会通过用户在安装或更新后使用的同一个 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 步骤摘要中打印来源、工作流引用、包引用、版本、SHA-256 和配置文件。
|
||||
2. `docker_acceptance` 使用 `ref=workflow_ref` 和 `package_artifact_name=package-under-test` 调用 `openclaw-live-and-e2e-checks-reusable.yml`。可复用工作流会下载该产物,验证 tarball 清单,在需要时准备包摘要 Docker 镜像,并针对该包运行选定的 Docker 通道,而不是打包工作流检出内容。当某个配置文件选择多个定向 `docker_lanes` 时,可复用工作流会准备一次包和共享镜像,然后将这些通道扇出为并行的定向 Docker 作业,并使用唯一产物。
|
||||
3. `package_telegram` 可选调用 `NPM Telegram Beta E2E`。当 `telegram_mode` 不是 `none` 时运行,并在 Package Acceptance 已解析包时安装同一个 `package-under-test` 产物;独立 Telegram 分派仍可安装已发布的 npm spec。
|
||||
1. `resolve_package` 检出 `workflow_ref`,解析一个包候选,写入 `.artifacts/docker-e2e-package/openclaw-current.tgz`,写入 `.artifacts/docker-e2e-package/package-candidate.json`,将两者都作为 `package-under-test` artifact 上传,并在 GitHub step summary 中打印来源、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`。可复用工作流会下载该 artifact、验证 tarball 清单、在需要时准备 package-digest Docker 镜像,并针对该包运行选定 Docker 通道,而不是打包工作流 checkout。当一个 profile 选择多个目标 `docker_lanes` 时,可复用工作流会准备一次包和共享镜像,然后将这些通道扇出为并行的目标 Docker 作业,并带有唯一 artifact。
|
||||
3. `package_telegram` 可选调用 `NPM Telegram Beta E2E`。当 `telegram_mode` 不是 `none` 时运行;如果包验收已解析出一个包,它会安装同一个 `package-under-test` artifact;独立 Telegram 调度仍可安装已发布的 npm spec。
|
||||
4. `summary` 会在包解析、Docker 验收或可选 Telegram 通道失败时使工作流失败。
|
||||
|
||||
### 候选来源
|
||||
|
||||
- `source=npm` 只接受 `openclaw@beta`、`openclaw@latest`,或精确的 OpenClaw 发布版本,例如 `openclaw@2026.4.27-beta.2`。将其用于已发布的预发布/稳定验收。
|
||||
- `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`。将它用于已发布的 prerelease/stable 验收。
|
||||
- `source=ref` 会打包一个受信任的 `package_ref` 分支、tag 或完整提交 SHA。解析器会获取 OpenClaw 分支/tag,验证选定提交可从仓库分支历史或发布 tag 访问,在 detached 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` 是运行测试的受信任 workflow/harness 代码。`package_ref` 是在 `source=ref` 时会被打包的源提交。这让当前测试 harness 能够验证较旧的受信任源提交,而无需运行旧工作流逻辑。
|
||||
|
||||
### 套件配置文件
|
||||
### 套件 profile
|
||||
|
||||
- `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 发布路径分块
|
||||
- `full` — 带 OpenWebUI 的完整 Docker 发布路径 chunks
|
||||
- `custom` — 精确的 `docker_lanes`;当 `suite_profile=custom` 时必需
|
||||
|
||||
`package` 配置文件使用离线插件覆盖,因此已发布包验证不会受实时 ClawHub 可用性影响。可选 Telegram 通道会在 `NPM Telegram Beta E2E` 中复用 `package-under-test` 产物,同时保留已发布 npm spec 路径用于独立分派。
|
||||
`package` profile 使用离线插件覆盖,因此已发布包验证不会受实时 ClawHub 可用性限制。可选 Telegram 通道会在 `NPM Telegram Beta E2E` 中复用 `package-under-test` artifact,并为独立调度保留已发布 npm spec 路径。
|
||||
|
||||
关于专用更新和插件测试策略,包括本地命令、Docker 通道、Package Acceptance 输入、发布默认值和失败分类,请参阅[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
|
||||
有关专门的更新和插件测试策略,包括本地命令、Docker 通道、包验收输入、发布默认值和失败分诊,请参阅[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
|
||||
|
||||
发布检查会使用 `source=artifact`、准备好的发布包产物、`suite_profile=custom`、`docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'` 和 `telegram_mode=mock-openai` 调用 Package Acceptance。这会让包迁移、更新、陈旧插件依赖清理、已配置插件安装修复、离线插件、插件更新和 Telegram 证明都基于同一个已解析的包 tarball。在 Full Release Validation 或 OpenClaw Release Checks 上设置 `package_acceptance_package_spec`,即可针对已发布的 npm 包而不是按 SHA 构建的产物运行同一个矩阵。跨 OS 发布检查仍然覆盖 OS 特定的新手引导、安装器和平台行为;包/更新产品验证应从 Package Acceptance 开始。`published-upgrade-survivor` Docker 通道会在阻塞发布路径中为每次运行验证一个已发布包基线。在 Package Acceptance 中,已解析的 `package-under-test` tarball 始终是候选包,`published_upgrade_survivor_baseline` 选择回退的已发布基线,默认是 `openclaw@latest`;失败通道重跑命令会保留该基线。带 `run_release_soak=true` 或 `release_profile=full` 的 Full Release Validation 会设置 `published_upgrade_survivor_baselines=all-since-2026.4.23` 和 `published_upgrade_survivor_scenarios=reported-issues`,以扩展覆盖从 `2026.4.23` 到 `latest` 的每个稳定 npm 发布,以及针对 Feishu 配置、保留的 bootstrap/persona 文件、已配置的 OpenClaw 插件安装、波浪号日志路径和陈旧旧版插件依赖根的问题形状 fixture。单独的 `Update Migration` 工作流在问题是穷尽式已发布更新清理,而不是普通 Full Release CI 覆盖范围时,使用带 `all-since-2026.4.23` 和 `plugin-deps-cleanup` 的 `update-migration` Docker 通道。本地聚合运行可以通过 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 传入精确包 spec,通过 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 保持单个通道,例如 `openclaw@2026.4.15`,或设置 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 用于场景矩阵。已发布通道会用内置的 `openclaw config set` 命令配方配置基线,在 `summary.json` 中记录配方步骤,并在 Gateway 网关启动后探测 `/healthz`、`/readyz` 以及 RPC Status。Windows 打包和安装器全新通道还会验证已安装包可以从原始绝对 Windows 路径导入浏览器控制覆盖。OpenAI 跨 OS agent turn smoke 在设置时默认使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用 `openai/gpt-5.4`,因此安装和 Gateway 网关证明会保持在 GPT-5 测试模型上,同时避免 GPT-4.x 默认值。
|
||||
发布检查会使用 `source=artifact`、准备好的发布包 artifact、`suite_profile=custom`、`docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'` 和 `telegram_mode=mock-openai` 调用包验收。这样可以让包迁移、更新、陈旧插件依赖清理、已配置插件安装修复、离线插件、插件更新和 Telegram 证明都基于同一个已解析的包 tarball。设置 Full Release Validation 或 OpenClaw Release Checks 上的 `package_acceptance_package_spec`,可以针对已发布的 npm 包运行同一个矩阵,而不是针对 SHA 构建的 artifact。Cross-OS 发布检查仍覆盖 OS 特定的新手引导、安装程序和平台行为;包/更新产品验证应从包验收开始。`published-upgrade-survivor` Docker 通道会在阻塞发布路径中为每次运行验证一个已发布包基线。在包验收中,解析出的 `package-under-test` tarball 始终是候选版本,而 `published_upgrade_survivor_baseline` 会选择 fallback 已发布基线,默认值为 `openclaw@latest`;失败通道重跑命令会保留该基线。带有 `run_release_soak=true` 或 `release_profile=full` 的 Full Release Validation 会设置 `published_upgrade_survivor_baselines=all-since-2026.4.23` 和 `published_upgrade_survivor_scenarios=reported-issues`,以扩展覆盖从 `2026.4.23` 到 `latest` 的每个 stable npm release,以及面向问题的 fixtures,涵盖 Feishu 配置、保留的 bootstrap/persona 文件、已配置的 OpenClaw 插件安装、波浪号日志路径和陈旧的 legacy 插件依赖根。单独的 `Update Migration` 工作流在问题是详尽的已发布更新清理,而不是普通 Full Release CI 覆盖范围时,会使用 `update-migration` Docker 通道以及 `all-since-2026.4.23` 和 `plugin-deps-cleanup`。本地聚合运行可以通过 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 传递精确包 spec;也可以通过 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 保留单个通道,例如 `openclaw@2026.4.15`;或者设置 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 以运行场景矩阵。已发布通道会使用内置的 `openclaw config set` 命令 recipe 配置基线,在 `summary.json` 中记录 recipe 步骤,并在 Gateway 网关启动后探测 `/healthz`、`/readyz` 以及 RPC status。Windows packaged 和 installer fresh 通道还会验证已安装包能够从原始绝对 Windows 路径导入 browser-control override。OpenAI cross-OS agent-turn smoke 在已设置时默认使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用 `openai/gpt-5.4`,因此安装和 Gateway 网关证明会保留在 GPT-5 测试模型上,同时避免 GPT-4.x 默认值。
|
||||
|
||||
### 旧版兼容窗口
|
||||
|
||||
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` 可以跳过 `gateway install --wrapper` 持久化子用例;
|
||||
- `update-channel-switch` 可以从 tarball 派生的假 git fixture 中剪除缺失的 `pnpm.patchedDependencies`,并可以记录缺失的持久化 `update.channel`;
|
||||
- 插件 smoke 可以读取旧版安装记录位置,或接受缺失的 marketplace 安装记录持久化;
|
||||
- `plugin-update` 可以允许配置元数据迁移,同时仍要求安装记录和无重装行为保持不变。
|
||||
- `dist/postinstall-inventory.json` 中已知的私有 QA 条目可以指向 tarball 省略的文件;
|
||||
- 当包未暴露 `gateway install --wrapper` flag 时,`doctor-switch` 可以跳过该持久化子用例;
|
||||
- `update-channel-switch` 可以从 tarball 派生的 fake git fixture 中剪除缺失的 `pnpm.patchedDependencies`,并可以记录缺失的持久化 `update.channel`;
|
||||
- 插件 smoke 可以读取 legacy 安装记录位置,或接受缺失的 marketplace 安装记录持久化;
|
||||
- `plugin-update` 可以允许配置元数据迁移,同时仍要求安装记录和 no-reinstall 行为保持不变。
|
||||
|
||||
已发布的 `2026.4.26` 包也可以对已经发布的本地构建元数据戳文件发出警告。之后的包必须满足现代契约;相同条件会失败,而不是警告或跳过。
|
||||
已发布的 `2026.4.26` 包也可以对已交付的本地构建元数据 stamp 文件发出警告。更晚的包必须满足现代契约;相同条件会失败,而不是警告或跳过。
|
||||
|
||||
### 示例
|
||||
|
||||
@ -304,151 +304,151 @@ gh workflow run package-acceptance.yml \
|
||||
-f docker_lanes='install-e2e plugin-update'
|
||||
```
|
||||
|
||||
调试失败的软件包验收运行时,先查看 `resolve_package` 摘要,确认软件包来源、版本和 SHA-256。然后检查 `docker_acceptance` 子运行及其 Docker 产物:`.artifacts/docker-tests/**/summary.json`、`failures.json`、lane 日志、阶段耗时和重新运行命令。优先重新运行失败的软件包配置文件或精确 Docker lane,而不是重新运行完整发布验证。
|
||||
调试失败的包验收运行时,从 `resolve_package` 摘要开始,确认包来源、版本和 SHA-256。然后检查 `docker_acceptance` 子运行及其 Docker 产物:`.artifacts/docker-tests/**/summary.json`、`failures.json`、车道日志、阶段计时和重新运行命令。优先重新运行失败的包配置文件或精确的 Docker 车道,而不是重新运行完整发布验证。
|
||||
|
||||
## 安装冒烟测试
|
||||
|
||||
单独的 `Install Smoke` 工作流通过自己的 `preflight` 作业复用同一个范围脚本。它将冒烟覆盖拆分为 `run_fast_install_smoke` 和 `run_full_install_smoke`。
|
||||
|
||||
- **快速路径**会在 pull request 触及 Docker/软件包表面、内置插件软件包/清单变更,或 Docker 冒烟作业会执行的核心插件/渠道/Gateway 网关/插件 SDK 表面时运行。仅源码的内置插件变更、仅测试编辑和仅文档编辑不会占用 Docker worker。快速路径会构建一次根 Dockerfile 镜像,检查 CLI,运行 agents delete 共享工作区 CLI 冒烟测试,运行容器 gateway-network e2e,验证内置插件构建参数,并在 240 秒聚合命令超时内运行有界内置插件 Docker 配置文件(每个场景的 Docker 运行单独设限)。
|
||||
- **完整路径**为夜间定时运行、手动派发、workflow-call 发布检查,以及真正触及安装器/软件包/Docker 表面的 pull request 保留 QR 软件包安装和安装器 Docker/更新覆盖。在完整模式下,install-smoke 会准备或复用一个目标 SHA 的 GHCR 根 Dockerfile 冒烟镜像,然后将 QR 软件包安装、根 Dockerfile/Gateway 网关冒烟测试、安装器/更新冒烟测试,以及快速内置插件 Docker E2E 作为单独作业运行,这样安装器工作就不会被根镜像冒烟测试阻塞。
|
||||
- **快速路径**会在拉取请求触及 Docker/包表面、内置插件包/清单变更,或 Docker 冒烟作业会覆盖的核心插件/渠道/Gateway 网关/插件 SDK 表面时运行。仅源代码的内置插件变更、仅测试编辑和仅文档编辑不会占用 Docker worker。快速路径会构建一次根 Dockerfile 镜像、检查 CLI、运行智能体删除共享工作区 CLI 冒烟测试、运行容器 Gateway 网关网络 e2e、验证内置插件构建参数,并在 240 秒聚合命令超时内运行有界的内置插件 Docker 配置文件(每个场景的 Docker 运行会单独设定上限)。
|
||||
- **完整路径**会保留 QR 包安装和安装器 Docker/更新覆盖,用于夜间定时运行、手动分发、workflow-call 发布检查,以及真正触及安装器/包/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` 派发也可以选择启用它,但 pull request 和 `main` 推送不会运行。QR 和安装器 Docker 测试保留各自面向安装的 Dockerfile。
|
||||
较慢的 Bun 全局安装 image-provider 冒烟测试由 `run_bun_global_install_smoke` 单独控制。它会在夜间计划和发布检查工作流中运行,手动 `Install Smoke` 分发可以选择启用它,但拉取请求和 `main` 推送不会运行。QR 和安装器 Docker 测试保留各自专注安装的 Dockerfile。
|
||||
|
||||
## 本地 Docker E2E
|
||||
|
||||
`pnpm test:docker:all` 会预构建一个共享 live-test 镜像,将 OpenClaw 打包一次为 npm tarball,并构建两个共享 `scripts/e2e/Dockerfile` 镜像:
|
||||
`pnpm test:docker:all` 会预构建一个共享的实时测试镜像,将 OpenClaw 打包一次为 npm tarball,并构建两个共享的 `scripts/e2e/Dockerfile` 镜像:
|
||||
|
||||
- 用于安装器/更新/插件依赖 lane 的裸 Node/Git runner;
|
||||
- 将同一个 tarball 安装到 `/app` 的功能镜像,用于常规功能 lane。
|
||||
- 一个用于安装器/更新/插件依赖车道的裸 Node/Git runner;
|
||||
- 一个将同一 tarball 安装到 `/app` 中、用于常规功能车道的功能镜像。
|
||||
|
||||
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。
|
||||
Docker 车道定义位于 `scripts/lib/docker-e2e-scenarios.mjs`,规划逻辑位于 `scripts/lib/docker-e2e-plan.mjs`,runner 只执行选中的计划。调度器使用 `OPENCLAW_DOCKER_E2E_BARE_IMAGE` 和 `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE` 为每条车道选择镜像,然后用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行车道。
|
||||
|
||||
### 可调参数
|
||||
|
||||
| 变量 | 默认值 | 用途 |
|
||||
| -------------------------------------- | ------- | --------------------------------------------------------------------------------------------- |
|
||||
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | 常规 lane 的主池 slot 数量。 |
|
||||
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | 对提供商敏感的尾池 slot 数量。 |
|
||||
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | 并发 live lane 上限,避免提供商限流。 |
|
||||
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | 并发 npm install lane 上限。 |
|
||||
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | 并发多服务 lane 上限。 |
|
||||
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | lane 启动之间的错峰时间,用于避免 Docker daemon 创建风暴;设为 `0` 表示不做错峰。 |
|
||||
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | 每条 lane 的兜底超时(120 分钟);选定的 live/tail lane 使用更严格的上限。 |
|
||||
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | unset | `1` 会打印调度器计划而不运行 lane。 |
|
||||
| `OPENCLAW_DOCKER_ALL_LANES` | unset | 逗号分隔的精确 lane 列表;跳过清理冒烟测试,便于智能体复现一个失败 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 安装车道上限。 |
|
||||
| `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` | 未设置 | 逗号分隔的精确车道列表;跳过清理冒烟测试,以便智能体复现单个失败车道。 |
|
||||
|
||||
比其有效上限更重的 lane 仍可从空池启动,然后单独运行直到释放容量。本地聚合会预检 Docker,移除陈旧的 OpenClaw E2E 容器,输出活跃 lane 状态,持久化 lane 耗时以支持最长优先排序,并默认在第一次失败后停止调度新的池化 lane。
|
||||
超过其有效上限的车道仍可从空池启动,然后独占运行,直到释放容量。本地聚合会预检 Docker、移除陈旧的 OpenClaw E2E 容器、输出活动车道状态、持久化车道计时以便按最长优先排序,并且默认在第一次失败后停止调度新的池化车道。
|
||||
|
||||
### 可复用 live/E2E 工作流
|
||||
### 可复用实时/E2E 工作流
|
||||
|
||||
可复用 live/E2E 工作流会询问 `scripts/test-docker-all.mjs --plan-json` 需要哪种软件包、镜像类型、live 镜像、lane 和凭证覆盖。随后 `scripts/docker-e2e.mjs` 将该计划转换为 GitHub 输出和摘要。它要么通过 `scripts/package-openclaw-for-docker.mjs` 打包 OpenClaw,要么下载当前运行的软件包产物,要么从 `package_artifact_run_id` 下载软件包产物;验证 tarball 清单;当计划需要已安装软件包的 lane 时,通过 Blacksmith 的 Docker 层缓存构建并推送带有软件包摘要标签的裸/功能 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 layer cache 构建并推送带包摘要标签的裸/功能 GHCR Docker E2E 镜像;并复用提供的 `docker_e2e_bare_image`/`docker_e2e_functional_image` 输入或现有包摘要镜像,而不是重新构建。Docker 镜像拉取会使用有界的每次尝试 180 秒超时重试,因此卡住的 registry/cache 流会快速重试,而不会消耗 CI 关键路径的大部分时间。
|
||||
|
||||
### 发布路径分块
|
||||
|
||||
发布 Docker 覆盖会用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 运行更小的分块作业,因此每个分块只拉取自己需要的镜像类型,并通过同一个加权调度器执行多条 lane:
|
||||
发布 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` lane 别名仍是两个提供商安装器 lane 的聚合手动重新运行别名。
|
||||
当前发布 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 时,它会合入 `plugins-runtime-services`,并且只有在仅 OpenWebUI 派发时才保留独立的 `openwebui` 分块。内置渠道更新 lane 会针对瞬时 npm 网络失败重试一次。
|
||||
当完整发布路径覆盖请求 OpenWebUI 时,它会并入 `plugins-runtime-services`;只有 OpenWebUI 专用分发才保留独立的 `openwebui` 分块。内置渠道更新车道会针对瞬时 npm 网络故障重试一次。
|
||||
|
||||
每个分块都会上传 `.artifacts/docker-tests/`,其中包含 lane 日志、耗时、`summary.json`、`failures.json`、阶段耗时、调度器计划 JSON、慢 lane 表,以及每条 lane 的重新运行命令。工作流 `docker_lanes` 输入会在已准备镜像上运行选定 lane,而不是运行分块作业,从而将失败 lane 调试限定在一个目标 Docker 作业内,并为该运行准备、下载或复用软件包产物;如果选定 lane 是 live Docker lane,目标作业会为该次重新运行本地构建 live-test 镜像。生成的逐 lane GitHub 重新运行命令会在这些值存在时包含 `package_artifact_run_id`、`package_artifact_name` 和已准备的镜像输入,因此失败 lane 可以复用失败运行中的精确软件包和镜像。
|
||||
每个分块都会上传 `.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> # download Docker artifacts and print combined/per-lane targeted rerun commands
|
||||
pnpm test:docker:timings <summary> # slow-lane and phase critical-path summaries
|
||||
```
|
||||
|
||||
定时 live/E2E 工作流每天运行完整 release-path Docker 套件。
|
||||
计划的实时/E2E 工作流每天运行完整发布路径 Docker 套件。
|
||||
|
||||
## 插件预发布
|
||||
|
||||
`Plugin Prerelease` 是成本更高的产品/软件包覆盖,因此它是由 `Full Release Validation` 或显式操作员派发的单独工作流。常规 pull request、`main` 推送和独立手动 CI 派发都会关闭该套件。它会在八个扩展 worker 之间平衡内置插件测试;这些扩展分片作业一次最多运行两个插件配置组,每组使用一个 Vitest worker 和更大的 Node heap,这样 import 密集型插件批次就不会创建额外 CI 作业。仅发布 Docker 预发布路径会将目标 Docker lane 分成小组批处理,以避免为一到三分钟的作业占用数十个 runner。
|
||||
`Plugin Prerelease` 是成本更高的产品/包覆盖,因此它是一个单独的工作流,由 `Full Release Validation` 或明确的操作员分发触发。常规拉取请求、`main` 推送和独立的手动 CI 分发都不会启用该套件。它会在八个插件 worker 之间均衡内置插件测试;这些插件分片作业每次最多运行两个插件配置组,每组使用一个 Vitest worker 和更大的 Node 堆,因此导入较重的插件批次不会创建额外 CI 作业。仅发布的 Docker 预发布路径会以小组批量运行目标 Docker 车道,避免为一到三分钟的作业占用数十个 runner。
|
||||
|
||||
## QA Lab
|
||||
|
||||
QA Lab 在主智能范围工作流之外有专用 CI lane。Agentic parity 嵌套在广泛 QA 和发布 harness 下,而不是独立的 PR 工作流。当 parity 应随广泛验证运行一起执行时,使用带 `rerun_group=qa-parity` 的 `Full Release Validation`。
|
||||
QA Lab 拥有独立于主智能范围工作流之外的专用 CI 车道。Agentic parity 嵌套在广泛的 QA 和发布 harness 下,而不是独立的 PR 工作流。当 parity 应随广泛验证运行一起执行时,使用带有 `rerun_group=qa-parity` 的 `Full Release Validation`。
|
||||
|
||||
- `QA-Lab - All Lanes` 工作流会在 `main` 上每晚运行,也可手动派发;它将 mock parity lane、live Matrix lane,以及 live Telegram 和 Discord lane 扇出为并行作业。Live 作业使用 `qa-live-shared` 环境,Telegram/Discord 使用 Convex leases。
|
||||
- `QA-Lab - All Lanes` 工作流每晚在 `main` 上运行,也可手动分发;它会将 mock parity 车道、实时 Matrix 车道,以及实时 Telegram 和 Discord 车道展开为并行作业。实时作业使用 `qa-live-shared` 环境,Telegram/Discord 使用 Convex 租约。
|
||||
|
||||
发布检查会用确定性的 mock 提供商和 mock 限定模型(`mock-openai/gpt-5.5` 和 `mock-openai/gpt-5.5-alt`)运行 Matrix 和 Telegram live transport lane,因此渠道契约与 live 模型延迟和常规提供商插件启动隔离。live transport Gateway 网关会禁用记忆搜索,因为 QA parity 会单独覆盖记忆行为;提供商连通性由单独的 live 模型、原生提供商和 Docker 提供商套件覆盖。
|
||||
发布检查会使用确定性 mock 提供商和 mock 限定模型(`mock-openai/gpt-5.5` 和 `mock-openai/gpt-5.5-alt`)运行 Matrix 和 Telegram 实时传输车道,因此渠道契约与实时模型延迟和常规提供商插件启动相隔离。实时传输 Gateway 网关会禁用记忆搜索,因为 QA parity 会单独覆盖记忆行为;提供商连接性由单独的实时模型、原生提供商和 Docker 提供商套件覆盖。
|
||||
|
||||
Matrix 对定时和发布 gate 使用 `--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 lane;其 QA parity gate 会将候选包和基线包作为并行 lane 作业运行,然后把两个产物下载到一个小型报告作业中,用于最终 parity 对比。
|
||||
`OpenClaw Release Checks` 也会在发布批准前运行发布关键的 QA Lab 车道;其 QA parity 门禁会将候选包和基线包作为并行车道作业运行,然后把两个产物都下载到一个小型报告作业中,用于最终 parity 比较。
|
||||
|
||||
对于常规 PR,请遵循范围化 CI/检查证据,而不要将 parity 视为必需状态。
|
||||
对于常规 PR,应遵循限定范围的 CI/检查证据,而不是将 parity 视为必需状态。
|
||||
|
||||
## CodeQL
|
||||
|
||||
`CodeQL` 工作流有意作为范围较窄的第一轮安全扫描器,而不是完整的仓库扫描。每日、手动和非草稿拉取请求守卫运行会扫描 Actions 工作流代码,以及风险最高的 JavaScript/TypeScript 表面,并使用高置信度安全查询,过滤到 high/critical `security-severity`。
|
||||
`CodeQL` 工作流有意作为范围狭窄的第一遍安全扫描器,而不是完整仓库扫描。每日、手动和非草稿拉取请求守卫运行会扫描 Actions 工作流代码,以及最高风险的 JavaScript/TypeScript 表面,并使用高置信度安全查询筛选高/严重 `security-severity`。
|
||||
|
||||
拉取请求守卫保持轻量:它只会针对 `.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 抓取,以及插件 SDK SSRF 策略表面 |
|
||||
| `/codeql-security-high/mcp-process-tool-boundary` | MCP 服务器、进程执行帮助程序、出站投递,以及智能体工具执行门控 |
|
||||
| `/codeql-security-high/plugin-trust-boundary` | 插件安装、加载器、清单、注册表、包管理器安装、源码加载,以及插件 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 抓取和插件 SDK SSRF 策略表面 |
|
||||
| `/codeql-security-high/mcp-process-tool-boundary` | MCP 服务器、进程执行辅助工具、出站投递,以及智能体工具执行门控 |
|
||||
| `/codeql-security-high/plugin-trust-boundary` | 插件安装、加载器、清单、注册表、包管理器安装、源加载,以及插件 SDK 包契约信任表面 |
|
||||
|
||||
### 平台特定安全分片
|
||||
|
||||
- `CodeQL Android Critical Security` — 定时 Android 安全分片。在工作流健全性接受的最小 Blacksmith Linux 运行器上,为 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 安全分片。在工作流健全性接受的最小 Blacksmith Linux runner 上手动构建 Android 应用以供 CodeQL 使用。上传到 `/codeql-critical-security/android` 下。
|
||||
- `CodeQL macOS Critical Security` — 每周/手动 macOS 安全分片。在 Blacksmith macOS 上手动构建 macOS 应用以供 CodeQL 使用,从上传的 SARIF 中过滤依赖构建结果,并上传到 `/codeql-critical-security/macos` 下。它被排除在每日默认项之外,因为即使结果干净,macOS 构建也会主导运行时长。
|
||||
|
||||
### 关键质量类别
|
||||
|
||||
`CodeQL Critical Quality` 是对应的非安全分片。它只在较小的 Blacksmith Linux 运行器上,针对范围较窄的高价值表面运行错误严重级别、非安全 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 质量分片。
|
||||
`CodeQL Critical Quality` 是对应的非安全分片。它只在较小的 Blacksmith Linux runner 上,对范围狭窄的高价值表面运行错误严重级别、非安全 JavaScript/TypeScript 质量查询。它的拉取请求守卫有意小于定时配置:非草稿 PR 只会针对智能体命令/模型/工具执行和回复分发代码、配置架构/迁移/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 质量分片。
|
||||
|
||||
手动调度接受:
|
||||
|
||||
```bash
|
||||
```
|
||||
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/channel-runtime-boundary` | 核心渠道和内置渠道插件实现契约 |
|
||||
| `/codeql-critical-quality/agent-runtime-boundary` | 命令执行、模型/提供商分发、自动回复分发和队列,以及 ACP 控制平面运行时契约 |
|
||||
| `/codeql-critical-quality/mcp-process-runtime-boundary` | MCP 服务器和工具桥接、进程监督帮助程序,以及出站投递契约 |
|
||||
| `/codeql-critical-quality/memory-runtime-boundary` | 记忆宿主 SDK、记忆运行时 facade、记忆插件 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 源码和插件包契约帮助程序 |
|
||||
| `/codeql-critical-quality/core-auth-secrets` | 认证、密钥、沙箱、cron 和 Gateway 网关安全边界代码 |
|
||||
| `/codeql-critical-quality/config-boundary` | 配置架构、迁移、规范化和 IO 契约 |
|
||||
| `/codeql-critical-quality/gateway-runtime-boundary` | Gateway 网关协议架构和服务器方法契约 |
|
||||
| `/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` | 记忆主机 SDK、记忆运行时 facade、记忆插件 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 运行可以触发它,手动调度也可以直接运行它。当 `main` 已经前进,或过去一小时内已经创建过另一个未跳过的 Docs Agent 运行时,workflow-run 调用会跳过。运行时,它会审查从上一个未跳过的 Docs Agent 源 SHA 到当前 `main` 的提交范围,因此一次每小时运行可以覆盖自上次文档处理以来积累的所有 main 变更。
|
||||
`Docs Agent` 工作流是一个事件驱动的 Codex 维护通道,用于让现有文档与最近落地的变更保持一致。它没有纯定时计划:`main` 上成功的非机器人 push CI 运行可以触发它,手动调度也可以直接运行它。当 `main` 已继续前进,或过去一小时内已经创建了另一个未跳过的 Docs Agent 运行时,workflow-run 调用会跳过。运行时,它会审核从上一个未跳过的 Docs Agent 源 SHA 到当前 `main` 的提交范围,因此一次每小时运行可以覆盖自上次文档处理以来积累的所有 main 变更。
|
||||
|
||||
### Test Performance Agent
|
||||
|
||||
`Test Performance Agent` 工作流是一个事件驱动的 Codex 维护通道,用于处理慢测试。它没有纯定时计划:`main` 上一次成功的非机器人 push CI 运行可以触发它,但如果当天 UTC 已经有另一个 workflow-run 调用运行过或正在运行,它会跳过。手动调度会绕过这个每日活动门控。该通道会构建完整套件分组 Vitest 性能报告,让 Codex 只做小型、保持覆盖率的测试性能修复,而不是大范围重构,然后重新运行完整套件报告,并拒绝会降低通过基线测试数量的变更。如果基线存在失败测试,Codex 只能修复明显失败项,并且 agent 之后的完整套件报告必须通过,才能提交任何内容。当 `main` 在机器人 push 落地前前进时,该通道会变基已验证的补丁,重新运行 `pnpm check:changed`,并重试 push;存在冲突的过期补丁会被跳过。它使用 GitHub 托管的 Ubuntu,因此 Codex action 可以保持与 docs agent 相同的 drop-sudo 安全姿态。
|
||||
`Test Performance Agent` 工作流是一个事件驱动的 Codex 维护通道,用于处理慢测试。它没有纯定时计划:`main` 上成功的非机器人 push CI 运行可以触发它,但如果同一个 UTC 日已经有另一个 workflow-run 调用运行过或正在运行,它会跳过。手动调度会绕过该每日活动门控。该通道会构建完整套件分组 Vitest 性能报告,让 Codex 只做保持覆盖率的小型测试性能修复,而不是大范围重构,然后重新运行完整套件报告,并拒绝会降低通过基线测试数量的变更。如果基线存在失败测试,Codex 只能修复明显失败,且 agent 后的完整套件报告必须通过后才能提交任何内容。当机器人 push 落地前 `main` 前进时,该通道会 rebase 已验证补丁,重新运行 `pnpm check:changed`,并重试 push;有冲突的陈旧补丁会被跳过。它使用 GitHub 托管的 Ubuntu,因此 Codex action 可以保持与 docs 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 \
|
||||
@ -459,37 +459,37 @@ gh workflow run duplicate-after-merge.yml \
|
||||
|
||||
## 本地检查门控和变更路由
|
||||
|
||||
本地 changed-lane 逻辑位于 `scripts/changed-lanes.mjs`,并由 `scripts/check-changed.mjs` 执行。这个本地检查门控在架构边界方面比宽泛的 CI 平台范围更严格:
|
||||
本地 changed-lane 逻辑位于 `scripts/changed-lanes.mjs`,并由 `scripts/check-changed.mjs` 执行。该本地检查门控在架构边界方面比宽泛的 CI 平台范围更严格:
|
||||
|
||||
- 核心生产变更会运行核心生产和核心测试类型检查,以及核心 lint/guard;
|
||||
- 仅核心测试变更只运行核心测试类型检查和核心 lint;
|
||||
- 插件生产变更会运行插件生产和插件测试类型检查,以及插件 lint;
|
||||
- 仅插件测试变更会运行插件测试类型检查和插件 lint;
|
||||
- 公开插件 SDK 或插件契约变更会扩展到插件类型检查,因为插件依赖这些核心契约(Vitest 插件扫描仍是显式测试工作);
|
||||
- 仅发布元数据的版本 bump 会运行有针对性的版本/配置/根依赖检查;
|
||||
- 未知根目录/配置变更会安全失败到所有检查通道。
|
||||
- 核心生产变更会运行核心生产和核心测试类型检查,加上核心 lint/guards;
|
||||
- 仅核心测试变更只运行核心测试类型检查,加上核心 lint;
|
||||
- 扩展生产变更会运行扩展生产和扩展测试类型检查,加上扩展 lint;
|
||||
- 仅扩展测试变更会运行扩展测试类型检查,加上扩展 lint;
|
||||
- 公共插件 SDK 或插件契约变更会扩展到扩展类型检查,因为扩展依赖这些核心契约(Vitest 扩展扫描仍然是显式测试工作);
|
||||
- 仅发布元数据版本 bump 会运行定向版本/配置/根依赖检查;
|
||||
- 未知 root/配置变更会故障安全地进入所有检查通道。
|
||||
|
||||
本地 changed-test 路由位于 `scripts/test-projects.test-support.mjs`,并且有意比 `check:changed` 更便宜:直接测试编辑会运行其自身,源码编辑优先使用显式映射,然后是同级测试和导入图依赖项。共享 group-room 投递配置是显式映射之一:对群组可见回复配置、源回复投递模式或 message-tool 系统提示词的变更,会路由到核心回复测试,以及 Discord 和 Slack 投递回归测试,这样共享默认值变更会在第一次 PR push 前失败。只有当变更范围足够覆盖整个 harness,以至于廉价映射集合不能作为可信代理时,才使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`。
|
||||
本地 changed-test 路由位于 `scripts/test-projects.test-support.mjs`,并且有意比 `check:changed` 更便宜:直接测试编辑会运行自身,源代码编辑优先使用显式映射,然后是同级测试和导入图依赖项。共享群组房间投递配置是显式映射之一:对群组可见回复配置、源回复投递模式或消息工具系统提示的变更,会经过核心回复测试以及 Discord 和 Slack 投递回归测试,因此共享默认值变更会在首次 PR push 前失败。只有当变更范围足够覆盖整个 harness,以至于廉价映射集合不是可信代理时,才使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`。
|
||||
|
||||
## Testbox 验证
|
||||
|
||||
从仓库根目录运行 Testbox,并优先使用新预热的 box 来做广泛证明。在把耗时 gate 花到一个复用过、已过期或刚报告异常大同步量的 box 之前,先在 box 内运行 `pnpm testbox:sanity`。
|
||||
从仓库根目录运行 Testbox,并优先使用全新预热的 box 进行广泛验证。在对复用过、已过期,或刚报告了异常大规模同步的 box 执行慢速 gate 之前,先在 box 内运行 `pnpm testbox:sanity`。
|
||||
|
||||
当 `pnpm-lock.yaml` 等必需根文件消失,或 `git status --short` 显示至少 200 个已跟踪删除时,sanity check 会快速失败。这通常意味着远程同步状态不是 PR 的可信副本;停止那个 box,并改为预热一个新的 box,而不是调试产品测试失败。对于有意的大量删除 PR,请为该 sanity 运行设置 `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1`。
|
||||
当所需的根文件(例如 `pnpm-lock.yaml`)消失,或 `git status --short` 显示至少 200 个已跟踪删除项时,sanity check 会快速失败。这通常意味着远程同步状态不是 PR 的可信副本;停止那个 box,并改为预热一个新的 box,而不是调试产品测试失败。对于有意进行大规模删除的 PR,请为该次 sanity run 设置 `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1`。
|
||||
|
||||
如果本地 Blacksmith CLI 调用停留在同步阶段超过五分钟且没有同步后的输出,`pnpm testbox:run` 也会终止它。设置 `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` 可禁用该保护,或者为异常大的本地 diff 使用更大的毫秒值。
|
||||
`pnpm testbox:run` 还会终止本地 Blacksmith CLI 调用:如果它在同步阶段停留超过五分钟且没有同步后的输出。设置 `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` 可禁用该保护,或为异常大的本地 diff 使用更大的毫秒值。
|
||||
|
||||
Crabbox 是仓库自有的远程 box 封装器,用于维护者 Linux 证明。当某个检查对本地编辑循环来说过宽、需要 CI 等价性,或证明需要密钥、Docker、package lane、可复用 box 或远程日志时,请使用它。正常的 OpenClaw 后端是 `blacksmith-testbox`;自有 AWS/Hetzner 容量是 Blacksmith 故障、配额问题或显式自有容量测试时的后备方案。
|
||||
Crabbox 是仓库自有的远程 box 包装器,用于维护者 Linux 验证。当某个检查对本地编辑循环来说过于广泛、CI 对等性很重要,或验证需要 secrets、Docker、package lanes、可复用 box,或远程日志时,请使用它。常规 OpenClaw 后端是 `blacksmith-testbox`;自有 AWS/Hetzner 容量是在 Blacksmith 中断、配额问题,或明确进行自有容量测试时的 fallback。
|
||||
|
||||
首次运行前,从仓库根目录检查该封装器:
|
||||
首次运行前,从仓库根目录检查包装器:
|
||||
|
||||
```bash
|
||||
pnpm crabbox:run -- --help | sed -n '1,120p'
|
||||
```
|
||||
|
||||
如果 Crabbox 二进制文件过旧且未声明支持 `blacksmith-testbox`,仓库封装器会拒绝运行。即使 `.crabbox.yaml` 里有自有云默认值,也要显式传入提供商。
|
||||
如果 Crabbox 二进制文件过旧且未声明 `blacksmith-testbox`,仓库包装器会拒绝运行。即使 `.crabbox.yaml` 有自有云默认值,也要显式传入 provider。
|
||||
|
||||
变更 gate:
|
||||
Changed gate:
|
||||
|
||||
```bash
|
||||
pnpm crabbox:run -- --provider blacksmith-testbox \
|
||||
@ -504,7 +504,7 @@ pnpm crabbox:run -- --provider blacksmith-testbox \
|
||||
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm check:changed"
|
||||
```
|
||||
|
||||
定向测试重跑:
|
||||
聚焦测试重跑:
|
||||
|
||||
```bash
|
||||
pnpm crabbox:run -- --provider blacksmith-testbox \
|
||||
@ -534,21 +534,21 @@ pnpm crabbox:run -- --provider blacksmith-testbox \
|
||||
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm test"
|
||||
```
|
||||
|
||||
读取最终 JSON 摘要。有用的字段是 `provider`、`leaseId`、`syncDelegated`、`exitCode`、`commandMs` 和 `totalMs`。一次性、由 Blacksmith 支撑的 Crabbox 运行应自动停止 Testbox;如果运行被中断或清理状态不明确,请检查在线 box,并只停止你创建的 box:
|
||||
阅读最终的 JSON 摘要。有用的字段是 `provider`、`leaseId`、`syncDelegated`、`exitCode`、`commandMs` 和 `totalMs`。一次性的 Blacksmith 后端 Crabbox 运行应自动停止 Testbox;如果运行被中断或清理状态不明确,请检查 live boxes,并只停止你创建的 box:
|
||||
|
||||
```bash
|
||||
blacksmith testbox list
|
||||
blacksmith testbox stop --id <tbx_id>
|
||||
```
|
||||
|
||||
仅当你有意需要在同一个已 hydrate 的 box 上运行多条命令时,才使用复用:
|
||||
只有在你有意需要在同一个已 hydrated 的 box 上执行多条命令时,才使用复用:
|
||||
|
||||
```bash
|
||||
pnpm crabbox:run -- --provider blacksmith-testbox --id <tbx_id> --no-sync --timing-json --shell -- "pnpm test <path-or-filter>"
|
||||
pnpm crabbox:stop -- <tbx_id>
|
||||
```
|
||||
|
||||
如果 Crabbox 是损坏层,但 Blacksmith 本身可用,请将直接使用 Blacksmith 作为窄范围后备方案:
|
||||
如果 Crabbox 是损坏的层,但 Blacksmith 本身可用,请将 direct Blacksmith 作为窄 fallback:
|
||||
|
||||
```bash
|
||||
blacksmith testbox warmup ci-check-testbox.yml --ref main --idle-timeout 90
|
||||
@ -556,7 +556,7 @@ blacksmith testbox run --id <tbx_id> "env CI=1 NODE_OPTIONS=--max-old-space-size
|
||||
blacksmith testbox stop --id <tbx_id>
|
||||
```
|
||||
|
||||
只有当 Blacksmith 宕机、受配额限制、缺少所需环境,或自有容量明确是目标时,才升级到自有 Crabbox 容量:
|
||||
仅当 Blacksmith 宕机、受配额限制、缺少所需环境,或明确目标是自有容量时,才升级到自有 Crabbox 容量:
|
||||
|
||||
```bash
|
||||
pnpm crabbox:warmup -- --provider aws --class beast --market on-demand --idle-timeout 90m
|
||||
@ -565,9 +565,9 @@ pnpm crabbox:run -- --id <cbx_id-or-slug> --timing-json --shell -- "env NODE_OPT
|
||||
pnpm crabbox:stop -- <cbx_id-or-slug>
|
||||
```
|
||||
|
||||
`.crabbox.yaml` 拥有自有云 lane 的提供商、同步和 GitHub Actions hydrate 默认值。它会排除本地 `.git`,使已 hydrate 的 Actions checkout 保留自己的远程 Git 元数据,而不是同步维护者本地的 remote 和 object store;它也会排除绝不应传输的本地运行时/构建产物。`.github/workflows/crabbox-hydrate.yml` 拥有 checkout、Node/pnpm 设置、`origin/main` 拉取,以及自有云 `crabbox run --id <cbx_id>` 命令的非密钥环境交接。
|
||||
`.crabbox.yaml` 负责自有云 lanes 的 provider、sync 和 GitHub Actions hydration 默认值。它排除本地 `.git`,使 hydrated Actions checkout 保持自己的远程 Git 元数据,而不是同步维护者本地的 remotes 和 object stores;它还排除绝不应传输的本地 runtime/build artifacts。`.github/workflows/crabbox-hydrate.yml` 负责 checkout、Node/pnpm 设置、`origin/main` fetch,以及面向自有云 `crabbox run --id <cbx_id>` 命令的非 secret 环境交接。
|
||||
|
||||
## 相关内容
|
||||
## 相关
|
||||
|
||||
- [安装概览](/zh-CN/install)
|
||||
- [开发渠道](/zh-CN/install/development-channels)
|
||||
|
||||
@ -1,170 +1,156 @@
|
||||
---
|
||||
read_when:
|
||||
- 正在查找公共发布渠道定义
|
||||
- 正在查找公开发布渠道定义
|
||||
- 运行发布验证或软件包验收
|
||||
- 查找版本命名和发布节奏
|
||||
summary: 发布通道、操作员检查清单、验证环境、版本命名和发布节奏
|
||||
title: 发布策略
|
||||
x-i18n:
|
||||
generated_at: "2026-05-04T22:29:41Z"
|
||||
generated_at: "2026-05-05T01:33:45Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: fc9b8f82deb90c57c7777480013a5ee956d1123e0b16134daf90a94bc82952cb
|
||||
source_hash: 41886d3bb2f970e6a86944e5ff207b1b29b1b64b1f234d45f626fed19cf032b3
|
||||
source_path: reference/RELEASING.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
OpenClaw 有三个公开发布通道:
|
||||
|
||||
- 稳定版:带标签的发布,默认发布到 npm `beta`,或在明确请求时发布到 npm `latest`
|
||||
- beta 版:发布到 npm `beta` 的预发布标签
|
||||
- 开发版:`main` 的移动头部
|
||||
- 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`
|
||||
- Beta 预发布版本:`YYYY.M.D-beta.N`
|
||||
- Git 标签:`vYYYY.M.D-beta.N`
|
||||
- 月或日不要补零
|
||||
- 月份或日期不要补零
|
||||
- `latest` 表示当前已提升的稳定版 npm 发布
|
||||
- `beta` 表示当前 beta 安装目标
|
||||
- 稳定版和稳定版修正版发布默认发布到 npm `beta`;发布操作员可以显式指定 `latest`,或稍后提升经过审核的 beta 构建
|
||||
- 稳定版和稳定版修正发布默认发布到 npm `beta`;发布操作员可以明确指定 `latest`,或稍后提升经过验证的 beta 构建
|
||||
- 每个稳定版 OpenClaw 发布都会同时交付 npm 包和 macOS 应用;
|
||||
beta 发布通常会先验证并发布 npm/包路径,除非明确请求,否则
|
||||
Mac 应用构建/签名/公证仅保留给稳定版
|
||||
beta 发布通常会先验证并发布 npm/包路径,而 mac 应用构建/签名/公证保留给稳定版,除非明确请求
|
||||
|
||||
## 发布节奏
|
||||
|
||||
- 发布先进入 beta
|
||||
- 只有在最新 beta 验证通过后才进入稳定版
|
||||
- 维护者通常会从当前 `main` 创建的 `release/YYYY.M.D` 分支切出发布,
|
||||
- 只有在最新 beta 验证通过后,才会进入稳定版
|
||||
- 维护者通常从基于当前 `main` 创建的 `release/YYYY.M.D` 分支切出发布,
|
||||
这样发布验证和修复不会阻塞 `main` 上的新开发
|
||||
- 如果 beta 标签已经推送或发布且需要修复,维护者会切出下一个
|
||||
`-beta.N` 标签,而不是删除或重新创建旧 beta 标签
|
||||
- 详细发布流程、审批、凭证和恢复说明仅供维护者使用
|
||||
- 如果某个 beta 标签已经推送或发布并需要修复,维护者会切出下一个 `-beta.N` 标签,而不是删除或重新创建旧的 beta 标签
|
||||
- 详细发布流程、审批、凭证和恢复说明仅限维护者使用
|
||||
|
||||
## 发布操作员检查清单
|
||||
|
||||
此检查清单是发布流程的公开形态。私有凭证、
|
||||
签名、公证、dist-tag 恢复和紧急回滚详情保留在
|
||||
仅维护者可见的发布运行手册中。
|
||||
仅限维护者使用的发布运行手册中。
|
||||
|
||||
1. 从当前 `main` 开始:拉取最新内容,确认目标提交已推送,
|
||||
并确认当前 `main` CI 足够健康,可以从它创建分支。
|
||||
2. 使用 `/changelog` 基于真实提交历史重写顶部 `CHANGELOG.md` 章节,
|
||||
保持条目面向用户,提交它,推送它,并在创建分支前再 rebase/pull
|
||||
一次。
|
||||
3. 检查以下文件中的发布兼容性记录:
|
||||
并确认当前 `main` 的 CI 状态足够健康,可以从它创建分支。
|
||||
2. 使用 `/changelog` 根据真实提交历史重写顶部 `CHANGELOG.md` 章节,
|
||||
保持条目面向用户,提交并推送它,然后在创建分支前再次 rebase/pull。
|
||||
3. 检查
|
||||
`src/plugins/compat/registry.ts` 和
|
||||
`src/commands/doctor/shared/deprecation-compat.ts`。只有在升级路径仍被覆盖时
|
||||
才移除过期兼容性,否则记录为什么有意继续保留它。
|
||||
`src/commands/doctor/shared/deprecation-compat.ts` 中的发布兼容性记录。只有当升级路径仍被覆盖时才移除过期兼容性,
|
||||
或记录为什么有意继续保留。
|
||||
4. 从当前 `main` 创建 `release/YYYY.M.D`;不要直接在 `main` 上执行常规发布工作。
|
||||
5. 为目标标签更新每个必需的版本位置,运行
|
||||
`pnpm plugins:sync`,让可发布的插件包共享发布版本和兼容性元数据,
|
||||
然后运行本地确定性预检:
|
||||
5. 为预期标签更新每个必需的版本位置,运行
|
||||
`pnpm plugins:sync`,使可发布的插件包共享发布版本和兼容性元数据,然后运行本地确定性预检:
|
||||
`pnpm check:test-types`、`pnpm check:architecture`、
|
||||
`pnpm build && pnpm ui:build`、`pnpm plugins:sync:check` 和
|
||||
`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. 如果验证失败,在发布分支上修复,并重新运行能证明修复的最小失败
|
||||
文件、通道、工作流作业、包配置文件、提供商或模型允许列表。
|
||||
只有当变更表面使先前证据过期时,才重新运行完整总控流程。
|
||||
9. 对于 beta,标记 `vYYYY.M.D-beta.N`,然后从匹配的
|
||||
`release/YYYY.M.D` 分支运行 `OpenClaw Release Publish`。它会验证
|
||||
`pnpm plugins:sync:check`,先将所有可发布插件包发布到 npm,
|
||||
再将同一组以 ClawPack npm-pack tarball 的形式发布到 ClawHub,
|
||||
然后使用匹配的 dist-tag 提升准备好的 OpenClaw npm 预检产物。
|
||||
发布后,针对已发布的 `openclaw@YYYY.M.D-beta.N` 或
|
||||
允许使用完整 40 字符的发布分支 SHA 进行仅验证预检。保存成功的 `preflight_run_id`。
|
||||
7. 针对发布分支、标签或完整提交 SHA,使用 `Full Release Validation` 启动所有预发布测试。这是四个大型发布测试盒子的唯一手动入口点:Vitest、Docker、QA Lab 和 Package。
|
||||
8. 如果验证失败,在发布分支上修复,并重新运行能证明修复的最小失败文件、通道、工作流作业、包配置、提供商或模型允许列表。只有当变更范围使先前证据失效时,才重新运行完整总控流程。
|
||||
9. 对于 beta,标记 `vYYYY.M.D-beta.N`,然后从匹配的 `release/YYYY.M.D` 分支运行 `OpenClaw Release Publish`。它会验证 `pnpm plugins:sync:check`,
|
||||
先将所有可发布的插件包发布到 npm,再将同一组以 ClawPack npm-pack tarball 的形式发布到 ClawHub,
|
||||
然后使用匹配的 dist-tag 提升已准备好的 OpenClaw npm 预检产物。发布后,针对已发布的 `openclaw@YYYY.M.D-beta.N` 或
|
||||
`openclaw@beta` 包运行发布后包验收。如果已推送或已发布的预发布需要修复,
|
||||
切出下一个匹配的预发布编号;不要删除或重写旧预发布。
|
||||
10. 对于稳定版,只有在经过审核的 beta 或候选发布具备所需验证证据后
|
||||
才继续。稳定版 npm 发布也通过 `OpenClaw Release Publish` 进行,
|
||||
并通过 `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 发布也通过
|
||||
`OpenClaw Release Publish`,并通过
|
||||
`preflight_run_id` 复用成功的预检产物;稳定版 macOS 发布就绪还需要 `main` 上的
|
||||
打包 `.zip`、`.dmg`、`.dSYM.zip` 和更新后的 `appcast.xml`。
|
||||
11. 发布后,运行 npm 发布后验证器,在需要发布后渠道证明时运行可选的独立已发布 npm Telegram E2E,
|
||||
在需要时进行 dist-tag 提升,根据完整匹配的 `CHANGELOG.md` 章节生成 GitHub 发布/预发布说明,
|
||||
并执行发布公告步骤。
|
||||
|
||||
## 发布预检
|
||||
|
||||
- 在发布预检前运行 `pnpm check:test-types`,确保测试 TypeScript 在更快的本地 `pnpm check` 门禁之外也被覆盖
|
||||
- 在发布预检前运行 `pnpm check:architecture`,确保更广泛的导入循环和架构边界检查在更快的本地门禁之外也保持通过
|
||||
- 在 `pnpm release:check` 前运行 `pnpm build && pnpm ui:build`,确保打包验证步骤所需的 `dist/*` 发布产物和 Control UI 包存在
|
||||
- 在根版本提升之后、打标签之前运行 `pnpm plugins:sync`。它会更新可发布的插件包版本、OpenClaw peer/API 兼容性元数据、构建元数据和插件 changelog 存根,使其匹配核心发布版本。`pnpm plugins:sync:check` 是非变更式发布保护;如果忘记此步骤,发布工作流会在任何 registry 变更前失败。
|
||||
- 在发布批准前运行手动 `Full Release Validation` 工作流,以便从一个入口点启动所有预发布测试箱。它接受分支、标签或完整提交 SHA,调度手动 `CI`,并为安装 smoke、包验收、跨 OS 包检查、QA Lab parity、Matrix 和 Telegram 车道调度 `OpenClaw Release Checks`。稳定版/默认运行会把详尽的 live/E2E 和 Docker 发布路径 soak 保留在 `run_release_soak=true` 之后;`release_profile=full` 会强制启用 soak。使用 `release_profile=full` 和 `rerun_group=all` 时,它还会针对发布检查中的 `release-package-under-test` 产物运行包 Telegram E2E。发布后提供 `npm_telegram_package_spec`,可让同一个 Telegram E2E 也验证已发布的 npm 包。发布后提供 `package_acceptance_package_spec`,可让 Package Acceptance 针对已交付的 npm 包而不是按 SHA 构建的产物运行包/更新矩阵。提供 `evidence_package_spec`,可让私有证据报告证明验证匹配已发布的 npm 包,而不强制运行 Telegram E2E。
|
||||
示例:
|
||||
- 在发布预检前运行 `pnpm check:test-types`,这样测试 TypeScript 会在更快的本地 `pnpm check` 门禁之外继续被覆盖
|
||||
- 在发布预检前运行 `pnpm check:architecture`,这样更广泛的导入循环和架构边界检查会在更快的本地门禁之外保持绿色
|
||||
- 在 `pnpm release:check` 前运行 `pnpm build && pnpm ui:build`,这样预期的 `dist/*` 发布产物和 Control UI 包会存在,可供打包验证步骤使用
|
||||
- 在根版本号提升后、打标签前运行 `pnpm plugins:sync`。它会更新可发布插件包版本、OpenClaw peer/API 兼容性元数据、构建元数据和插件 changelog 存根,使其匹配核心发布版本。`pnpm plugins:sync:check` 是非变更型发布保护检查;如果忘记了此步骤,发布工作流会在任何注册表变更前失败。
|
||||
- 在发布批准前运行手动 `Full Release Validation` 工作流,从一个入口点启动所有预发布测试盒。它接受分支、标签或完整提交 SHA,分发手动 `CI`,并为安装冒烟、包验收、跨 OS 包检查、QA Lab parity、Matrix 和 Telegram lane 分发 `OpenClaw Release Checks`。稳定版/默认运行会将详尽的 live/E2E 和 Docker 发布路径 soak 保持在 `run_release_soak=true` 之后;`release_profile=full` 会强制启用 soak。使用 `release_profile=full` 和 `rerun_group=all` 时,它还会针对来自发布检查的 `release-package-under-test` 产物运行包 Telegram E2E。发布后,如果同一个 Telegram E2E 也应验证已发布的 npm 包,请提供 `npm_telegram_package_spec`。发布后,如果 Package Acceptance 应针对已发布的 npm 包而不是按 SHA 构建的产物运行其包/更新矩阵,请提供 `package_acceptance_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` 以当前 `workflow_ref` harness 打包受信任的 `package_ref` 分支/标签/SHA;对带必需 SHA-256 的 HTTPS tarball 使用 `source=url`;或对另一个 GitHub Actions 运行上传的 tarball 使用 `source=artifact`。该工作流会将候选解析为 `package-under-test`,复用 Docker E2E 发布调度器来验证该 tarball,并可通过 `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 lane 包含 `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`
|
||||
常用 profile:
|
||||
- `smoke`:安装/渠道/智能体、Gateway 网关网络和配置 reload 车道
|
||||
- `package`:不包含 OpenWebUI 或 live ClawHub 的产物原生包/更新/插件车道
|
||||
- `product`:包 profile 加上 MCP 渠道、cron/子智能体清理、OpenAI web 搜索和 OpenWebUI
|
||||
- `full`:包含 OpenWebUI 的 Docker 发布路径分块
|
||||
常见配置档:
|
||||
- `smoke`:安装/渠道/智能体、Gateway 网关网络和配置重载 lane
|
||||
- `package`:无需 OpenWebUI 或 live ClawHub 的产物原生包/更新/插件 lane
|
||||
- `product`:包配置档加上 MCP 渠道、cron/subagent 清理、OpenAI web search 和 OpenWebUI
|
||||
- `full`:带 OpenWebUI 的 Docker 发布路径分块
|
||||
- `custom`:用于聚焦重跑的精确 `docker_lanes` 选择
|
||||
- 当你只需要发布候选版本的完整常规 CI 覆盖时,直接运行手动 `CI` 工作流。手动 CI 调度会绕过 changed 作用域,并强制运行 Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建 smoke、docs 检查、Python Skills、Windows、macOS、Android 和 Control UI i18n 车道。
|
||||
- 当你只需要发布候选版本的完整常规 CI 覆盖时,直接运行手动 `CI` 工作流。手动 CI 分发会绕过 changed 作用域并强制运行 Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、构建冒烟、文档检查、Python skills、Windows、macOS、Android 和 Control UI i18n lane。
|
||||
示例:`gh workflow run ci.yml --ref release/YYYY.M.D`
|
||||
- 验证发布 telemetry 时运行 `pnpm qa:otel:smoke`。它会通过本地 OTLP/HTTP receiver 运行 QA-lab,并在不需要 Opik、Langfuse 或其他外部 collector 的情况下验证导出的 trace span 名称、有界属性,以及内容/标识符脱敏。
|
||||
- 每次带标签发布前运行 `pnpm release:check`
|
||||
- 在标签存在后运行 `OpenClaw Release Publish`,执行会产生变更的发布序列。从 `release/YYYY.M.D` 调度它(或在发布 main 可达标签时从 `main` 调度),传入发布标签和成功的 OpenClaw npm `preflight_run_id`,并保留默认插件发布作用域 `all-publishable`,除非你明确在运行聚焦修复。该工作流会串行化插件 npm 发布、插件 ClawHub 发布和 OpenClaw npm 发布,确保核心包不会先于其外部化插件发布。
|
||||
- 验证发布遥测时运行 `pnpm qa:otel:smoke`。它会通过本地 OTLP/HTTP receiver 演练 QA-lab,并验证导出的 trace span 名称、有界属性以及内容/标识符脱敏,无需 Opik、Langfuse 或其他外部 collector。
|
||||
- 每次打标签发布前运行 `pnpm release:check`
|
||||
- 标签存在后,运行 `OpenClaw Release Publish` 执行会产生变更的发布序列。从 `release/YYYY.M.D` 分发它(或在发布 main 可达标签时从 `main` 分发),传入发布标签和成功的 OpenClaw npm `preflight_run_id`,并保留默认插件发布范围 `all-publishable`,除非你在有意执行聚焦修复。该工作流会串行化插件 npm 发布、插件 ClawHub 发布和 OpenClaw npm 发布,确保核心包不会早于其外置插件发布。
|
||||
- 发布检查现在在单独的手动工作流中运行:
|
||||
`OpenClaw Release Checks`
|
||||
- `OpenClaw Release Checks` 还会在发布批准前运行 QA Lab mock parity 车道,以及快速 live Matrix profile 和 Telegram QA 车道。live 车道使用 `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 lane,以及快速 live Matrix 配置档和 Telegram QA lane。live lane 使用 `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 发布路径保持短、确定且聚焦产物,同时较慢的 live 检查留在自己的车道中,避免拖慢或阻塞发布
|
||||
- 携带 secret 的发布检查应通过 `Full Release Validation` 调度,或从 `main`/发布工作流 ref 调度,以便工作流逻辑和 secret 保持受控
|
||||
- 此拆分是有意的:保持真实 npm 发布路径简短、确定且聚焦产物,同时将较慢的 live 检查保留在自己的 lane 中,避免它们拖慢或阻塞发布
|
||||
- 带 secret 的发布检查应通过 `Full Release Validation` 分发,或从 `main`/release workflow ref 分发,这样工作流逻辑和 secret 都保持受控
|
||||
- 只要解析出的提交可从 OpenClaw 分支或发布标签到达,`OpenClaw Release Checks` 就接受分支、标签或完整提交 SHA
|
||||
- `OpenClaw NPM Release` 的仅验证预检也接受当前完整 40 字符工作流分支提交 SHA,不要求已推送标签
|
||||
- `OpenClaw NPM Release` 仅验证预检也接受当前完整 40 字符 workflow-branch 提交 SHA,无需已推送标签
|
||||
- 该 SHA 路径仅用于验证,不能提升为真实发布
|
||||
- 在 SHA 模式下,工作流仅为包元数据检查合成 `v<package.json version>`;真实发布仍需要真实发布标签
|
||||
- 两个工作流都会把真实发布和提升路径保留在 GitHub 托管 runner 上,而非变更式验证路径可以使用更大的 Blacksmith Linux runner
|
||||
- 该工作流会同时使用 `OPENAI_API_KEY` 和 `ANTHROPIC_API_KEY` 工作流 secret 来运行 `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/correction 标签)
|
||||
- npm 发布后,运行 `node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`(或匹配的 beta/correction 版本),在全新的临时前缀中验证已发布 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_*` 环境凭据。
|
||||
- 若要从维护者机器运行完整的发布后 beta smoke,请使用 `pnpm release:beta-smoke -- --beta betaN`。该 helper 会运行 Parallels npm 更新/全新目标验证,调度 `NPM Telegram Beta E2E`,轮询精确工作流运行,下载产物,并打印 Telegram 报告。
|
||||
- 维护者可以通过手动 `NPM Telegram Beta E2E` 工作流从 GitHub Actions 运行同一个发布后检查。它有意设为仅手动,不会在每次 merge 时运行。
|
||||
- 维护者发布自动化现在使用预检后提升:
|
||||
- 在 SHA 模式下,工作流仅为包元数据检查合成 `v<package.json version>`;真实发布仍然需要真实发布标签
|
||||
- 两个工作流都会把真实发布和提升路径保留在 GitHub 托管 runner 上,而非变更型验证路径可以使用更大的 Blacksmith Linux runner
|
||||
- 该工作流使用 `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`,并同时使用 `OPENAI_API_KEY` 和 `ANTHROPIC_API_KEY` 工作流 secret
|
||||
- npm 发布预检不再等待单独的发布检查 lane
|
||||
- 在批准前运行 `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`(或匹配的 beta/correction 标签)
|
||||
- npm 发布后,运行 `node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`(或匹配的 beta/correction 版本),以在全新的临时 prefix 中验证已发布注册表安装路径
|
||||
- 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_*` 环境变量凭证。
|
||||
- 若要从维护者机器运行完整的发布后 beta 冒烟,请使用 `pnpm release:beta-smoke -- --beta betaN`。该 helper 会运行 Parallels npm 更新/全新目标验证,分发 `NPM Telegram Beta E2E`,轮询精确工作流运行,下载产物并打印 Telegram 报告。
|
||||
- 维护者可以通过手动 `NPM Telegram Beta E2E` 工作流,在 GitHub Actions 中运行同一发布后检查。它有意仅手动运行,不会在每次 merge 时运行。
|
||||
- 维护者发布自动化现在使用先预检后提升:
|
||||
- 真实 npm 发布必须通过成功的 npm `preflight_run_id`
|
||||
- 真实 npm 发布必须从与成功预检运行相同的 `main` 或 `release/YYYY.M.D` 分支调度
|
||||
- 真实 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`,而公开 repo 保持仅 OIDC 发布
|
||||
- 公开 `macOS Release` 仅用于验证;当标签只存在于发布分支但工作流从 `main` 调度时,设置 `public_release_branch=release/YYYY.M.D`
|
||||
- 真实私有 Mac 发布必须通过成功的私有 Mac `preflight_run_id` 和 `validate_run_id`
|
||||
- 真实发布路径会提升准备好的产物,而不是重新构建它们
|
||||
- 对于 `YYYY.M.D-N` 这样的稳定版 correction 发布,发布后 verifier 还会检查同一个临时前缀从 `YYYY.M.D` 升级到 `YYYY.M.D-N` 的路径,确保发布 correction 不会静默地让较旧的全局安装停留在基础稳定版 payload 上
|
||||
- 除非 tarball 同时包含 `dist/control-ui/index.html` 和非空的 `dist/control-ui/assets/` payload,否则 npm 发布预检会失败关闭,避免我们再次交付空的浏览器 dashboard
|
||||
- 发布后验证还会检查已发布插件入口点和包元数据是否存在于安装后的 registry 布局中。缺少插件运行时 payload 的发布会让 postpublish verifier 失败,并且不能提升到 `latest`。
|
||||
- `pnpm test:install:smoke` 也会对候选更新 tarball 强制执行 npm pack `unpackedSize` 预算,因此 installer e2e 会在发布路径前捕获意外的 pack 膨胀
|
||||
- 如果发布工作触及 CI 规划、插件 timing manifests 或插件测试矩阵,请在批准前重新生成并审查 planner 拥有的 `.github/workflows/plugin-prerelease.yml` 中的 `plugin-prerelease-extension-shard` 矩阵输出,确保发布说明不会描述过时的 CI 布局
|
||||
- 稳定版 macOS 发布就绪还包括 updater surfaces:
|
||||
- 稳定版 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` 仅用于验证;当标签仅存在于 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` 的同一临时 prefix 升级路径,确保发布修正不会静默地让较旧的全局安装停留在基础稳定版 payload 上
|
||||
- 除非 tarball 同时包含 `dist/control-ui/index.html` 和非空 `dist/control-ui/assets/` payload,否则 npm 发布预检会封闭失败,避免我们再次发布空的浏览器 dashboard
|
||||
- 发布后验证还会检查已发布插件入口点和包元数据是否存在于已安装注册表布局中。缺少插件运行时 payload 的发布会导致 postpublish verifier 失败,且不能提升为 `latest`。
|
||||
- `pnpm test:install:smoke` 还会对候选更新 tarball 执行 npm pack `unpackedSize` 预算限制,因此安装器 e2e 会在发布发布路径前捕获意外的打包膨胀
|
||||
- 如果发布工作触及 CI planning、插件 timing manifest 或插件测试矩阵,请在批准前重新生成并审查由 planner 拥有的 `.github/workflows/plugin-prerelease.yml` 中的 `plugin-prerelease-extension-shard` 矩阵输出,确保发布说明不会描述过时的 CI 布局
|
||||
- 稳定版 macOS 发布就绪状态还包括 updater surface:
|
||||
- GitHub release 最终必须包含打包后的 `.zip`、`.dmg` 和 `.dSYM.zip`
|
||||
- 发布后,`main` 上的 `appcast.xml` 必须指向新的稳定版 zip
|
||||
- 打包后的 app 必须保留非 debug bundle id、非空 Sparkle feed URL,并且 `CFBundleVersion` 不低于该发布版本的规范 Sparkle build floor
|
||||
- 打包后的 app 必须保留非 debug bundle id、非空 Sparkle feed URL,以及不低于该发布版本规范 Sparkle 构建下限的 `CFBundleVersion`
|
||||
|
||||
## 发布测试箱
|
||||
## 发布测试盒
|
||||
|
||||
`Full Release Validation` 是操作员从单个入口点启动所有预发布测试的方式。对于快速移动分支上的固定提交证明,请使用 helper,确保每个子工作流都从固定到目标 SHA 的临时分支运行:
|
||||
`Full Release Validation` 是操作者从一个入口点启动所有预发布测试的方式。若要在快速变动分支上获得固定提交证明,请使用 helper,让每个子工作流都从固定到目标 SHA 的临时分支运行:
|
||||
|
||||
```bash
|
||||
pnpm ci:full-release --sha <full-sha>
|
||||
```
|
||||
|
||||
该 helper 会推送 `release-ci/<sha>-...`,从该分支调度 `Full Release Validation` 并传入 `ref=<sha>`,验证每个子工作流的 `headSha` 都匹配目标,然后删除临时分支。这样可避免意外证明较新的 `main` 子运行。
|
||||
该 helper 会推送 `release-ci/<sha>-...`,从该分支分发 `Full Release Validation` 并传入 `ref=<sha>`,验证每个子工作流的 `headSha` 都匹配目标,然后删除临时分支。这可以避免意外证明更新的 `main` 子运行。
|
||||
|
||||
对于发布分支或标签验证,请从受信任的 `main` 工作流 ref 运行,并将发布分支或标签作为 `ref` 传入:
|
||||
对于 release 分支或标签验证,请从可信的 `main` workflow ref 运行,并将 release 分支或标签作为 `ref` 传入:
|
||||
|
||||
```bash
|
||||
gh workflow run full-release-validation.yml \
|
||||
@ -176,10 +162,22 @@ gh workflow run full-release-validation.yml \
|
||||
-f evidence_package_spec=openclaw@YYYY.M.D-beta.N
|
||||
```
|
||||
|
||||
该工作流会解析目标 ref,使用 `target_ref=<release-ref>` 触发手动 `CI`,触发 `OpenClaw Release Checks`,为面向包的检查准备父级 `release-package-under-test` 工件,并在 `release_profile=full` 且 `rerun_group=all`,或设置了 `npm_telegram_package_spec` 时,触发独立的包 Telegram E2E。随后,`OpenClaw Release Checks` 会扇出安装 smoke、跨 OS 发布检查、启用 soak 时的 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。
|
||||
不要在移动的 `main` 上使用 `--ref main -f ref=<sha>` 作为精确提交证明;原始提交 SHA 不能作为工作流触发 ref,因此请使用 `pnpm ci:full-release --sha <sha>` 创建固定的临时分支。
|
||||
该工作流会解析目标 ref,调度手动 `CI` 并设置
|
||||
`target_ref=<release-ref>`,调度 `OpenClaw Release Checks`,为面向包的检查准备一个父级 `release-package-under-test` 工件,并在 `release_profile=full` 且
|
||||
`rerun_group=all` 时,或在设置了 `npm_telegram_package_spec` 时,调度独立的包 Telegram E2E。随后,`OpenClaw Release
|
||||
Checks` 会展开安装冒烟、跨 OS 发布检查、启用 soak 时的 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 profile 的差异、工件以及聚焦重跑句柄。
|
||||
子工作流会从运行 `Full Release
|
||||
Validation` 的受信任 ref 调度,通常是 `--ref main`,即使目标 `ref` 指向较旧的发布分支或标签也是如此。没有单独的 Full Release Validation
|
||||
workflow-ref 输入;通过选择工作流运行 ref 来选择受信任 harness。
|
||||
不要使用 `--ref main -f ref=<sha>` 为移动中的 `main` 提供精确提交证明;
|
||||
原始提交 SHA 不能作为工作流调度 ref,因此请使用
|
||||
`pnpm ci:full-release --sha <sha>` 创建固定的临时分支。
|
||||
|
||||
使用 `release_profile` 选择 live/provider 覆盖广度:
|
||||
|
||||
@ -187,9 +185,16 @@ gh workflow run full-release-validation.yml \
|
||||
- `stable`:minimum 加上用于发布批准的稳定 provider/backend 覆盖
|
||||
- `full`:stable 加上广泛的 advisory provider/media 覆盖
|
||||
|
||||
当发布阻塞 lane 为绿色,并且你希望在晋级前执行详尽的 live/E2E、Docker 发布路径以及 all-since-2026.4.23 upgrade-survivor 扫描时,对 `stable` 使用 `run_release_soak=true`。`full` 隐含 `run_release_soak=true`。
|
||||
当发布阻塞 lane 为绿色,并且你希望在推广前执行详尽的 live/E2E、Docker 发布路径以及
|
||||
all-since-2026.4.23 upgrade-survivor 扫描时,请将 `run_release_soak=true` 与 `stable` 一起使用。`full` 隐含
|
||||
`run_release_soak=true`。
|
||||
|
||||
`OpenClaw Release Checks` 使用受信任的工作流 ref 将目标 ref 一次性解析为 `release-package-under-test`,并在 soak 运行时,在跨 OS、Package Acceptance 和发布路径 Docker 检查中复用该工件。这会让所有面向包的盒子使用相同字节,并避免重复构建包。当设置了 repo/org 变量时,跨 OS OpenAI 安装 smoke 使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用 `openai/gpt-5.4`,因为此 lane 证明的是包安装、新手引导、Gateway 网关启动和一次 live 智能体轮次,而不是对最慢默认模型进行基准测试。更广泛的 live provider 矩阵仍然是模型特定覆盖的位置。
|
||||
`OpenClaw Release Checks` 使用受信任 workflow ref 将目标
|
||||
ref 一次性解析为 `release-package-under-test`,并在 soak 运行时在 cross-OS、
|
||||
Package Acceptance 和 release-path Docker 检查中复用该工件。这样能让所有面向包的 box 使用相同字节,并避免重复构建包。
|
||||
当 repo/org 变量已设置时,cross-OS OpenAI 安装冒烟会使用 `OPENCLAW_CROSS_OS_OPENAI_MODEL`,否则使用
|
||||
`openai/gpt-5.4`,因为此 lane 要证明的是包安装、新手引导、Gateway 网关启动以及一次 live agent 回合,而不是对最慢的默认模型进行基准测试。更广泛的 live provider
|
||||
矩阵仍然是执行模型特定覆盖的位置。
|
||||
|
||||
根据发布阶段使用这些变体:
|
||||
|
||||
@ -221,22 +226,30 @@ gh workflow run full-release-validation.yml \
|
||||
-f npm_telegram_provider_mode=mock-openai
|
||||
```
|
||||
|
||||
不要把完整 umbrella 作为聚焦修复后的第一次重跑。如果一个盒子失败,请将失败的子工作流、作业、Docker lane、包配置文件、模型提供商或 QA lane 用作下一次证明。只有当修复更改了共享发布编排,或使先前的全盒证据过期时,才再次运行完整 umbrella。umbrella 的最终验证器会重新检查记录的子工作流运行 ID,因此在子工作流成功重跑后,只需重跑失败的 `Verify full validation` 父作业。
|
||||
不要把完整 umbrella 用作聚焦修复后的第一次重跑。如果某个 box 失败,请使用失败的子工作流、作业、Docker lane、包 profile、模型提供商或 QA lane 作为下一次证明。只有当修复更改了共享发布编排,或让先前的 all-box 证据过期时,才再次运行完整 umbrella。umbrella 的最终验证器会重新检查已记录的子工作流运行 ID,因此在子工作流成功重跑后,只需重跑失败的
|
||||
`Verify full validation` 父作业。
|
||||
|
||||
对于有界恢复,将 `rerun_group` 传递给 umbrella。`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 包工件。
|
||||
对于有界恢复,请将 `rerun_group` 传给 umbrella。`all` 是真正的发布候选运行,`ci` 只运行 normal CI 子项,`plugin-prerelease`
|
||||
只运行仅发布用插件子项,`release-checks` 运行每个发布
|
||||
box,更窄的发布组为 `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 包工件。聚焦
|
||||
cross-OS 重跑可以添加 `cross_os_suite_filter=windows/packaged-upgrade` 或另一个 OS/suite 过滤器。QA release-check 失败属于 advisory;仅 QA 失败不会阻塞发布验证。
|
||||
|
||||
### Vitest
|
||||
|
||||
Vitest 盒子是手动 `CI` 子工作流。手动 CI 会有意绕过 changed 作用域,并为发布候选强制执行普通测试图:Linux Node 分片、内置插件分片、渠道契约、Node 22 兼容性、`check`、`check-additional`、build smoke、docs checks、Python skills、Windows、macOS、Android 和 Control UI i18n。
|
||||
Vitest box 是手动 `CI` 子工作流。手动 CI 会有意绕过 changed scoping,并为发布候选强制执行 normal 测试图:Linux Node 分片、内置插件分片、channel contracts、Node 22
|
||||
兼容性、`check`、`check-additional`、构建冒烟、文档检查、Python
|
||||
Skills、Windows、macOS、Android 和 Control UI i18n。
|
||||
|
||||
使用这个盒子回答“源代码树是否通过了完整的普通测试套件?”它不同于发布路径产品验证。需要保留的证据:
|
||||
使用此 box 回答“源代码树是否通过了完整 normal 测试套件?”它不同于 release-path 产品验证。需要保留的证据:
|
||||
|
||||
- `Full Release Validation` 摘要,显示已触发的 `CI` 运行 URL
|
||||
- `CI` 在精确目标 SHA 上运行绿色
|
||||
- 调查回归时来自 CI 作业的失败或缓慢分片名称
|
||||
- 当运行需要性能分析时,保留 Vitest 时间工件,例如 `.artifacts/vitest-shard-timings.json`
|
||||
- 显示已调度 `CI` 运行 URL 的 `Full Release Validation` 摘要
|
||||
- 精确目标 SHA 上绿色的 `CI` 运行
|
||||
- 调查回归时来自 CI 作业的失败或慢速分片名称
|
||||
- 当运行需要性能分析时,保留 Vitest timing 工件,例如 `.artifacts/vitest-shard-timings.json`
|
||||
|
||||
仅当发布需要确定性的普通 CI,但不需要 Docker、QA Lab、live、跨 OS 或包盒子时,才直接运行手动 CI:
|
||||
仅当发布需要确定性的 normal CI,而不需要 Docker、QA Lab、live、cross-OS 或 package box 时,才直接运行手动 CI:
|
||||
|
||||
```bash
|
||||
gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
|
||||
@ -244,51 +257,84 @@ 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 box 位于 `OpenClaw Release Checks` 中,通过
|
||||
`openclaw-live-and-e2e-checks-reusable.yml` 以及 release-mode
|
||||
`install-smoke` 工作流实现。它通过打包的 Docker 环境验证发布候选,而不只是源代码级测试。
|
||||
|
||||
发布 Docker 覆盖包括:
|
||||
|
||||
- 启用慢速 Bun 全局安装 smoke 的完整安装 smoke
|
||||
- 按目标 SHA 准备/复用根 Dockerfile smoke 镜像,其中 QR、root/gateway 和 installer/Bun smoke 作业作为单独的 install-smoke 分片运行
|
||||
- 仓库 E2E lane
|
||||
- 发布路径 Docker chunk:`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` chunk 内的 OpenWebUI 覆盖
|
||||
- 拆分的内置插件安装/卸载 lane,从 `bundled-plugin-install-uninstall-0` 到 `bundled-plugin-install-uninstall-23`
|
||||
- 当 release checks 包含 live 套件时的 live/E2E provider 套件和 Docker live 模型覆盖
|
||||
- 启用慢速 Bun 全局安装冒烟的完整安装冒烟
|
||||
- 按目标 SHA 准备/复用根 Dockerfile 冒烟镜像,并将 QR、
|
||||
root/gateway 和 installer/Bun 冒烟作业作为独立 install-smoke
|
||||
分片运行
|
||||
- 仓库 E2E lanes
|
||||
- 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 覆盖
|
||||
- 拆分的内置插件安装/卸载 lanes:
|
||||
`bundled-plugin-install-uninstall-0` 到
|
||||
`bundled-plugin-install-uninstall-23`
|
||||
- 当 release checks 包含 live suites 时,覆盖 live/E2E provider suites 和 Docker live 模型
|
||||
|
||||
重跑前先使用 Docker 工件。发布路径调度器会上传 `.artifacts/docker-tests/`,其中包含 lane 日志、`summary.json`、`failures.json`、阶段时间、调度器计划 JSON 和重跑命令。对于聚焦恢复,请在可复用 live/E2E 工作流上使用 `docker_lanes=<lane[,lane]>`,而不是重跑所有发布 chunk。生成的重跑命令在可用时包含先前的 `package_artifact_run_id` 和已准备的 Docker 镜像输入,因此失败的 lane 可以复用相同的 tarball 和 GHCR 镜像。
|
||||
重跑前先使用 Docker 工件。release-path 调度器会上传
|
||||
`.artifacts/docker-tests/`,其中包含 lane 日志、`summary.json`、`failures.json`、
|
||||
阶段耗时、调度器计划 JSON 和重跑命令。对于聚焦恢复,请在可复用 live/E2E 工作流上使用 `docker_lanes=<lane[,lane]>`,而不是重跑所有发布分块。生成的重跑命令会在可用时包含之前的
|
||||
`package_artifact_run_id` 和已准备的 Docker 镜像输入,因此失败 lane 可以复用相同的 tarball 和 GHCR 镜像。
|
||||
|
||||
### QA Lab
|
||||
|
||||
QA Lab 盒子也是 `OpenClaw Release Checks` 的一部分。它是智能体行为和渠道级发布门禁,独立于 Vitest 和 Docker 包机制。
|
||||
QA Lab box 也是 `OpenClaw Release Checks` 的一部分。它是 agentic
|
||||
行为和 channel 级发布门禁,与 Vitest 和 Docker
|
||||
包机制分开。
|
||||
|
||||
发布 QA Lab 覆盖包括:
|
||||
|
||||
- mock parity lane,使用 agentic parity pack 将 OpenAI 候选 lane 与 Opus 4.6 基线进行比较
|
||||
- 使用 `qa-live-shared` 环境的快速 live Matrix QA 配置文件
|
||||
- 使用 agentic parity pack 将 OpenAI 候选 lane 与 Opus 4.6
|
||||
基线进行比较的 mock parity lane
|
||||
- 使用 `qa-live-shared` 环境的快速 live Matrix QA profile
|
||||
- 使用 Convex CI 凭据租约的 live Telegram QA lane
|
||||
- 当发布遥测需要明确本地证明时运行 `pnpm qa:otel:smoke`
|
||||
|
||||
使用这个盒子回答“发布在 QA 场景和 live 渠道流程中是否行为正确?”批准发布时保留 parity、Matrix 和 Telegram lane 的工件 URL。完整 Matrix 覆盖仍可作为手动分片 QA-Lab 运行使用,而不是默认的发布关键 lane。
|
||||
使用此 box 回答“发布在 QA 场景和 live channel flows 中行为是否正确?”批准发布时,请保留 parity、Matrix 和 Telegram
|
||||
lane 的工件 URL。完整 Matrix 覆盖仍可作为手动分片 QA-Lab 运行,而不是默认的发布关键 lane。
|
||||
|
||||
### Package
|
||||
### 包
|
||||
|
||||
Package 盒子是可安装产品门禁。它由 `Package Acceptance` 和解析器 `scripts/resolve-openclaw-package-candidate.mjs` 支持。解析器会将候选规范化为 Docker E2E 使用的 `package-under-test` tarball,验证包清单,记录包版本和 SHA-256,并保持工作流 harness ref 与包源 ref 分离。
|
||||
Package box 是可安装产品门禁。它由
|
||||
`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`:下载需要 `package_sha256` 的 HTTPS `.tgz`
|
||||
- `source=artifact`:复用另一个 GitHub Actions 运行上传的 `.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`、`telegram_mode=mock-openai` 运行 Package Acceptance。Package Acceptance 会针对相同解析出的 tarball 保持迁移、更新、陈旧插件依赖清理、离线插件 fixture、插件更新和 Telegram 包 QA。阻塞发布检查使用默认的最新已发布包基线;`run_release_soak=true` 或 `release_profile=full` 会扩展到从 `2026.4.23` 到 `latest` 的每个稳定 npm 已发布基线,以及 reported-issue fixture。对于已经发布的候选,请使用带 `source=npm` 的 Package Acceptance;对于发布前由 SHA 支持的本地 npm tarball,请使用 `source=ref`/`source=artifact`。它是 GitHub 原生替代方案,用来覆盖此前大多需要 Parallels 的包/更新验证。跨 OS 发布检查对于 OS 特定的新手引导、安装器和平台行为仍然重要,但包/更新产品验证应优先使用 Package Acceptance。
|
||||
`OpenClaw Release Checks` 运行 Package Acceptance,并使用 `source=artifact`、已准备的发布包工件、`suite_profile=custom`、
|
||||
`docker_lanes=doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update`、
|
||||
`telegram_mode=mock-openai`。Package Acceptance 会让迁移、更新、过时插件依赖清理、离线插件 fixtures、插件更新和 Telegram
|
||||
包 QA 都针对同一个已解析 tarball 运行。阻塞发布检查使用默认的最新已发布包基线;`run_release_soak=true` 或
|
||||
`release_profile=full` 会扩展到从
|
||||
`2026.4.23` 到 `latest` 的每个稳定 npm 已发布基线,以及已报告问题的 fixtures。对已经发布的候选使用
|
||||
Package Acceptance 且 `source=npm`;对发布前由 SHA 支撑的本地 npm tarball 使用 `source=ref`/`source=artifact`。它是大多数此前需要
|
||||
Parallels 的 package/update 覆盖的 GitHub 原生替代方案。Cross-OS release checks 对 OS 特定新手引导、安装器和平台行为仍然重要,但 package/update 产品验证应优先使用 Package Acceptance。
|
||||
|
||||
更新和插件验证的规范清单是[更新和插件测试](/zh-CN/help/testing-updates-plugins)。在决定哪个本地、Docker、Package Acceptance 或 release-check lane 能证明插件安装/更新、Doctor 清理或已发布包迁移更改时使用它。从每个稳定 `2026.4.23+` 包进行的详尽已发布更新迁移是单独的手动 `Update Migration` 工作流,不属于 Full Release CI。
|
||||
更新和插件验证的规范清单是
|
||||
[更新和插件测试](/zh-CN/help/testing-updates-plugins)。在决定哪个本地、Docker、Package Acceptance 或 release-check lane 能证明插件安装/更新、Doctor 清理或已发布包迁移变更时,请使用它。
|
||||
从每个稳定 `2026.4.23+` 包执行详尽的已发布更新迁移是一个单独的手动 `Update Migration` 工作流,不属于 Full Release CI。
|
||||
|
||||
旧版 package-acceptance 宽松策略是有意限时的。到 `2026.4.25` 为止的包可以针对已发布到 npm 的元数据缺口使用兼容路径:tarball 中缺失的私有 QA 清单条目、缺失的 `gateway install --wrapper`、tarball 派生 git fixture 中缺失的 patch 文件、缺失的持久化 `update.channel`、旧版插件安装记录位置、缺失的 marketplace 安装记录持久化,以及 `plugins update` 期间的配置元数据迁移。已发布的 `2026.4.26` 包可以对已经发布的本地构建元数据 stamp 文件发出警告。更晚的包必须满足现代包契约;这些相同缺口会导致发布验证失败。
|
||||
旧版 package-acceptance 宽松策略有意设置了时间限制。截至
|
||||
`2026.4.25` 的包可以对已发布到 npm 的元数据缺口使用兼容路径:tarball 中缺失的私有 QA 清单条目、缺失的
|
||||
`gateway install --wrapper`、tarball 派生 git fixture 中缺失的补丁文件、缺失的持久化 `update.channel`、旧版插件 install-record
|
||||
位置、缺失的 marketplace install-record 持久化,以及 `plugins update` 期间的配置元数据迁移。已发布的 `2026.4.26` 包可能会对已经发出的本地构建元数据戳文件发出警告。后续包必须满足现代包契约;这些相同缺口会导致发布验证失败。
|
||||
|
||||
当发布问题涉及实际可安装包时,使用更广泛的 Package Acceptance 配置文件:
|
||||
当发布问题涉及实际可安装包时,请使用更广泛的 Package Acceptance profile:
|
||||
|
||||
```bash
|
||||
gh workflow run package-acceptance.yml \
|
||||
@ -300,28 +346,35 @@ 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
|
||||
- `smoke`:快速包安装/渠道/智能体、Gateway 网关网络和配置
|
||||
重载通道
|
||||
- `package`:不依赖实时 ClawHub 的安装/更新/插件包契约;这是发布检查的
|
||||
默认值
|
||||
- `product`:`package` 加上 MCP 渠道、cron/子智能体清理、OpenAI Web
|
||||
搜索和 OpenWebUI
|
||||
- `full`:带 OpenWebUI 的 Docker 发布路径分块
|
||||
- `custom`:用于聚焦重跑的精确 `docker_lanes` 列表
|
||||
|
||||
对于候选包的 Telegram 验证,在 Package Acceptance 上启用 `telegram_mode=mock-openai` 或
|
||||
`telegram_mode=live-frontier`。该工作流会把解析出的 `package-under-test` tarball 传入 Telegram 通道;独立的
|
||||
Telegram 工作流仍然接受已发布的 npm 规格用于发布后检查。
|
||||
如需包候选版本的 Telegram 证明,请在 Package Acceptance 上启用 `telegram_mode=mock-openai` 或
|
||||
`telegram_mode=live-frontier`。该 workflow 会把解析出的
|
||||
`package-under-test` tarball 传入 Telegram 通道;独立的
|
||||
Telegram workflow 仍接受已发布的 npm 规格,用于发布后检查。
|
||||
|
||||
## 发布发布自动化
|
||||
|
||||
`OpenClaw Release Publish` 是常规的变更型发布入口点。它会按发布所需的顺序编排受信任发布者工作流:
|
||||
`OpenClaw Release Publish` 是常规的变更型发布入口点。它会按发布所需顺序
|
||||
编排受信发布者 workflow:
|
||||
|
||||
1. 签出发布标签并解析其提交 SHA。
|
||||
1. 检出发布标签并解析其提交 SHA。
|
||||
2. 验证该标签可从 `main` 或 `release/*` 到达。
|
||||
3. 运行 `pnpm plugins:sync:check`。
|
||||
4. 使用 `publish_scope=all-publishable` 和 `ref=<release-sha>` 分发 `Plugin NPM Release`。
|
||||
5. 使用相同范围和 SHA 分发 `Plugin ClawHub Release`。
|
||||
6. 使用发布标签、npm dist-tag 和保存的 `preflight_run_id` 分发 `OpenClaw NPM Release`。
|
||||
4. 使用 `publish_scope=all-publishable` 和
|
||||
`ref=<release-sha>` 调度 `Plugin NPM Release`。
|
||||
5. 使用相同 scope 和 SHA 调度 `Plugin ClawHub Release`。
|
||||
6. 使用发布标签、npm dist-tag 和
|
||||
已保存的 `preflight_run_id` 调度 `OpenClaw NPM Release`。
|
||||
|
||||
Beta 发布示例:
|
||||
|
||||
@ -353,66 +406,91 @@ gh workflow run openclaw-release-publish.yml \
|
||||
-f npm_dist_tag=latest
|
||||
```
|
||||
|
||||
仅在聚焦修复或重新发布工作时使用较低层级的 `Plugin NPM Release` 和 `Plugin ClawHub Release` 工作流。对于选定插件修复,将
|
||||
仅在聚焦修复或重新发布工作中使用更底层的 `Plugin NPM Release` 和 `Plugin ClawHub Release` workflow。对于选定插件修复,将
|
||||
`plugin_publish_scope=selected` 和 `plugins=@openclaw/name` 传给
|
||||
`OpenClaw Release Publish`;或者当不得发布 OpenClaw 包时,直接分发子工作流。
|
||||
`OpenClaw Release Publish`;如果不得发布 OpenClaw 包,则直接调度子 workflow。
|
||||
|
||||
## NPM 工作流输入
|
||||
## NPM workflow 输入
|
||||
|
||||
`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 字符 workflow 分支提交 SHA,用于仅验证的预检
|
||||
- `preflight_only`:`true` 表示仅验证/构建/打包,`false` 表示
|
||||
真实发布路径
|
||||
- `preflight_run_id`:真实发布路径必填,用于让 workflow 复用
|
||||
成功预检运行中准备好的 tarball
|
||||
- `npm_dist_tag`:发布路径的 npm 目标标签;默认为 `beta`
|
||||
|
||||
`OpenClaw Release Publish` 接受这些由操作员控制的输入:
|
||||
`OpenClaw Release Publish` 接受以下由操作员控制的输入:
|
||||
|
||||
- `tag`:必需的发布标签;必须已存在
|
||||
- `preflight_run_id`:成功的 `OpenClaw NPM Release` 预检运行 ID;当 `publish_openclaw_npm=true` 时必需
|
||||
- `tag`:必填发布标签;必须已经存在
|
||||
- `preflight_run_id`:成功的 `OpenClaw NPM Release` 预检运行 ID;
|
||||
当 `publish_openclaw_npm=true` 时必填
|
||||
- `npm_dist_tag`:OpenClaw 包的 npm 目标标签
|
||||
- `plugin_publish_scope`:默认值为 `all-publishable`;仅在聚焦修复工作中使用 `selected`
|
||||
- `plugins`:当 `plugin_publish_scope=selected` 时,逗号分隔的 `@openclaw/*` 包名
|
||||
- `publish_openclaw_npm`:默认值为 `true`;仅在把该工作流用作仅插件修复编排器时设置为 `false`
|
||||
- `plugin_publish_scope`:默认为 `all-publishable`;仅在聚焦修复工作中
|
||||
使用 `selected`
|
||||
- `plugins`:当 `plugin_publish_scope=selected` 时使用的逗号分隔
|
||||
`@openclaw/*` 包名
|
||||
- `publish_openclaw_npm`:默认为 `true`;仅当把该 workflow 用作
|
||||
仅插件修复编排器时设置为 `false`
|
||||
|
||||
`OpenClaw Release Checks` 接受这些由操作员控制的输入:
|
||||
`OpenClaw Release Checks` 接受以下由操作员控制的输入:
|
||||
|
||||
- `ref`:要验证的分支、标签或完整提交 SHA。带有密钥的检查要求解析出的提交可从 OpenClaw 分支或发布标签到达。
|
||||
- `run_release_soak`:在稳定版/默认发布检查中选择加入完整的实时/E2E、Docker 发布路径和所有既往升级幸存者 soak。`release_profile=full` 会强制启用它。
|
||||
- `ref`:要验证的分支、标签或完整提交 SHA。带有密钥的检查要求
|
||||
解析出的提交可从 OpenClaw 分支或发布标签到达。
|
||||
- `run_release_soak`:在稳定版/默认发布检查中选择加入穷尽式实时/E2E、Docker 发布路径和
|
||||
所有历史版本升级幸存 soak。它会被 `release_profile=full` 强制启用。
|
||||
|
||||
规则:
|
||||
|
||||
- 稳定版和修正版标签可以发布到 `beta` 或 `latest`
|
||||
- 稳定版和修正版标签可发布到 `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` 始终
|
||||
仅用于验证
|
||||
- 真实发布路径必须使用预检期间使用的相同 `npm_dist_tag`;
|
||||
workflow 会在发布继续前验证该元数据
|
||||
|
||||
## 稳定版 npm 发布序列
|
||||
## 稳定版 npm 发布顺序
|
||||
|
||||
切稳定版 npm 发布时:
|
||||
|
||||
1. 使用 `preflight_only=true` 运行 `OpenClaw NPM Release`
|
||||
- 在标签存在之前,你可以使用当前完整的工作流分支提交 SHA,对预检工作流进行仅验证的试运行
|
||||
2. 对于常规的 beta 优先流程,选择 `npm_dist_tag=beta`;仅在你有意直接发布稳定版时选择 `latest`
|
||||
3. 当你希望通过一个手动工作流获得常规 CI 加实时 prompt cache、Docker、QA Lab、Matrix 和 Telegram 覆盖时,在发布分支、发布标签或完整提交 SHA 上运行 `Full Release Validation`
|
||||
4. 如果你有意只需要确定性的常规测试图,请改为在发布 ref 上运行手动 `CI` 工作流
|
||||
- 在标签存在之前,你可以使用当前完整 workflow 分支提交
|
||||
SHA 对预检 workflow 做一次仅验证试运行
|
||||
2. 对常规先 beta 流程选择 `npm_dist_tag=beta`,或仅在你有意直接发布稳定版时
|
||||
选择 `latest`
|
||||
3. 当你希望用一个手动 workflow 获取常规 CI 加实时提示缓存、Docker、QA Lab、
|
||||
Matrix 和 Telegram 覆盖时,在发布分支、发布标签或完整
|
||||
提交 SHA 上运行 `Full Release Validation`
|
||||
4. 如果你确实只需要确定性的常规测试图,请改为在发布 ref 上运行
|
||||
手动 `CI` workflow
|
||||
5. 保存成功的 `preflight_run_id`
|
||||
6. 使用相同的 `tag`、相同的 `npm_dist_tag` 和保存的 `preflight_run_id` 运行 `OpenClaw Release Publish`;它会先将外部化插件发布到 npm 和 ClawHub,然后再提升 OpenClaw npm 包
|
||||
7. 如果发布落在 `beta` 上,使用私有
|
||||
6. 使用相同的 `tag`、相同的 `npm_dist_tag`
|
||||
和已保存的 `preflight_run_id` 运行 `OpenClaw Release Publish`;它会先把外置插件发布到 npm
|
||||
和 ClawHub,然后再提升 OpenClaw npm 包
|
||||
7. 如果发布落在 `beta`,请使用私有
|
||||
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
|
||||
工作流将该稳定版本从 `beta` 提升到 `latest`
|
||||
8. 如果发布有意直接发布到 `latest`,且 `beta` 应立即跟随相同稳定构建,请使用同一个私有工作流将两个 dist-tag 都指向该稳定版本,或让其定时自愈同步稍后移动 `beta`
|
||||
workflow 将该稳定版本从 `beta` 提升到 `latest`
|
||||
8. 如果发布有意直接发布到 `latest`,且 `beta`
|
||||
应立即跟随同一稳定构建,请使用同一私有
|
||||
workflow 将两个 dist-tag 都指向该稳定版本,或让其定时
|
||||
自愈同步稍后移动 `beta`
|
||||
|
||||
dist-tag 变更位于私有仓库中是出于安全考虑,因为它仍然需要 `NPM_TOKEN`,而公共仓库保留仅 OIDC 的发布。
|
||||
dist-tag 变更位于私有仓库中是出于安全考虑,因为它仍然
|
||||
需要 `NPM_TOKEN`,而公共仓库保持仅 OIDC 发布。
|
||||
|
||||
这让直接发布路径和 beta 优先提升路径都保持有文档记录,并对操作员可见。
|
||||
这让直接发布路径和先 beta 后提升路径都保持
|
||||
有文档记录且对操作员可见。
|
||||
|
||||
如果维护者必须回退到本地 npm 认证,请仅在专用 tmux 会话内运行任何 1Password
|
||||
CLI(`op`)命令。不要直接从主智能体 shell 调用 `op`;将其放在 tmux 内可以让提示、告警和 OTP 处理可观察,并防止重复的主机告警。
|
||||
如果维护者必须回退到本地 npm 身份验证,请仅在专用 tmux 会话中运行任何 1Password
|
||||
CLI (`op`) 命令。不要直接从主智能体 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)
|
||||
|
||||
@ -1,22 +1,22 @@
|
||||
---
|
||||
read_when:
|
||||
- 运行或重新运行完整发布验证
|
||||
- 比较稳定版和完整发布验证配置文件
|
||||
- 比较稳定版和完整版发布验证配置文件
|
||||
- 调试发布验证阶段失败
|
||||
summary: 完整发布验证阶段、子工作流、发布配置档、重跑句柄和证据
|
||||
summary: 完整发布验证阶段、子工作流、发布配置文件、重新运行句柄和证据
|
||||
title: 完整发布验证
|
||||
x-i18n:
|
||||
generated_at: "2026-05-04T22:29:45Z"
|
||||
generated_at: "2026-05-05T01:33:45Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: d67b7f9d413aa0f367b71f03d5325ff73591ee1ee6c77623712ebd15d295ca8b
|
||||
source_hash: 6cf696761f516fc7f8e9606a2a06fab61a644731330eb484a388f276767a9e0d
|
||||
source_path: reference/full-release-validation.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
`Full Release Validation` 是发布总控流程。它是预发布验证的单一手动入口点,但大部分工作发生在子工作流中,因此失败的执行单元可以重新运行,而不必重启整个发布流程。
|
||||
`Full Release Validation` 是发布总入口。它是发布前证明的唯一手动入口点,但大部分工作发生在子工作流中,因此失败的运行环境可以重新运行,而无需重启整个发布流程。
|
||||
|
||||
从受信任的工作流引用运行它,通常是 `main`,并将发布分支、标签或完整提交 SHA 作为 `ref` 传入:
|
||||
从受信任的工作流 ref 运行它,通常是 `main`,并将发布分支、标签或完整提交 SHA 作为 `ref` 传入:
|
||||
|
||||
```bash
|
||||
gh workflow run full-release-validation.yml \
|
||||
@ -27,43 +27,43 @@ gh workflow run full-release-validation.yml \
|
||||
-f release_profile=stable
|
||||
```
|
||||
|
||||
子工作流使用受信任的工作流引用作为 harness,并使用输入 `ref` 作为待测候选版本。这样在验证较旧的发布分支或标签时,也能使用新的验证逻辑。
|
||||
子工作流使用受信任的工作流 ref 作为执行框架,并使用输入的 `ref` 作为待测试候选版本。这样在验证较旧的发布分支或标签时,仍可使用新的验证逻辑。
|
||||
|
||||
默认情况下,`release_profile=stable` 会运行阻塞发布的通道,并跳过完整的实时/Docker 长时间浸泡测试。传入 `run_release_soak=true` 可在稳定版运行中包含浸泡测试通道。`release_profile=full` 始终启用浸泡测试通道,因此广泛的 advisory 配置不会悄悄降低覆盖范围。
|
||||
默认情况下,`release_profile=stable` 会运行发布阻断通道,并跳过详尽的实时/Docker 长时间浸泡测试。在稳定版运行中传入 `run_release_soak=true` 可包含浸泡测试通道。`release_profile=full` 始终启用浸泡测试通道,因此广覆盖咨询配置不会静默丢失覆盖范围。
|
||||
|
||||
Package Acceptance 通常会从解析后的 `ref` 构建候选 tarball,包括通过 `pnpm ci:full-release` 调度的完整 SHA 运行。发布后,传入 `package_acceptance_package_spec=openclaw@YYYY.M.D`(或 `openclaw@beta`/`openclaw@latest`),即可改为针对已发布的 npm 包运行同一套包/更新矩阵。
|
||||
Package Acceptance 通常会从解析后的 `ref` 构建候选 tarball,包括通过 `pnpm ci:full-release` 分发的完整 SHA 运行。发布后,传入 `package_acceptance_package_spec=openclaw@YYYY.M.D`(或 `openclaw@beta`/`openclaw@latest`)即可改为针对已发布的 npm 包运行同一套包/更新矩阵。
|
||||
|
||||
## 顶层阶段
|
||||
|
||||
| 阶段 | 详情 |
|
||||
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 目标解析 | **作业:** `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 国际化,以及通过总控流程运行的 Android。<br />**重新运行:** `rerun_group=ci`。 |
|
||||
| 插件预发布 | **作业:** `Run plugin prerelease validation`<br />**子工作流:** `Plugin Prerelease`<br />**证明:** 仅发布用插件静态检查、agentic 插件覆盖、完整扩展批次分片,以及插件预发布 Docker 通道。<br />**重新运行:** `rerun_group=plugin-prerelease`。 |
|
||||
| 发布检查 | **作业:** `Run release/live/Docker/QA validation`<br />**子工作流:** `OpenClaw Release Checks`<br />**证明:** 安装冒烟测试、跨 OS 包检查、Package Acceptance、QA Lab parity、实时 Matrix 和实时 Telegram。使用 `run_release_soak=true` 或 `release_profile=full` 时,还会运行完整的实时/E2E 套件和 Docker 发布路径分块。<br />**重新运行:** `rerun_group=release-checks` 或更窄的 release-checks 句柄。 |
|
||||
| 包产物 | **作业:** `Prepare release package artifact`<br />**子工作流:** 无<br />**证明:** 提前创建父级 `release-package-under-test` tarball,供不需要等待 `OpenClaw Release Checks` 的面向包检查使用。<br />**重新运行:** 重新运行总控流程,或为 `rerun_group=npm-telegram` 提供 `npm_telegram_package_spec`。 |
|
||||
| 包 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 />**重新运行:** 重新运行失败的子工作流使其变绿后,只重新运行此作业。 |
|
||||
| 阶段 | 详细信息 |
|
||||
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 目标解析 | **作业:** `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 />**证明:** 安装冒烟、跨操作系统包检查、Package Acceptance、QA Lab 一致性、实时 Matrix,以及实时 Telegram。使用 `run_release_soak=true` 或 `release_profile=full` 时,还会运行详尽的实时/E2E 套件和 Docker 发布路径分块。<br />**重新运行:** `rerun_group=release-checks` 或更窄的 release-checks 句柄。 |
|
||||
| 包产物 | **作业:** `Prepare release package artifact`<br />**子工作流:** 无<br />**证明:** 足够早地创建父级 `release-package-under-test` tarball,以便面向包的检查无需等待 `OpenClaw Release Checks`。<br />**重新运行:** 重新运行总入口,或为 `rerun_group=npm-telegram` 提供 `npm_telegram_package_spec`。 |
|
||||
| 包 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` 产物。
|
||||
|
||||
| 阶段 | 详细信息 |
|
||||
| 阶段 | 详情 |
|
||||
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 发布目标 | **作业:** `Resolve target ref`<br />**支撑 workflow:** 无<br />**测试:** 选定的 ref、可选的预期 SHA、配置档、重跑组以及聚焦的 live 套件过滤器。<br />**重跑:** `rerun_group=release-checks`。 |
|
||||
| 包构件 | **作业:** `Prepare release package artifact`<br />**支撑 workflow:** 无<br />**测试:** 打包或解析一个候选 tarball,并上传 `release-package-under-test`,供下游面向包的检查使用。<br />**重跑:** 受影响的包、跨 OS 或 live/E2E 组。 |
|
||||
| 安装冒烟测试 | **作业:** `Run install smoke`<br />**支撑 workflow:** `Install Smoke`<br />**测试:** 完整安装路径,包括复用根 Dockerfile 冒烟镜像、QR 包安装、根和 Gateway 网关 Docker 冒烟测试、安装器 Docker 测试、Bun 全局安装 image-provider 冒烟测试,以及快速内置插件安装/卸载 E2E。<br />**重跑:** `rerun_group=install-smoke`。 |
|
||||
| 跨 OS | **作业:** `cross_os_release_checks`<br />**支撑 workflow:** `OpenClaw Cross-OS Release Checks (Reusable)`<br />**测试:** 在 Linux、Windows 和 macOS 上,针对选定的提供商和模式运行全新安装与升级通道,使用候选 tarball 加基线包。<br />**重跑:** `rerun_group=cross-os`。 |
|
||||
| 仓库和 live E2E | **作业:** `Run repo/live E2E validation`<br />**支撑 workflow:** `OpenClaw Live And E2E Checks (Reusable)`<br />**测试:** 仓库 E2E、live 缓存、OpenAI websocket 流式传输、原生 live 提供商和插件分片,以及由 `release_profile` 选择的 Docker 支撑 live 模型/backend/Gateway 网关 harness。<br />**运行:** `run_release_soak=true`、`release_profile=full`,或聚焦的 `rerun_group=live-e2e`。<br />**重跑:** `rerun_group=live-e2e`,可选带 `live_suite_filter`。 |
|
||||
| Docker 发布路径 | **作业:** `Run Docker release-path validation`<br />**支撑 workflow:** `OpenClaw Live And E2E Checks (Reusable)`<br />**测试:** 针对共享包构件运行发布路径 Docker 分块。<br />**运行:** `run_release_soak=true`、`release_profile=full`,或聚焦的 `rerun_group=live-e2e`。<br />**重跑:** `rerun_group=live-e2e`。 |
|
||||
| 包验收 | **作业:** `Run package acceptance`<br />**支撑 workflow:** `Package Acceptance`<br />**测试:** 离线插件包夹具、插件更新、mock-OpenAI Telegram 包验收,以及针对同一 tarball 的已发布升级存活检查。阻塞发布检查使用默认的最新已发布基线;soak 检查会扩展到 `2026.4.23` 及之后的每个稳定 npm 发布版本,以及已报告问题的夹具。<br />**重跑:** `rerun_group=package`。 |
|
||||
| QA parity | **作业:** `Run QA Lab parity lane` 和 `Run QA Lab parity report`<br />**支撑 workflow:** 直接作业<br />**测试:** 候选和基线 agentic parity 包,然后生成 parity 报告。<br />**重跑:** `rerun_group=qa-parity` 或 `rerun_group=qa`。 |
|
||||
| QA live Matrix | **作业:** `Run QA Lab live Matrix lane`<br />**支撑 workflow:** 直接作业<br />**测试:** `qa-live-shared` 环境中的快速 live Matrix QA 配置档。<br />**重跑:** `rerun_group=qa-live` 或 `rerun_group=qa`。 |
|
||||
| QA live Telegram | **作业:** `Run QA Lab live Telegram lane`<br />**支撑 workflow:** 直接作业<br />**测试:** 使用 Convex CI 凭证租约的 live Telegram QA。<br />**重跑:** `rerun_group=qa-live` 或 `rerun_group=qa`。 |
|
||||
| 发布验证器 | **作业:** `Verify release checks`<br />**支撑 workflow:** 无<br />**测试:** 所选重跑组所需的发布检查作业。<br />**重跑:** 在聚焦的子作业通过后重跑。 |
|
||||
| 发布目标 | **任务:** `Resolve target ref`<br />**支撑工作流:** 无<br />**测试:** 选定的 ref、可选的预期 SHA、配置文件、重跑组和聚焦的 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 全局安装镜像提供商冒烟,以及快速内置插件安装/卸载 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 />**运行:** `run_release_soak=true`、`release_profile=full` 或聚焦的 `rerun_group=live-e2e`。<br />**重跑:** `rerun_group=live-e2e`,可选附带 `live_suite_filter`。 |
|
||||
| Docker 发布路径 | **任务:** `Run Docker release-path validation`<br />**支撑工作流:** `OpenClaw Live And E2E Checks (Reusable)`<br />**测试:** 针对共享包制品的发布路径 Docker 分块。<br />**运行:** `run_release_soak=true`、`release_profile=full` 或聚焦的 `rerun_group=live-e2e`。<br />**重跑:** `rerun_group=live-e2e`。 |
|
||||
| 包验收 | **任务:** `Run package acceptance`<br />**支撑工作流:** `Package Acceptance`<br />**测试:** 离线插件包夹具、插件更新、模拟 OpenAI Telegram 包验收,以及针对同一 tarball 的已发布升级存活检查。阻塞发布检查使用默认的最新已发布基线;浸泡检查扩展到 `2026.4.23` 或之后的每个稳定 npm 发布版本,并包含已报告问题的夹具。<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 配置文件。<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 />**测试:** 所选重跑组必需的发布检查任务。<br />**重跑:** 聚焦的子任务通过后重跑。 |
|
||||
|
||||
## Docker 发布路径分块
|
||||
|
||||
@ -71,80 +71,85 @@ Package Acceptance 通常会从解析后的 `ref` 构建候选 tarball,包括
|
||||
|
||||
| 分块 | 覆盖范围 |
|
||||
| --------------------------------------------------------------- | ----------------------------------------------------------------------- |
|
||||
| `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` | 为并行发布验证拆分的插件安装/运行时批次。 |
|
||||
| `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 通道失败时,在可复用 live/E2E workflow 上使用定向的 `docker_lanes=<lane[,lane]>`。发布构件会在可用时包含按通道的重跑命令,并带有包构件和镜像复用输入。
|
||||
当只有一个 Docker 通道失败时,在可复用 live/E2E 工作流上使用定向 `docker_lanes=<lane[,lane]>`。发布制品包含按通道提供的重跑命令,在可用时会带有包制品和镜像复用输入。
|
||||
|
||||
## 发布配置档
|
||||
## 发布配置文件
|
||||
|
||||
`release_profile` 主要控制发布检查内的 live/提供商覆盖范围。它不会移除常规完整 CI、插件预发布、安装冒烟测试、包验收或 QA Lab。对于 `stable`,详尽的仓库/live E2E 和 Docker 发布路径分块属于 soak 覆盖范围,并在 `run_release_soak=true` 时运行。`full` 会强制启用 soak 覆盖范围,并且在 `rerun_group=all` 时还会让总控运行使用父发布包构件的包 Telegram E2E,因此完整的预发布候选不会静默跳过该 Telegram 包通道。
|
||||
`release_profile` 主要控制发布检查中的 live/提供商覆盖广度。它不会移除常规完整 CI、插件预发布、安装冒烟、包验收或 QA Lab。对于 `stable`,穷尽式仓库/live E2E 和 Docker 发布路径分块是浸泡覆盖,并在 `run_release_soak=true` 时运行。`full` 会强制开启浸泡覆盖,并且在 `rerun_group=all` 时还会让总括运行针对父发布包制品执行包 Telegram E2E,因此完整的预发布候选不会静默跳过该 Telegram 包通道。
|
||||
|
||||
| 配置档 | 预期用途 | 包含的 live/提供商覆盖范围 |
|
||||
| 配置文件 | 预期用途 | 包含的 live/提供商覆盖范围 |
|
||||
| --------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `minimum` | 最快的发布关键冒烟测试。 | OpenAI/core live 路径、OpenAI 的 Docker live 模型、原生 Gateway 网关 core、原生 OpenAI Gateway 网关配置档、原生 OpenAI 插件,以及 Docker live Gateway 网关 OpenAI。 |
|
||||
| `stable` | 默认发布批准配置档。 | `minimum` 加上 Anthropic 冒烟测试、Google、MiniMax、backend、原生 live 测试 harness、Docker live CLI backend、Docker ACP bind、Docker Codex harness,以及一个 OpenCode Go 冒烟分片。 |
|
||||
| `full` | 广泛 advisory 扫描。 | `stable` 加上 advisory 提供商、插件 live 分片和媒体 live 分片。 |
|
||||
| `minimum` | 最快的发布关键冒烟。 | OpenAI/核心 live 路径、用于 OpenAI 的 Docker live 模型、原生 Gateway 网关核心、原生 OpenAI Gateway 网关配置文件、原生 OpenAI 插件,以及 Docker live Gateway 网关 OpenAI。 |
|
||||
| `stable` | 默认发布批准配置文件。 | `minimum` 加 Anthropic 冒烟、Google、MiniMax、后端、原生 live 测试 harness、Docker live CLI 后端、Docker ACP 绑定、Docker Codex harness,以及一个 OpenCode Go 冒烟分片。 |
|
||||
| `full` | 广泛的 advisory 扫描。 | `stable` 加 advisory 提供商、插件 live 分片和媒体 live 分片。 |
|
||||
|
||||
## 仅 full 添加项
|
||||
|
||||
这些套件会被 `stable` 跳过,并由 `full` 包含:
|
||||
|
||||
| 领域 | 仅 full 覆盖范围 |
|
||||
| 领域 | 仅 full 覆盖范围 |
|
||||
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Docker live 模型 | OpenCode Go、OpenRouter、xAI、Z.ai 和 Fireworks。 |
|
||||
| Docker live Gateway 网关 | advisory 提供商拆分为 DeepSeek/Fireworks、OpenCode Go/OpenRouter 和 xAI/Z.ai 分片。 |
|
||||
| 原生 Gateway 网关提供商配置档 | 完整 Anthropic Opus 和 Sonnet/Haiku 分片、Fireworks、DeepSeek、完整 OpenCode Go 模型分片、OpenRouter、xAI 和 Z.ai。 |
|
||||
| 原生插件 live 分片 | 插件 A-K、L-N、O-Z 其他、Moonshot 和 xAI。 |
|
||||
| 原生媒体 live 分片 | 音频、Google 音乐、MiniMax 音乐,以及视频组 A-D。 |
|
||||
| Docker live 模型 | OpenCode Go、OpenRouter、xAI、Z.ai 和 Fireworks。 |
|
||||
| Docker live Gateway 网关 | advisory 提供商拆分为 DeepSeek/Fireworks、OpenCode Go/OpenRouter 和 xAI/Z.ai 分片。 |
|
||||
| 原生 Gateway 网关提供商配置文件 | 完整 Anthropic Opus 和 Sonnet/Haiku 分片、Fireworks、DeepSeek、完整 OpenCode Go 模型分片、OpenRouter、xAI 和 Z.ai。 |
|
||||
| 原生插件 live 分片 | 插件 A-K、L-N、O-Z 其他、Moonshot 和 xAI。 |
|
||||
| 原生媒体 live 分片 | 音频、Google 音乐、MiniMax 音乐和视频组 A-D。 |
|
||||
|
||||
`stable` 包含 `native-live-src-gateway-profiles-anthropic-smoke` 和 `native-live-src-gateway-profiles-opencode-go-smoke`;`full` 则使用更广的 Anthropic 和 OpenCode Go 模型分片。聚焦重跑仍可使用聚合的 `native-live-src-gateway-profiles-anthropic` 或 `native-live-src-gateway-profiles-opencode-go` 句柄。
|
||||
`stable` 包含 `native-live-src-gateway-profiles-anthropic-smoke` 和 `native-live-src-gateway-profiles-opencode-go-smoke`;`full` 改用更广的 Anthropic 和 OpenCode Go 模型分片。聚焦重跑仍可使用聚合的 `native-live-src-gateway-profiles-anthropic` 或 `native-live-src-gateway-profiles-opencode-go` 句柄。
|
||||
|
||||
## 聚焦重跑
|
||||
|
||||
使用 `rerun_group` 来避免重复运行无关的发布 box:
|
||||
使用 `rerun_group` 避免重复运行无关的发布机器:
|
||||
|
||||
| Handle | 范围 |
|
||||
| 句柄 | 范围 |
|
||||
| ------------------- | --------------------------------------------------------------------- |
|
||||
| `all` | 所有完整发布验证阶段。 |
|
||||
| `ci` | 仅手动完整 CI 子项。 |
|
||||
| `plugin-prerelease` | 仅插件预发布子项。 |
|
||||
| `release-checks` | 所有 OpenClaw 发布检查阶段。 |
|
||||
| `install-smoke` | 从安装冒烟测试到发布检查。 |
|
||||
| `cross-os` | 跨 OS 发布检查。 |
|
||||
| `live-e2e` | 仓库/live E2E 和 Docker 发布路径验证。 |
|
||||
| `install-smoke` | 从安装冒烟到发布检查。 |
|
||||
| `cross-os` | 跨操作系统发布检查。 |
|
||||
| `live-e2e` | 仓库/实时 E2E 和 Docker 发布路径验证。 |
|
||||
| `package` | 包验收。 |
|
||||
| `qa` | QA 一致性加 QA 实时通道。 |
|
||||
| `qa-parity` | 仅 QA 一致性通道和报告。 |
|
||||
| `qa` | QA 对等性以及 QA 实时通道。 |
|
||||
| `qa-parity` | 仅 QA 对等性通道和报告。 |
|
||||
| `qa-live` | 仅 QA 实时 Matrix 和 Telegram。 |
|
||||
| `npm-telegram` | 已发布包 Telegram E2E;需要 `npm_telegram_package_spec`。 |
|
||||
| `npm-telegram` | 已发布包的 Telegram E2E;需要 `npm_telegram_package_spec`。 |
|
||||
|
||||
当一个实时套件失败时,将 `live_suite_filter` 与 `rerun_group=live-e2e` 一起使用。
|
||||
有效的筛选器 ID 在可复用的实时/E2E 工作流中定义,包括
|
||||
有效的过滤器 ID 定义在可复用的实时/E2E 工作流中,包括
|
||||
`docker-live-models`、`live-gateway-docker`、
|
||||
`live-gateway-anthropic-docker`、`live-gateway-google-docker`、
|
||||
`live-gateway-minimax-docker`、`live-gateway-advisory-docker`、
|
||||
`live-cli-backend-docker`、`live-acp-bind-docker` 和
|
||||
`live-cli-backend-docker`、`live-acp-bind-docker`,以及
|
||||
`live-codex-harness-docker`。
|
||||
|
||||
`live-gateway-advisory-docker` 句柄是其三个提供商分片的聚合重跑句柄,因此它仍会展开到所有 advisory Docker Gateway 网关作业。
|
||||
`live-gateway-advisory-docker` 句柄是其三个提供商分片的聚合重跑句柄,
|
||||
因此它仍会展开到所有 advisory Docker Gateway 网关作业。
|
||||
|
||||
当一个跨操作系统通道失败时,将 `cross_os_suite_filter` 与 `rerun_group=cross-os` 一起使用。该过滤器接受操作系统 ID、套件 ID,或操作系统/套件对,例如 `windows/packaged-upgrade`、`windows`,或 `packaged-fresh`。跨操作系统摘要包含打包升级通道的各阶段耗时,长时间运行的命令会打印 heartbeat 行,因此卡住的 Windows 更新会在作业超时前可见。
|
||||
|
||||
QA 发布检查通道是参考性的。仅 QA 失败会报告为警告,不会阻塞发布检查验证器;当你需要新的 QA 证据时,重跑 `rerun_group=qa`、`qa-parity` 或 `qa-live`。
|
||||
|
||||
## 要保留的证据
|
||||
|
||||
将 `Full Release Validation` 摘要保留为发布级索引。它会链接子运行 ID,并包含最慢作业表。对于失败,先检查子工作流,然后重跑上面匹配的最小句柄。
|
||||
保留 `Full Release Validation` 摘要作为发布级索引。它链接子运行 ID,并包含最慢作业表。对于失败项,先检查子工作流,然后重跑上面最小匹配的句柄。
|
||||
|
||||
有用的构件:
|
||||
|
||||
- Full Release Validation 父级和 `OpenClaw Release Checks` 中的 `release-package-under-test`
|
||||
- 来自完整发布验证父项和 `OpenClaw Release Checks` 的 `release-package-under-test`
|
||||
- `.artifacts/docker-tests/` 下的 Docker 发布路径构件
|
||||
- Package Acceptance 的 `package-under-test` 和 Docker 验收构件
|
||||
- 每个 OS 和套件的跨 OS 发布检查构件
|
||||
- QA 一致性、Matrix 和 Telegram 构件
|
||||
- 包验收 `package-under-test` 和 Docker 验收构件
|
||||
- 每个操作系统和套件的跨操作系统发布检查构件
|
||||
- QA 对等性、Matrix 和 Telegram 构件
|
||||
|
||||
## 工作流文件
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user