| 1 | # CI 与发版执行 |
| 2 | |
| 3 | [English](CI_PERFORMANCE.md) |
| 4 | |
| 5 | ## Desktop PR 检查 |
| 6 | |
| 7 | `scripts/ci-paths.mjs` 是普通 CI 与内存 CI 共用的路径判定器,分别识别前端、 |
| 8 | Go、生成协议、Electron、原生平台和打包输入。`desktop/AGENTS.md` 等明确的说明 |
| 9 | 文档不会启动构建和长测;前端目录中会进入产品的 Markdown 仍属于构建输入。 |
| 10 | 未知路径或无法获得可靠 diff 时保守失败。PR 使用 merge-base 差异,push 使用 |
| 11 | `before..sha`;保留纯 release-notes 例外后,普通 `main-v2` push 仍运行完整验证矩阵。 |
| 12 | |
| 13 | `desktop-prepare` 重新生成桌面宿主契约(有漂移即失败),并在 Linux 上分别生成一次 |
| 14 | `electron/stable` 与 `electron/canary` 前端。每份产物都带版本化 manifest,记录 |
| 15 | checkout、workflow attempt、变体、构建输入、工具链以及每个 `dist` 文件的摘要。 |
| 16 | Linux、macOS 和 Windows 消费者在编译或打包前校验。显式复用遇到 manifest 缺失、 |
| 17 | 过期、身份不符或文件损坏会直接失败,不会暗中重建。跨平台只共享静态前端文件, |
| 18 | 不共享依赖目录、原生模块或 Electron 二进制。构建输入校验通过一个 Git 批处理进程 |
| 19 | 读取全部已提交 blob,不再为每个文件单独启动进程;版本 1 摘要保持逐字节兼容。 |
| 20 | |
| 21 | required `lint` 汇总 `lint-code` 和路径要求执行时的完整 `desktop-frontend` 结果。 |
| 22 | 动画单测保留在统一前端计划中且只执行一次。`desktop-browser-group` 将应用、设置与动画 |
| 23 | 合为一组,Transcript 独立为另一组,`max-parallel: 2`;`desktop-browser` 汇总拒绝失败、 |
| 24 | 取消和意外跳过。仅修改 Go 时继续执行协议和原生验证,不启动浏览器或内存长测。 |
| 25 | |
| 26 | `node desktop/frontend/scripts/run-ci-tests.mjs --list` 可以查看单测清单。 |
| 27 | 它展开原有专用脚本和生命周期钩子,自动发现新增测试,并保留每个 TypeScript |
| 28 | 测试原有的 loader,每个套件只执行一次。未知命令语法或冲突调用会直接失败。 |
| 29 | CI 同时运行两个隔离进程,历史性能基准在它们结束后单独运行。 |
| 30 | 本地仍可使用原有的 `pnpm test:*` 专用命令。 |
| 31 | |
| 32 | ## 耗时报告 |
| 33 | |
| 34 | 普通 CI 与内存工作流的 Summary 会分别显示不含排队的阶段执行时间、工作流总等待、 |
| 35 | 已记录的 job 排队时间之和及 runner 执行时长之和。前端构建、依赖与浏览器安装、 |
| 36 | 各浏览器分组和每个内存 shard 单独列出。单次数据只描述该次运行;对比应针对同一 |
| 37 | 候选各重复三次,并报告中位数和范围,避免把 runner 波动当作收益。Windows Desktop |
| 38 | Go 步骤保留原生非 verbose 输出,因为 Go JSON 模式会让 Windows 花费数分钟收尾 |
| 39 | verbose 测试缓存;统一耗时报告直接从 Actions API 记录该步骤的执行时间,不再包装 |
| 40 | 测试进程。 |
| 41 | |
| 42 | ## 内存筛查 |
| 43 | |
| 44 | 协议 v4 会在 manifest、分片报告和汇总中记录筛查档位。普通前端 PR 使用 |
| 45 | `short`:一个进程执行 32 轮 full、32 轮 windowed、32 轮 safety 和 128 轮 |
| 46 | mixed 往返。涉及 App 生命周期、Transcript、导航、订阅所有权、内存夹具或 |
| 47 | CI 路由的 PR 使用 `full`。推送到 `main-v2`、每日定时任务及手动触发也使用 |
| 48 | `full`:三个独立进程各执行 128 轮 full、128 轮 windowed、128 轮 safety 和 |
| 49 | 512 轮 mixed 往返。 |
| 50 | |
| 51 | 两个档位都要求精确检查点、每进程五份堆快照、GC、稳定帧等待、源码与构建身份 |
| 52 | 及相同判定阈值。汇总会拒绝缺失分片、档位不一致和协议不一致。只有明确启用 |
| 53 | mock 内存 soak 的 URL 会去掉夹具人为 |
| 54 | 设置的 1.5 秒 hydration 延迟;加载仍经过异步定时器任务。 |
| 55 | 普通浏览器和原生几何测试继续使用原来的延迟路径。 |
| 56 | |
| 57 | 采样时鼠标停在会话行之外;布局切换后先完成一次会话往返,再记录预热基线, |
| 58 | 避免采到菜单的临时状态。报告声明档位和协议版本,汇总拒绝旧协议。 |
| 59 | `timings.json` 在测试宿主侧记录导航、稳定帧等待、GC、堆快照与解析的次数、 |
| 60 | 总耗时和最大耗时。汇总结果通过 `screeningLevel` 标明档位,短筛查通过不会被 |
| 61 | 误认为完整验收。筛查通过仍不等于完成离线堆引用归因。 |
| 62 | |
| 63 | ## 签名发版产物 |
| 64 | |
| 65 | Stable 的 SignPath 预检成功后,将完整原生平台矩阵的产物交给 desktop |
| 66 | publisher。后者重新验证授权、候选身份、签名契约及缓存和文档校验,再校验 |
| 67 | 并发布同一批签名字节,不重复构建和签名。CLI 与 npm 仍等待完整预检通过, |
| 68 | 不会提前开始公开发布。 |
| 69 | |
| 70 | 每个平台的 bundle 将文件大小、SHA-256 与候选及控制流程 SHA、版本、tag、 |
| 71 | channel、签名契约指纹、run、调用和生产 attempt 绑定。 |
| 72 | 平台缺失或多余、身份冲突、符号链接、重复文件名及字节变化都会阻止发布。 |
| 73 | 这些传输哈希补充既有 Authenticode/minisign 校验,不能代替签名验证。 |
| 74 | |
| 75 | 只重跑失败 job 时,可复用同一 run 和调用中此前成功的平台;重建的平台只 |
| 76 | 替换自身已重新验证的 bundle。新的 workflow run 重新准备整套产物。 |
| 77 | 独立恢复发版仍自行构建并验证完整矩阵。pnpm 下载依赖按锁文件缓存;签名 |
| 78 | 产物通过 artifact 交接,不放入依赖缓存。 |
| 79 |