关于 openclaw-release-maintainer
面向 OpenClaw 维护者的发布技能,涵盖从准备到验证的 beta 和 stable 发布流程。重点包括明确授权、兼容性检查、变更日志准确性,以及 npm 与 macOS 发布步骤协调。
主要功能
- 01发布分支与预检指引
- 02版本号和标签一致性检查
- 03兼容性弃用审查
- 04变更日志与发布说明准备
- 05Beta 和稳定版发布验证
适用场景
- 01准备 OpenClaw beta 发布
- 02稳定版发布前验证改动
- 03发布前检查弃用项
- 04处理发布验证失败
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ openclaw/ openclaw --skill openclaw-release-maintainer安装后在 Claude Code 中输入/openclaw-release-maintainer确认已加载。
详细介绍
OpenClaw 发布维护者
在发布和发布时工作流中使用此技能。普通开发变更和 GHSA 专项安全公告工作不属于此技能的范围。
遵守发布防护措施
- 未经操作员明确批准,请勿更改版本号。
- 执行任何 npm 发布或发行步骤前,请先征求许可。
- 此技能应足以端到端完成常规发行流程。
- 凭据、恢复步骤以及 mac 签名和公证细节,请参考维护者内部发行文档;公开政策请参考
docs/reference/RELEASING.md。 - 核心
openclaw发布需手动触发workflow_dispatch;创建或推送标签本身不会触发发布。 - 常规发行工作应在从
main切出的分支上进行,不要直接在main上操作。分支名使用release/YYYY.M.D。 - 如果操作员要求发行但未说明是稳定版/完整发行,默认只发布 beta 版。只有操作员明确要求完整发行或自动化 beta 和稳定版发行流程时,才从 beta 继续发布稳定版。
- 创建发行分支前,拉取最新的
main并确认当前mainCI 全部通过。然后从该提交创建分支,以便在运行发行验证的同时,常规开发工作可以继续在main上进行。 - 创建发行分支前,按逻辑分组提交所有未提交的文件,推送、拉取/变基,然后在
main上运行/changelog,并在创建发行分支前立即提交、推送并拉取这次更新后的变更日志。 - 发行规划期间,创建分支前和最终发布前都要检查
src/plugins/compat/registry.ts和src/commands/doctor/shared/deprecation-compat.ts。对于每条已弃用或待移除的兼容性记录,如果其removeAfter日期不晚于发行日期,则应在安全的前提下移除兼容路径并验证相关测试;否则,记录阻止移除的原因,并在随发行版本提供已过期兼容路径前取得维护者的明确批准。 - 移除已弃用的运行时或配置兼容性时,应保留受支持的升级路径仍然需要的任何 doctor 迁移、修复或提示。维护者确认不再需要修复前,应继续在
src/commands/doctor/shared/deprecation-compat.ts中跟踪 doctor 端的兼容性。 - 发行规划期间重新验证兼容性替换文本。随着插件归属、外部化和配置范围的变化,建议的替换项可能会改变,因此不要将过时的替换说明直接照搬到发行说明中。
- 匹配的 npm 软件包发布后,不要删除或重写 beta 标签。如果已推送的 beta 标签在 npm 发布前未通过预检,则删除该标签并在修正后的提交上重新创建标签和预发行版本,以确保 npm 预发行版本号连续。如果已发布的 beta 需要修复,则在发行分支上提交修复,并递增到下一个
-beta.N。 - 对于 beta 发行流程,先运行快速本地预检,将 beta 发布到 npm
beta,然后运行耗时的已发布软件包测试集,重点检查安装/更新/Docker/Parallels/NPM Telegram。如果任何一项失败,则在发行分支上修复,提交/推送/拉取,递增 beta 编号并重复流程。晋升到稳定版/latest 前,至少完整运行一次耗时测试集;之后的 beta 尝试中,除非修复涉及广泛的发行、安装/更新、插件、Docker、Parallels 或实时 QA 行为,否则只重新运行证据发生变化的测试通道。每次发布 beta 后,都要扫描当前main,查找发行分支切出后合入的关键修复,并仅回移植重要且风险低的修复。操作员最多可授权自主尝试 4 次 beta;4 次 beta 尝试均失败后,应停止并报告。 - 准备版本号/标签前使用
/changelog,以便按用户影响去重并排序变更日志顶部的章节。 - 不要创建 beta 专用的
CHANGELOG.md标题。Beta 发行使用稳定版基础版本章节,例如,v2026.4.20-beta.1使用## 2026.4.20发行说明。 - 任何 beta 或稳定版发行上线后,都应尽最大努力使用
.profile中 Peter 的 bot 令牌发布 Discord 公告;即使公告失败,也不要阻止或回滚发行。 - 如果被要求在 X 上发布公告,请使用
~/Projects/bird/bird,并遵循下文的发行推文风格。
保持发布渠道命名一致
stable:仅发布正式标签,默认发布到 npmbeta;维护人员也可明确指定 npmlatest,或之后再晋级beta:使用vYYYY.M.D-beta.N这类预发布标签,npm dist-tag 为beta- 优先使用
-beta.N;不要创建新的-1或-2beta 后缀 dev:main上持续变动的最新代码- 使用 beta Git 标签时,发布到 npm 的版本也要带匹配的 beta 版本后缀,避免占用或阻止使用不带后缀的版本
统一处理版本和发布文件
- 版本所在位置包括:
package.jsonapps/android/app/build.gradle.ktsapps/ios/Sources/Info.plistapps/ios/Tests/Info.plistapps/macos/Sources/OpenClaw/Resources/Info.plistdocs/install/updating.md- Peekaboo Xcode 项目和 plist 版本字段
- 创建发布标签前,确保上述所有位置的版本与标签中编码的版本一致。
- 对于
vYYYY.M.D-N这类回退修正标签,仓库各版本位置仍保持为YYYY.M.D。 - “在所有位置更新版本”指更新上述所有版本位置,但不包括
appcast.xml。 - 发布签名和公证凭据存放在仓库之外的维护人员私有文档中。
- 每个 OpenClaw 正式版都会同时发布 npm 包和 macOS 应用。 Beta 版通常先发布 npm/软件包工件,并跳过 mac 应用的 构建、签名和公证,除非维护人员要求进行 mac beta 验证。
- npm 预检通过后,不要让较慢的 macOS 签名/公证流程阻塞 npm 发布。让 mac 验证/发布并行运行,使用通过预检的结果发布 npm,随后开始验证已发布的 npm 安装/更新、Docker 和 Parallels,同时继续处理 mac 工件。
- Beta 版发布后,可在适当情况下并行安排远程/人工发布验证,但避免在同一主机上集中运行本地 Docker、Parallels 和 QA-Lab 工作,以免引入系统负载噪声。失败或修复后可选择性地重新运行,但在晋级到 stable/latest 前,必须保留 Docker、Parallels 和 QA-Lab 各自至少通过一次的验证证据。
- mac 软件包可以从与已标记提交略有不同的发布分支变体构建,前提是差异仅涉及 mac 软件包、签名、工作流或仅用于验证的发布机制。如果 stable npm 包或 GitHub 标签已发布后,mac 软件包仍需要仅存在于发布分支上的修复,不要仅为更改工作流来源而创建
vYYYY.M.D-N修正标签。对原始tag=vYYYY.M.D分派私有 mac 工作流,并设置source_ref=release/YYYY.M.D和public_release_branch=release/YYYY.M.D;来源验证必须证明源 SHA 是标签提交的后代,并且验证/预检使用同一来源。vYYYY.M.D-N修正标签仅用于必须发布新 npm 包/发布标识的紧急热修复,不用于常规的仅 mac 软件包恢复。 - 生产环境的 Sparkle 更新源位于
https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml,规范的已发布文件是openclaw仓库main分支上的appcast.xml。 - 该共享的生产环境 Sparkle 更新源仅用于 stable 版。Beta mac 版可以向 GitHub 预发布版本上传工件,但不得替换共享的
appcast.xml,除非存在单独的 beta 更新源。 - 对于
vYYYY.M.D-N这类回退修正标签,仓库版本仍保持为YYYY.M.D,但 mac 发布必须使用严格高于原始发布版本的数字APP_BUILD/ Sparkle 构建号,以便现有安装能识别其为更新版本。
构建基于变更日志的发布说明
- 在创建发布分支或标签之前,根据提交历史重写目标
CHANGELOG.md章节,而不只是依据现有说明:扫描自上一个可达发布标签 以来的提交,补充遗漏的用户可见变更,合并重复条目,并按对用户 的重要性从高到低排列每个章节中的条目。 CHANGELOG.md条目应面向用户,而不是内部发布流程说明。- GitHub 发布和预发布正文必须使用完整匹配的
CHANGELOG.md版本章节,而不是亮点或摘录。创建或编辑发布时, 从## YYYY.M.D开始提取到下一个二级标题之前的行,并使用该 完整区块作为发布说明。 - 准备发布说明时,扫描
src/plugins/compat/registry.ts和src/commands/doctor/shared/deprecation-compat.ts,查找发布日期后 7 天内 具有warningStarts或removeAfter的兼容性记录。若存在此类记录, 请在发布说明中添加Upcoming deprecations注记,其中包括兼容性代码、 目标日期、替代方案,以及指向该记录docsPath的链接;如果没有更具体的 弃用页面,则指向/plugins/compatibility。 - 创建 mac 版本并使用 beta GitHub 预发布时:
- 从发布提交创建标签
vYYYY.M.D-beta.N - 创建标题为
openclaw YYYY.M.D-beta.N的预发布 - 使用稳定基础版
CHANGELOG.md版本章节 (## YYYY.M.D)中的发布说明,而不是 beta 专用标题 - 至少附上 zip 和 dSYM zip;如果有 dmg,也一并附上
- 从发布提交创建标签
- 按影响程度排列
CHANGELOG.md顶部的版本条目:### Changes排在最前### Fixes去重后,将面向用户的修复排在最前
编写发布推文
使用 OpenClaw 账号现有的发布帖风格:
- 格式:
OpenClaw YYYY.M.D 🦞或🦞 OpenClaw YYYY.M.D is live,空一行, 然后是 3-4 条以 emoji 开头的要点,空一行,一句简短点睛之笔,然后是发布 链接。 - 对于测试版:写明
OpenClaw YYYY.M.D-beta.N 🦞或OpenClaw YYYY.M.D beta N is live;明确标注为测试版,避免暗示已升级为稳定版。 - 先讲用户可见的功能,再讲重要集成,最后讲可靠性、安全性和安装修复。将“大量 修复”压缩为一条清晰易读的要点。
- 起草前通读完整的变更日志章节。除非本次发布明确聚焦这些内容,否则不要从覆盖率、 CI、验证或内部发布机制写起。Peter 更喜欢具体的用户收益:功能、集成、 工作流改进和实用的可靠性修复。
- 语气:高信噪比、略带俏皮、自信,不要企业腔。一个笑话就 够了。不要贬损他人、侮辱用户,或作出未经验证的承诺。
- Peter 喜欢恰如其分的冷幽默和紧凑标语。不错的示例:
Big release, tiny release notes... kidding.笑话要简短,让功能要点撑起整条推文;不要把 点睛之笔变成第二个段落,也不要强行抖包袱。 - 长度:发布推文始终是少于 280 个字符的标准推文,并且 要为一个 URL 留出空间。精简到 3-4 个要点,并在发布前统计最终文本的字符数。
- 链接/媒体:在第一条发布推文末尾附上 GitHub 发布页或变更日志链接。
- 推文串后续:如果采用推文串形式,第一条发布推文应保持为紧凑的发布帖, 然后每条回复只聚焦一项功能的说明。当推文串上下文已清楚表明版本信息时, 后续回复不要重复“在 VERSION 中新增”或版本号。
- Peter 偏好的推文串工作流:先共同敲定通用的发布推文,
然后逐条编写后续推文。当他说
next时,只提供或复制下一条后续推文; 除非他要求,否则不要再次输出完整推文串。 - 每条后续推文都应包含该特定功能对应的文档 URL。
优先使用裸 URL,而不是
Docs: <url>,除非为清晰起见需要标签。 后续推文要简洁:通常以 160-220 个原始字符最为合适; 少于 280 个字符是硬性上限。如果 URL 导致推文超限,应先精简正文, 再删除 URL。 - 热修复/更正:要直接且负责任。说明哪里出了问题、修复了什么,以及新的 版本号。事故类帖子不要开玩笑。
可借鉴的示例:
OpenClaw 2026.4.20-beta.1 🦞
🐳 Docker install/update smoke
🖥️ Parallels upgrade checks
🔧 Package verification tightened
Beta first. Stable after the gauntlet.
<release link>
OpenClaw 2026.4.20 🦞
🚀 Faster install + update
🐳 Docker + Parallels verified
🍎 macOS signed + notarized
🔧 Channel/plugin fixes
Good boring release. Best kind.
<release link>
Packaging issue in 2026.4.20-beta.1.
2026.4.20-beta.2 fixes install/update verification. No tag rewrites; beta moves
forward.
Upgrade with the beta channel.
<release link>
运行发布时验证
在打标签或发布前,运行:
pnpm check:architecture
pnpm build
pnpm ui:build
pnpm qa:otel:smoke
pnpm release:check
pnpm test:install:smoke
- 当发布验证需要遥测覆盖时,使用
pnpm qa:otel:smoke。 它会启动本地 OTLP/HTTP 跟踪接收器,运行 QA-lab 的otel-trace-smoke,并检查跨度名称以及内容和标识符的脱敏情况, 无需外部 Opik 或 Langfuse 凭据。
对于非 root 冒烟测试路径:
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke
npm 发布后,运行:
node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
- 这会验证在全新临时前缀中从已发布注册表安装的路径。
- 对于形如
YYYY.M.D-N的稳定版更正发布,它还会验证 从YYYY.M.D到YYYY.M.D-N的升级路径,确保更正发布不会 悄然让现有全局安装继续使用旧的基础稳定载荷。 - 将安装冒烟测试也视为包体积预算关卡。
pnpm test:install:smoke现在,当 npm 报告unpackedSize过大时,会将候选更新 tarball 判定为失败,因此发布阶段的 e2e 不会漏检可能造成低内存机器安装或 启动失败的包体积膨胀。 - 在安装冒烟测试中保留直接使用 npm 进行全局安装的覆盖测试。它会执行普通的
npm install -g <candidate>全新安装,以及由 npm 驱动的更新安装, 因为即使文档推荐 pnpm,许多用户仍使用 npm 安装。 - 当视频生成属于发布范围时,使用
pnpm test:live:media video进行有时限的 视频提供商冒烟测试。默认视频冒烟测试会跳过fal,每个提供商运行一次 文本转视频尝试,提示词要求生成一秒的龙虾视频,并通过OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS限制每个提供商操作的时长 (默认180000)。 - 仅在需要进行 FAL 专项验证时运行
pnpm test:live:media video --video-providers fal。其队列延迟可能占据 大部分发布时间。 - 仅在有意验证速度较慢的图像转视频和视频转视频转换通道时,才设置
OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1。
检查所有相关的发布构建
- 在创建标签之前,务必验证 OpenClaw npm 发布流程。
- 在进行实时发布验证之前,先加载 Peter 的配置文件,以便使用 OpenAI 和 Anthropic 凭据,同时不打印机密:
set -a; source "$HOME/.profile"; set +a。 - 本次发布的 Parallels 验证以及任何本地实时模型 QA 都必须同时使用
OPENAI_API_KEY和ANTHROPIC_API_KEY。如果加载.profile后缺少任一密钥,请在启动这些耗时的本地流程之前停止,并报告缺少的密钥。 - 需要凭据的实时渠道 QA 必须通过 GitHub Actions 工作流
QA-Lab - All Lanes(.github/workflows/qa-live-telegram-convex.yml)运行,不能用本地测试替代。从 Actions 中针对发布标签触发该工作流,并等待其通过后,再进行 npm 预检/发布就绪检查。只有满足工作流密钥信任门槛的 SHA 才可使用:它必须是 main 的祖先,或开放 PR 的 head。该工作流会运行 QA Lab 模拟对等检查,以及实时 Matrix 和实时 Telegram 流程,并使用qa-live-shared环境;Telegram 使用 Convex CI 凭据租约。 - 默认发布检查:
pnpm checkpnpm check:test-typespnpm check:architecturepnpm buildpnpm ui:buildpnpm release:checkOPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke
- npm 预检前完整 beta 测试清单:
- 上述默认发布检查
- 所有 Docker 测试:
pnpm test:docker:all;如果操作人员要求“所有 Docker 测试”,还要运行聚合测试未涵盖的独立 Docker 实时流程:pnpm test:docker:live-acp-bind、pnpm test:docker:live-cli-backend和pnpm test:docker:live-codex-harness - 所有 Parallels 安装/更新测试:
pnpm test:parallels:npm-update -- --json,以及openclaw-parallels-smoke中任何必要的单独重跑流程 - 所有 QA 发布验证:在 GitHub Actions 中针对发布标签触发
QA-Lab - All Lanes,并要求其成功。这是实时且需要凭据的 Matrix/Telegram 渠道覆盖发布门槛。只有满足工作流信任门槛的 SHA 才可使用。仅当操作人员要求增加模型覆盖,或需要在本地调试故障时,才运行本地 OpenAI/Anthropic 测试套件或基于仓库的角色评估。
- beta 发布后的验证清单:
node --import tsx scripts/openclaw-npm-postpublish-verify.ts <beta-version>- 针对已发布 beta 渠道进行安装/更新冒烟测试
- 覆盖已发布 beta 包的 Docker 安装/更新测试
- 已发布 npm 包的 Telegram 验证:从
main触发 Actions >NPM Telegram Beta E2E,设置package_spec=openclaw@<beta-version>和provider_mode=mock-openai,并要求其成功。此工作流由维护者手动触发,且有意不设置npm-release审批门槛;qa-live-shared仅提供共享 QA 机密。这是针对已安装包引导、Telegram 设置以及基于已发布 npm 包进行真实 Telegram E2E 测试的默认触发方式。 只有作为备用或调试方案时,才使用本地pnpm test:docker:npm-telegram-live流程,并设置匹配的OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC和 Convex CI 环境变量。 - 使用 OpenAI 和 Anthropic 提供方密钥,对已发布 beta 版进行 Parallels 安装/更新覆盖测试
- Parallels 安装/更新验证必须保持插件安装启用,除非操作人员明确将测试限定为仅隔离检查测试框架;禁用内置插件安装的流程不能作为有效的插件/依赖发布证据。
- 完成 npm 预检前完整测试清单后,仅针对修复涉及的区域重新运行目标 QA,除非操作人员要求再次运行完整 QA 清单。如果修复涉及实时渠道 QA、凭据配置、Matrix、Telegram 或 QA 测试框架,则重新运行 Actions >
QA-Lab - All Lanes。
- 检查发布涉及的所有构建相关表面,不要只检查 npm 包。
- 对于 beta 式完整 E2E 测试套件,必须为顶层耗时流程设置硬性时限,不能让它们无限运行。使用主机上的
timeout --foreground/gtimeout --foreground设置时限,例如:- 对
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke设置45m - 对
pnpm test:docker:all设置90m - 对每个独立的 Docker 实时流程设置
60m - 对明确要求运行的本地完整 QA 实时 OpenAI + Anthropic 测试清单设置
180m;默认发布渠道 QA 门槛是 Actions >QA-Lab - All Lanes - Parallels 时限参见
openclaw-parallels-smoke技能 如果流程达到时限,请停止并检查/修复受影响的流程后再继续;不要继续等待同一进程。
- 对
- 实际 npm 安装/更新阶段的时限为 5 分钟。如果发布 E2E 测试中的
npm install -g、安装程序包安装或openclaw update耗时超过 300s,请不要再将运行视为正常进展,应调试安装程序/更新程序或测试框架。 - 在 VM 流程之前,先串行完成主机上的构建/打包变更。启动 Parallels
npm pack流程之前,应完成pnpm build、pnpm ui:build、pnpm release:check、安装冒烟测试以及任何 Docker/打包准备流程;否则dist可能会在 VM 打包准备期间消失,导致虚假失败。 - 发布预检必须包含 mac 发布就绪检查:每次发布都要在
openclaw/openclaw中运行公开验证工作流,并在openclaw/releases-private中运行真实 mac 预检。 - 将
main上的appcast.xml更新视为 mac 发布就绪流程的一部分,而非可选的后续步骤。 - 工作流仍以标签为基础。Agent 负责确保所有预检运行成功完成后,才启动任何发布运行。
- 预检后如有任何修复,都必须创建新的提交。删除并从修复后的提交重新创建标签和对应的 GitHub 发布,然后从头重新运行预检,再进行发布。 例外:如果对应的 npm 包已经发布,绝不能删除或重新创建 beta 标签;应递增到下一个 beta 版本号。如果只推送了标签/预发布版本,尚未发布 npm 包,则应在修复后的提交上重新创建同一个 beta 标签。
- 对于稳定版 mac 发布,请在上传公开发布资源之前生成已签名的
appcast.xml,避免更新器信息流落后于已发布的二进制文件。 - 不同标签的稳定版 appcast 生成流程必须串行运行,避免两个发布流程使用同一份过时的种子生成替换版
appcast.xml文件。 - 对于稳定版发布,主要依赖最新 beta 版本提供的全面发布流程可信度。将匹配的非 beta 构建推广到 npm
latest时,优先进行耗时受限的轻量验证:已发布 npm 发布后验证、Docker 安装/更新冒烟测试、仅限 macOS 的 Parallels 安装/更新冒烟测试,以及必要的 QA 信号。除非 beta 测试证据已过时、稳定版构建与 beta 版有实质差异,或操作人员明确要求完整重新测试,否则不要重新运行完整的 Docker/Parallels 测试矩阵。 - 如果任何必需的构建、打包步骤或发布工作流失败,不要声称发布已就绪。
使用正确的身份验证流程
- OpenClaw 发布使用 GitHub 可信发布。
- 将稳定版从
beta提升到latest的 npm 操作使用私有的openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml工作流,因为管理npm dist-tag需要NPM_TOKEN,而公开的 npm 发布工作流仍仅使用 OIDC。 - 优先修复私有工作流的令牌路径,而不是使用任何本地 1Password
备用方案。理想配置是将细粒度 npm 令牌存储为私有仓库的
NPM_TOKEN密钥, 仅授予openclaw包的读写权限,并为自动化绕过 2FA。 - 如果私有 dist-tag 工作流因缺少或过期的
NPM_TOKEN而无法提升版本,请使用本地 tmux + 1Password 备用方案:- 启动或复用一个 tmux 会话,以便查看并恢复交互式
npm login和 OTP 提示。 - 硬性规则:发布期间,绝不能在主 Agent shell 中直接运行
op。任何 1Password CLI 操作都必须在该 tmux 会话中执行,以确保提示和警报受到隔离且可见。 - 使用 1Password 条目
op://Private/Npmjs获取 npm 凭据和 OTP。不要将密码、令牌或 OTP 打印到记录中;请通过 tmux 缓冲区、限定在 tmux 命令作用域内的环境变量,或设置了log_user 0的expect传递。 - 在该 tmux 会话中重新验证 npm 身份,运行
npm login --auth-type=legacy,然后确认npm whoami返回steipete。 - 使用新生成的 OTP 提升版本:
npm dist-tag add [email protected] latest --otp "$OTP"。 - 使用绕过缓存的注册表读取进行验证,例如:
npm view openclaw dist-tags --json --prefer-online --cache /tmp/openclaw-npm-cache-verify-$$和npm view openclaw@latest version dist.tarball --json --prefer-online。
- 启动或复用一个 tmux 会话,以便查看并恢复交互式
- 直接发布稳定版时,也可以使用该私有 dist-tag 工作流,将
beta指向已发布的latest版本,以便操作人员立即对齐两个标签。 - 必须手动通过
workflow_dispatch启动发布运行。 - npm 工作流和私有 macOS 发布工作流接受
preflight_only=true,可运行验证、构建和打包步骤,而不上传公开发布资产。 - 实际发布 npm 前,必须先有一次成功的 npm 预检运行 ID,以便发布任务提升已准备好的压缩包,而不是重新构建。
- 实际进行私有 macOS 发布前,必须先有一次成功的私有 macOS 预检运行 ID,以便发布任务提升已准备好的制品,而不是重新构建或再次进行公证。
- 私有 macOS 工作流还接受
smoke_test_only=true,用于可在分支上安全运行的工作流冒烟测试;测试使用临时签名、跳过公证、跳过共享 appcast 生成,且不能证明已具备发布条件。 - npm 工作流中的
preflight_only=true也适用于发布后验证现有标签;即使 npm 版本已发布,也应继续运行构建检查。 - 测试合并前的工作流更改时,可以从普通分支派发仅用于验证的 npm 预检。发布检查和实际发布只能使用
main或release/YYYY.M.D。 openclaw/openclaw中的.github/workflows/macos-release.yml现为仅用于公开验证的交接流程。它会验证标签和发布状态,并指引操作人员前往私有仓库。它仍会重新构建发布验证所需的 JS 输出,但不会对 macOS 制品签名、公证或发布。openclaw/releases-private/.github/workflows/openclaw-macos-validate.yml是必需的私有 macOS 验证流程,用于运行swift test;开始任何实际稳定版 macOS 发布前,必须确保此流程通过。- 实际 macOS 预检和实际 macOS 发布均使用
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml。 - 私有 macOS 验证流程在 GitHub 标准 macOS 运行器上运行。
- 私有 macOS 预检流程在 GitHub xlarge macOS 运行器上运行,并使用 SwiftPM 缓存,因为构建、签名、公证和打包流程需要大量 CPU 资源。
- 私有 macOS 预检会将已公证的构建制品作为工作流制品上传,而不是上传公开 GitHub 发布资产。
- 私有冒烟测试运行会将临时签名、未经公证的构建制品作为工作流制品上传,并有意跳过稳定版
appcast.xml生成。 - 对于稳定版发布,必须先通过 npm 预检、公开 macOS 验证、私有 macOS 验证和私有 macOS 预检,才能开始任何实际发布运行。对于 beta 发布,除非明确要求进行 macOS beta 验证,否则通过 npm 预检以及选定的 Docker、安装/更新、Parallels 和发布检查流程即可。
- 可从
main或release/YYYY.M.D分支派发实际发布运行。对于从发布分支运行的情况,标签必须包含在该发布分支中,且实际发布必须复用同一分支上成功的预检。 - 发布工作流仍基于标签;请遵循文档所述的发布顺序,而不要依赖工作流级别的 SHA 固定。
- 发布继续进行前,必须由
@openclaw/openclaw-release-managers批准npm-release环境。 - Mac 发布使用
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml, 负责准备私有 macOS 预检制品并提升实际发布制品。 - 如果私有仓库的
mac-release环境中存在OPENCLAW_PUBLIC_REPO_RELEASE_TOKEN,实际私有 macOS 发布会自动将打包后的.zip、.dmg和.dSYM.zip资产上传到openclaw/openclaw中现有的 GitHub 发布。 - 对于稳定版发布,Agent 还必须从成功的私有 macOS 工作流下载已签名的
macos-appcast-<tag>制品,然后在main上更新appcast.xml。 - 对于 macOS beta 发布,除非存在单独的 beta Sparkle 源,否则不要更新共享的生产环境
appcast.xml。 - 私有仓库使用专用的
mac-release环境。如果 GitHub 计划尚不支持在该环境中设置必需审核者,不要假设仅凭环境本身就能构成审批边界;在启用这些设置前,请依赖私有仓库访问权限和 CODEOWNERS。 - OpenClaw 包发布流程不得使用
NPM_TOKEN或插件 OTP 流程;包发布使用可信发布。 - 仅在明确需要管理 npm dist-tag 时使用
NPM_TOKEN,因为 npm 不支持通过可信发布运行npm dist-tag add。 @openclaw/*插件发布使用单独的、仅限维护者的流程。- 仅发布 npm 上已存在的插件;仅存在于捆绑磁盘目录树中的插件保持未发布状态。
本地 macOS 发布回退方案
- 保留原有的本地 macOS 发布工作流作为回退方案,以便在 CI/CD mac 发布不可用或损坏时使用。
- 保留 Peter 正在使用的现有维护者工作流:在真实 Mac 上运行, 并预先配置好本地签名、公证和 Sparkle 凭据。
- 按照私有维护者 macOS 操作手册执行本地步骤:
scripts/package-mac-dist.sh用于构建、签名、公证和打包应用; 手动上传 GitHub 发布资产;然后运行scripts/make_appcast.sh,并将appcast.xml提交到main。 scripts/package-mac-dist.sh现在会在发布构建出现以下情况时执行失败并停止: 生成的应用带有调试捆绑 ID、Sparkle 更新源 URL 为空,或者 其CFBundleVersion低于该短版本对应的规范 Sparkle 构建版本下限。 对于修正标签,请显式设置更高的APP_BUILD。scripts/make_appcast.sh首先使用PATH中的generate_appcast,然后 回退使用apps/macos/.build下的 SwiftPM Sparkle 工具输出。- 对于稳定版标签,本地回退方案可以更新共享的生产环境
appcast.xml。 - 对于测试版标签,本地回退方案仍会发布 mac 资产,但除非存在独立的测试版源,否则不得
更新共享的生产环境
appcast.xml。 - 仅将本地工作流视为回退方案。CI/CD 发布工作流 正常工作时,应优先使用。
- 每次稳定版 mac 发布后,在宣布发布完成之前,请验证以下所有内容:
- GitHub 发布中包含
.zip、.dmg和.dSYM.zip资产 main上的appcast.xml指向新的稳定版 zip- 打包后的应用报告预期的短版本号和数值形式的
CFBundleVersion,且其值达到或高于规范 Sparkle 构建版本下限
- GitHub 发布中包含
执行发布流程
- 确认操作人员明确要求发布版本。
- 选定准确的目标版本和 Git 标签。
- 将所有未提交文件按合理分组提交,推送,拉取并变基,然后确认工作区干净。
- 拉取最新的
main,并确认当前main的 CI 通过。 - 在
main上针对稳定版本基准目标运行/changelog,立即提交变更后的更新日志,推送并拉取、变基。对于 Beta 版,更新日志标题保留为## YYYY.M.D,而不是## YYYY.M.D-beta.N。 - 从更新日志提交后的
main创建release/YYYY.M.D。 - 在创建 Beta 标签前,确保仓库中的所有版本位置都与该 Beta 标签一致。
- 在发布分支上提交发布准备变更,并推送分支。
- 在发布分支上运行快速本地 Beta 预检,然后再运行任何 npm 预检或发布。除非操作人员要求在发布 Beta 前运行,否则将耗时的 Docker、Parallels 和已发布软件包安装/更新测试留到 Beta 正式发布后。
- 对于 Beta 版,除非 Beta 范围或发布阻塞问题明确要求,否则跳过 Mac 应用构建/签名/公证。对于稳定版,包含 Mac 应用、签名、公证和 appcast 流程。
- 确认目标 npm 版本尚未发布。
- 从发布分支创建并推送 Git 标签。
- 创建或更新匹配的 GitHub 发布。
- 针对发布标签触发 Actions >
QA-Lab - All Lanes,并等待 mock parity、live Matrix 和 live Telegram 需要凭据的频道测试通道通过。 - 从发布分支启动
.github/workflows/openclaw-npm-release.yml,设置preflight_only=true, 并选择预期的npm_dist_tag(默认值为beta;仅在有意直接发布稳定版时使用latest)。等待运行通过。保存该次运行的 ID,因为实际发布需要复用预先准备的 npm tarball。 - 对于稳定版,在
openclaw/openclaw中启动.github/workflows/macos-release.yml,并等待公开的仅验证运行通过。 - 对于稳定版,使用相同的标签启动
openclaw/releases-private/.github/workflows/openclaw-macos-validate.yml, 并等待私有 Mac 验证通道通过。 - 对于稳定版,设置
preflight_only=true,启动openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml, 并等待运行通过。保存该次运行的 ID,因为实际发布需要复用经过公证的 Mac 构建产物。 - 如果任何预检或验证运行失败,请在新提交中修复问题,删除标签和匹配的 GitHub 发布,从修复后的提交重新创建它们,并从头重新运行所有相关预检,然后再继续。提交发生变化后,绝不复用旧的预检结果。对于已推送或已发布的 Beta 标签,不要删除并重新创建;递增到下一个 Beta 标签。如果仅预检失败,且 npm 尚未发布该 Beta 版本,则在修复后的提交上删除并重新创建相同的 Beta 标签和预发布版本,而不是跳过一个预发布序号。
- 从同一分支、使用相同标签启动
.github/workflows/openclaw-npm-release.yml进行实际发布,选择npm_dist_tag(默认为beta;仅在有意直接发布稳定版时使用latest),保持其值与预检运行一致,并传入成功的 npmpreflight_run_id。 - 等待
@openclaw/openclaw-release-managers批准npm-release。 - 运行发布后验证:
node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>。 - 运行 Beta 发布后的验证清单。首先检查当前
main,查看发布分支切出后是否有重要修复合入;在启动耗时测试通道前,只回移重要且风险较低的修复;如果修复必须更改已发布的软件包,则递增到下一个 Beta 版本。如果 Beta 软件包发布后任何测试通道失败,则修复问题,提交/推送/拉取,递增到下一个 Beta 标签,并重新运行受影响的 Beta 验证。Beta 正式发布后,可安全并行启动远程/手动测试清单,但要控制本地 Docker 和 Parallels 的负载。在升级到稳定版/latest前,确保完整的高耗时测试清单至少通过一次。该清单包括针对确切的已发布 Beta 软件包手动运行 Actions >NPM Telegram Beta E2E工作流。如果 npm 发布前的测试通道失败,且尚未有任何标签/软件包离开本机,则修复问题并重新运行同一次预定的 Beta 尝试。在操作人员授权的 Beta 尝试次数上限内重复,通常为 4 次。 - 尽力使用
.profile中 Peter 的机器人令牌,在 Discord 上宣布 Beta/稳定版发布。 - 如果操作人员只要求发布 Beta,则在 Beta 验证和公告后停止。
- 如果稳定版发布到了
beta,且对应的 Beta 版已通过完整的信心验证,则运行轻量级稳定版升级清单:已发布 npm 版本发布后验证、Docker 安装/更新冒烟测试、仅限 macOS 的 Parallels 安装/更新冒烟测试,以及所需的 QA 信号。然后启动私有工作流openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml, 将该稳定版从beta升级到latest,然后确认latest现已指向该版本。 - 如果稳定版直接发布到了
latest,且beta也应跟随,则启动同一私有分发标签工作流,将beta指向稳定版,然后确认latest和beta都指向该版本。 - 对于稳定版,使用成功的私有 Mac
preflight_run_id启动openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml, 执行实际发布并等待成功。 - 确认成功的私有 Mac 实际运行已将
.zip、.dmg和.dSYM.zip构建产物上传到openclaw/openclaw中现有的 GitHub 发布。 - 对于稳定版,从成功的私有 Mac 运行中下载
macos-appcast-<tag>,在main上更新appcast.xml,并验证 Feed。稳定版发布成功后,将发布分支变更合并或拣选到main。 - 对于 Beta 版,仅在有意要求时发布 Mac 资源;预期不会有共享的生产环境
appcast.xml构建产物,除非另有独立 Beta Feed,否则不要更新共享的生产环境 Feed。 - 发布后,验证 npm 和附加的发布构建产物。
GHSA 安全公告工作
- 使用
openclaw-ghsa-maintainer进行 GHSA 安全公告检查、补丁/发布流程、私有 fork 验证以及 GHSA API 专用发布检查。
评论
支持 Markdown