CI 与发布门禁职责
原则:每个风险有明确的检查负责人;同一提交已通过的源码测试不在 Release 全量重跑。不同平台、不同运行边界和新生成的制品不是同一种证据,但并非每个边界都必须在 PR、main 和 Release 三个阶段重复执行。
必需 CI:5 个检查
| 检查 | 职责 |
|---|---|
verify | 类型、lint、实时生产依赖审计及审计/SBOM 策略用例、字体许可、Web Lite 产物一致性、核心逻辑、设置与歌词草稿持久化、本地化、安全/IPC、生命周期及关键模块覆盖率 |
render-boundary-regression | Linux 生产构建、界面首次打开/恢复、减少动态效果语义、受控 AI 流下 React 渲染次数;不是安装器或真实外部 AI 服务验证 |
web-lite-smoke | Chromium 编辑、导出格式/尺寸/溢出边界、无障碍 axe,以及延迟加载界面的失败恢复 |
web-lite-cross-browser-smoke | 同一 job 运行 Firefox 和 WebKit 两个最小关键路径项目;共享依赖安装,不复制 Chromium 完整套件 |
desktop-packaged-regression | Windows 生产构建及 win-unpacked/ASAR 打包资源、单实例、来源边界、剪贴板、设置、历史/自动保存恢复;普通 CI 不生成和安装 Setup |
PR 和最终 main push 都运行这些检查。合并可能改变提交 SHA,因此不能用 PR 的旧结果替代最终提交。发布授权必须核验 security/release-source-policy.json 中要求的全部检查成功;缺失、跳过或失败都阻塞发布。
这些检查覆盖不同运行边界:源码测试不能代替真实导出,浏览器不能代替 Windows IPC/持久化,Chromium 也不能代替已承诺支持的 Firefox/Safari。渲染次数、资源字节数与几何上限属于确定性工作量或安全约束,不等同于机器相关的毫秒性能阈值。
Release 必须现场执行
- 核验标签、版本、多语言发布说明、最终 SHA、main 祖先关系、合并 PR 和同 SHA CI 授权,防止构建期间来源变化。
- 执行实时生产依赖审计;漏洞公告和豁免期限会变化,旧 CI 结果不能替代当前检查。
- 确认发布说明已经脱离候选措辞。审计及 SBOM 策略固定用例由同 SHA CI 负责;PowerShell 多命令块须在任一原生命令失败时终止,不能被后续成功命令掩盖。
- 从授权 SHA 重新构建 Setup,验证打包资源与许可,安装实际 Setup、启动、关闭和卸载。此处验证的是新生成的发布字节,不能用 CI 的 unpacked 成功结果替代。
- 审计打包 Electron 依赖闭包,并生成、检查 SBOM、校验和与来源证明;上传后核对精确草稿制品,通过后再公开发布。
完整 Windows 交互回归依赖同 SHA 的 CI 结果;最终安装包 smoke 只覆盖安装、启动等制品边界,不宣称等价于完整交互套件。反过来,普通 CI 的 unpacked 结果也不宣称覆盖安装器。若发布构建引入与 CI 不同的功能开关或运行配置,应补充相应交互验证。
不作为发布前提的检查
- 背景合成长卡性能基准:手动执行,不在发布必需检查列表中;主动运行时,其自身失败仍应报告。
- 桌面像素和帧耗时诊断:手动 opt-in、非阻塞。
- 实时音乐服务探测、README 媒体生成、启动性能和体积报告:按相关变更或排障需要执行,不要求每次 Release 全量运行。
- Pages 是独立静态站点部署流程,不是桌面 Release 的必需 CI 状态;仍须在部署前验证自己的产物和分发白名单。
维护规则
不新增按路径跳过必需 CI 的规则:共享组件、配置、依赖和文档合约存在交叉影响,且发布授权需要最终 SHA 的完整证据。保留 PR/main 双阶段,因为合并可能改变 SHA;保留发布前来源复核,因为它跨越构建、草稿写入和公开发布三个状态边界。
本地复核按改动边界选择用例,不额外规定一份无条件全量本地 gate。工作流修改应验证 CI/Release 合约、发布授权用例及 PowerShell 语法/原生命令失败传播;打包路径修改应实际重建并测试受影响的产物。完整远端 CI 成功只能在推送后确认,不能把本地结果当作远端发布授权。