顶层阶段
顶层阶段¶
对于 rerun_group=all,Check for reusable validation evidence 作业首先运行。它查找具有相同发布配置、覆盖策略、有效 soak 设置和验证输入的最新的先前绿色完整验证。精确目标重跑使用 exact-target-full-validation-v1。如果某个下游运行的完整差异集仅包含所选的 CHANGELOG/YYYY.M.PATCH.md 及该条目、其对应的 CHANGELOG/records/YYYY.M.PATCH.md 和根 CHANGELOG.md,则使用 split-changelog-release-v1。允许条目/记录的新增或修改以及索引修改;拒绝重命名、删除、其他发布和文档源编辑。历史上仅根目录的凭证保留 changelog-only-release-v1。在任一 changelog 策略下,所有产品通道都会被跳过,验证器独立重新检查 GitHub 提交对比、不可变的父构件、子运行和调度日志。任何其他目标变更都需要全新的 Code SHA 验证。传入 reuse_evidence=false 以强制进行全新的完整运行。证据复用仅从 main 或规范的 SHA 固定 release-ci/* 引用运行,其工作流提交必须仍处于可信的 main 谱系上;其他工作流引用则全新运行所选通道。
复用搜索在加载子运行、作业日志和执行计划之前,先检查每个绑定的父清单是否符合条件。不兼容的配置、输入、目标以及非根运行会被提前拒绝。符合条件的候选者仍会在复用前经过完整的来源与尝试验证。验证器并发读取独立子运行(至多七个),保留每次尝试的作业数据以进行策略检查,并等待所有读取完成后才报告成功或失败。每个子运行内部的尝试与分页保持顺序执行。目标解析和复用检出只包含其工具链和发布元数据;两者都不需要完整的源代码树。
子调度还可以复用单个绿色子运行的密封凭证,即使其源父运行已失败、被取消或仍处于活动状态。它最多扫描 100 个最近的调度运行,探测最多 40 个目标凭证清单,并在两分钟内对每个角色的最多五个匹配凭证进行完整验证。其他目标和其他工具链的运行不计入五个验证的预算。目标、角色、非空调度输入/默认值以及候选描述符字节必须匹配;空字符串输入等同于不存在的输入,因为 GitHub 会在 github.event.inputs 中省略它们。子运行的 Tooling SHA 必须等于当前父运行的 Tooling SHA,并且仍然作为 main 的祖先。缺失或不匹配的工具链会安全失败(fail closed);不存在惰性路径例外。调度日志解释每次评估的拒绝原因,标识复用的子运行,并总结跳过的运行和全新调度。计划密封、收集器和最终验证会重复工具链与凭证检查。
完整验证通过 full-release-artifacts.yml 启动独立的 npm 和 Docker 生产运行。只读的 openclaw-npm-preflight.yml 同时启动源代码、SDK、依赖项和包准备。当单一的根/核心构建与打包完成后,包内容和生命周期检查随即开始。早期的 openclaw-npm-package-descriptor-<run-id>-<attempt> 构件还会在鉴定继续进行时解除候选准备的阻塞。最终鉴定汇集所有成功的精确源代码证明,并对相同的 tarball 字节进行密封。对于带有 npm-shrinkwrap.json 的传统候选版本,准备阶段会在发出包描述符之前,将打包后的根清单与 shrinkwrap 的根声明及已安装的包条目进行核对。tarball 鉴定会重复该检查。即使 npm 本可以成功退出、某个已准备的依赖在本地消费者中掩盖了遗漏,或者重新打包的 Docker 镜像可以工作,缺少必需运行时依赖仍会导致验证失败。修复候选版本的 shrinkwrap 并生成新的构件证据;鉴定从不修复已冻结的包字节。SDK 消费者安装会保留其较小的依赖上下文。最终清单会在 publicationArtifacts.npmPreflight 中记录其不可变的描述符。常规最终发布会针对当前 npm beta 和 latest 前驱版本分别包含 SDK 兼容性报告,并共享目标快照。发布在不重建的情况下选择其渠道的报告和确认。Beta 预发布和扩展稳定目标会保留其所需的渠道。
对于直接调度的仅预检的 OpenClaw NPM Release 运行,如果在源代码检查和包准备成功之后鉴定失败,请重新运行失败的鉴定作业。它会复用先前尝试中完全成功的生产作业和包字节,即使该尝试已失败或被取消。失败或未完成的生产作业仍然不符合复用条件。最终的 npm 发布仍然要求当前生产运行成功完成,并且每个保留的证明作业仍然是实际有效的成功作业。FRV 拥有的独立生产者支持相同的定向恢复;父运行采用已验证的凭证,而无需重建成功的包工作。
docker-release-prepare.yml 构建两种原生架构,保留 OCI 索引及其 SBOM/来源,并在批准前运行镜像冒烟检查。OCI 导出对新层使用 gzip 级别 1,并复用缓存的层而不强制重新压缩,从而保留冒烟和提升所使用的镜像格式。
默认镜像和浏览器镜像共享构建器的本地缓存。准备阶段不会传输远程构建缓存:全新的来源时间戳会使应用程序层失效,而且实测的传输成本高于复用运行时设置所节省的成本。全新的运行器会重新构建该设置,包括可变的 Debian 和 npm 更新;密封的 OCI 构件仍然是发布的可复用输入。托管的 VM 会在作业结束时回收其本地构建器,因此构建器卷的删除不会在构件上传后延迟密封。最终清单记录 publicationArtifacts.docker。准备阶段没有发布机密或注册表写入权限。批准后,Docker Release 会验证源/标签、生产者、构件哈希和镜像摘要,然后将这些字节提升到 GHCR 和 Docker Hub。发布锁涵盖注册表写入和选择器提升。没有准备镜像的历史证据在提升前会使用相同的准备工作流。
如果 Docker 准备成功但在同一工作流运行中发布失败, 重跑失败的发布作业。新的发布者尝试会验证原始 成功的准备作业和已封存工件,而不会重新构建。独立的 发布者运行仍要求原始生产者尝试处于活动状态或 成功;它不能通过此重试路径采用失败的生产者尝试。
新的面向包的验证将已准备的根/核心 bundle 传递给一个
独立候选生产者,该生产者调用 Full Release Candidate。其注册表携带精确的
未发布核心依赖和所选插件。安装器在解析根包之前启动该注册表,包括 npm、pnpm、Bun 和
跨操作系统通道。已发布的基线版本仍可通过上游
注册表获取。插件预发布和 OpenClaw 发布检查各自立即分派一个
独立阶段,而它们的候选阶段等待获取。
两个候选阶段在使用前验证相同的包 SHA、工件 ID、服务摘要、
生产者运行尝试和 Docker 归档摘要。与包无关的
裸 Docker 层使用基于内容寻址的 GHCR 缓存;特定于候选者的镜像
仍为不可变的 GitHub 工件。具有显式已发布
包规范的聚焦运行则继续使用现有包路径。
准备阶段还会输出一个规范请求摘要和一个七天的
full-release-candidate-v2-<request-sha256> 证据工件。其有界
清单绑定精确的目标和 Tooling SHA、发布和浸泡策略、
生效的幸存者基线和场景、准备计划摘要、排序后的
插件包集合、生产者和发布者工作流/作业/运行标识,以及
包、注册表和镜像工件标识和过期时间戳。
执行计划封存该证据。在准备候选者之前,伞式工作流只有在重新验证精确的工作流运行、
发布者作业标识、归档摘要、清单、生产者尝试和作业,以及
每个包、注册表和镜像工件的实时元数据之后,才可复用同一规范请求和精确已准备 npm tarball 摘要下剩余寿命至少十四小时的新工件。
已证明的缺失会创建新的候选者。有界查找不确定性和
选择后的失败是阻塞性的,因此运行不会静默切换
候选者。不同的已准备 tarball 即使源 SHA 未变也需要新的候选者。完整验证只有在包
资格验证和 Docker 准备也成功之后才成功;仅通过产品 Release
Decision 并不授权发布。
每种发布类型都在两种原生架构上,于强制 Docker 镜像准备中验证 runtime-assets Docker 目标。
| 阶段 | 详情 |
|---|---|
| 目标解析 | 作业: Resolve target ref子工作流: 无 证明: 解析发布分支、标签或完整提交 SHA,并记录所选输入。 重跑: 如果此步骤失败,重跑伞式工作流。 |
| 发布准备 | 作业: Prepare release npm artifacts、Qualify release npm artifacts 和 Prepare release Docker artifacts子工作流: 独立的 npm 和 Docker Full Release Artifacts 运行证明: 在发布前验证精确的根/核心 npm tarball 和两种原生 Docker 架构。父级重试可恢复原始生产者记录和回执。 重跑: 在原始生产者运行上重试失败的 npm 资格验证作业,保留成功的准备,并让父级收集已验证的回执。 |
| 共享候选者 | 作业: Acquire full release candidate子工作流: Full Release Artifacts 调用 Full Release Candidate,后者复用受信任候选者,或在已证明缺失时准备一个候选者证明: 验证精确的 npm tarball、注册表、功能镜像以及生产者/发布者绑定。准备在原始 npm 字节就绪后、资格验证完成前开始。 重跑: 使用同一候选者重跑受影响的包、插件预发布、跨操作系统或实时/E2E 组。 |
| Vitest 和常规 CI | 作业: Run normal full CI子工作流: CI证明: 针对目标引用验证所选 CI 图。 npm-beta-v1 和 npm-stable-v1 保留 Linux/macOS/Windows Node、插件和通道契约、Node 兼容性、检查、构建工件冒烟、文档、Python 技能以及 Control UI;它们推迟 macOS Swift/OpenClawKit、iOS、Android 和原生 i18n。其他覆盖策略使用完整 CI。重跑: rerun_group=ci。 |
| 阶段 | 详情 |
|---|---|
| 插件预发布 | 作业: Run plugin prerelease independent validation 和 Run plugin prerelease candidate validation子工作流: Plugin Prerelease证明: 独立的静态和代理式覆盖可以在获取之前开始,而候选依赖的 Docker 泳道会消费密封的软件包和插件注册表身份。 重跑: rerun_group=plugin-prerelease。 |
| 发布检查 | 作业: Run release checks independent validation 和 Run release checks candidate validation子工作流: OpenClaw Release Checks证明: 独立的安装、QA 和实时覆盖可以在获取之前开始,而软件包、跨操作系统和候选依赖的 Docker 泳道会消费密封候选。稳定配置和完整配置保留详尽的实时/E2E 和发布路径覆盖。 重跑: 对失败面进行分类,并选择一个具体的发布检查组。 |
| 软件包 Telegram | 作业: Run package Telegram E2E子工作流: NPM Telegram Beta E2E证明: 当设置 release_package_spec 或 npm_telegram_package_spec 时,执行聚焦的已发布软件包 Telegram E2E。npm-beta-v1 会延迟此子任务;显式 npm-telegram 和 soak 会保留它。Package Acceptance 在被选中时负责未发布候选的 Telegram 证明。重跑: 使用 release_package_spec 或 npm_telegram_package_spec 的 rerun_group=npm-telegram。 |
| 产品性能 | 作业: Run product performance evidence子工作流: OpenClaw Performance证明: 针对目标 SHA 的发布配置性能( profile=release、repeat=3、publish_reports=false)。除 npm-beta-v1 外,all 会选中;显式 performance 也会选中。选中的回归在所有配置中都会阻塞。选中的子任务仍会完成,并证明其报告发布者已被跳过。重跑: rerun_group=performance。 |
| 发布决策 | 作业: Release Decision子工作流: 无 证明: 轮询精确记录的子运行 ID 和尝试,执行发布策略,并发布与尝试绑定的决策工件。决定性失败会变为 blocked_diagnostics_running,同时无关的子诊断继续。重跑: 仅修复或重跑阻塞面。 |
| 诊断排空 | 作业: Diagnostic Drain子工作流: 无 证明: 在 fail_fast=false 时,跟踪每个选中的精确子任务直至终止,且不取消,并写入计时、失败作业、运行尝试和 Tooling-SHA 证据。收集器取消则会立即写入包含活动子任务身份的 cancelled_with_children 交接。重跑: 仅对 orchestration_error 恢复收集;产品失败不会使排空无效。 |
| 执行计划 | 作业: Seal release execution plan子工作流: 无 证明: 在稳定的运行绑定工件中持久化原始父尝试、精确的子任务身份和标题、所需覆盖、门控、复用身份,以及带有精确生产者和发布者绑定的新候选请求。第二次尝试的收集器恢复会恢复此工件,而不是重新分发。 重跑: 仅恢复现有计划;缺失计划属于编排错误。 |
| 伞形验证器 | 作业: Verify full validation子工作流: 无 证明: 下载不可变的执行计划,以及精确的与尝试绑定的 Release Decision 和 Diagnostic Drain 工件,验证它们的公共摘要和父元组,并且仅接受严格的绿色决策加上终止排空。 重跑: 恢复现有收集器,或仅重跑失败的产品面;验证器从不重新分类或重新分发子任务。 |
七个子分发作业仅负责分发和精确身份捕获。它们输出子运行 ID、运行尝试和 URL,然后结束。Release Decision 负责阻塞答案;Diagnostic Drain 负责完整的终止证据。不可变的执行计划负责跨收集器尝试的子任务身份。决策状态是 qualifying、blocked_diagnostics_running、passed、blocked_complete、orchestration_error 或 cancelled_with_children 之一。持续的 GitHub API 失败属于编排错误。如果子任务的工作流路径、显示标题、ref、Tooling SHA 或运行 ID 发生变化,则构成一种明确的来源不匹配。单调更新的尝试仅通过 继续失败的验证 中的复合尝试规则被接受。
blocked_diagnostics_running 可用于立即诊断,但在 Diagnostic Drain 达到终态之前不可用于重试。orchestration_error 授权针对完全相同的子身份执行 collector 恢复,绝不测试重新调度。blocked_complete 表示诊断已完成;它并不声称 drain 仍在运行。
当被选中时,umbrella 会以 artifact-only 模式调度产品性能。
OpenClaw Performance 仅允许在计划运行或显式设置 publish_reports=true 的手动调度中发布报告。artifact-only guard 必须成功完成,以证明 publisher job 保持跳过。被选中的 performance 子任务的证据记录
controls.performanceReportPublication=artifact-only;每当该子任务被选中时,verifier 和 reuse selector 都要求匹配的归一化 performance-child 证明。npm-beta-v1 将 performance 记录为 deferred,而不是调度一个其结果仍需要终态证据的子任务。
verifier 会将规范 manifest 上传为
full-release-validation-<run-id>-<run-attempt>。Evidence tooling 在下载该确切 artifact ID 之前,会验证其 artifact ID、digest、producer run 和 attempt。它会限制下载的 ZIP 大小,将其字节与 REST
sha256: digest 进行校验,并流式读取唯一允许的有界 manifest entry,而不解压归档。为旧版 publish 消费者保留 stable-name 别名。verifier 始终优先使用带 attempt 限定的 artifact,并且仅对 attempt-1 的 manifest v2 producer 接受 stable name。对于后续 attempt 以及 manifest v3,它会拒绝该 stable name,因此一旦 producer 发出 manifest v3,该别名就不再适用。
并发以 Validation SHA、Tooling SHA、rerun group、release profile 和 effective soak coverage 作为键,并且不会取消较早的运行。Release Checks 子任务也会分离 profiles 和 effective soak,从而在两个工作流层级中保持独立的准入。Stable/full 将 soak 归一化为 enabled,因此显式启用它不会准入重复请求。父级取消或超时会保留已采用的 identity-checked 子任务继续运行,并在 state collector 能够完成其取消交接时记录 cancelled_with_children。当某个确切子任务不再有用时,显式取消它。当 SHA-pinned helper 已经拥有父级时,不要运行第二个前台 watcher;仅在 helper 已返回或父级被单独调度后,才使用
release-ci-summary --watch。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw