feat:给 CI 添加缓存从而加速 CI 流程 - #227
Conversation
|
但是,因为 GitHub 的缓存机制是将缓存部分的数据打包保存,在下一次 CI 流程中再进行下载复用,它并没有实现编译器级别的增量编译。因此,Rust 部分和 Bun 部分的编译工作还是要重新执行的,但这已经大大减少了下载依赖的时间。后续应该还有其他的方案进行优化,但是要是想实现完全的和本地一样的增量编译应该是几乎不可能的(而且对这种产物需要进行哈希校验来着) |
|
可以考虑给 Rust 加 sccache。它在 rustc 前面按源代码、编译器版本、参数等生成内容哈希,逐个复用编译结果,比缓存整个 target 目录细得多。 |
Windows CI 缓存冷/热基准对比两次测量使用同一个 PR merge ref 和同一个提交(
总览
Windows 主 job 逐步骤对比
GitHub Jobs API 的时间戳精度为 1 秒,所以 缓存恢复与完整性校验热启动中的四项缓存全部为 exact primary-key hit;日志中每项均包含相同 key 的
缓存恢复与完整性校验从冷启动的 6s 增加到热启动的 1m27s;但 exact hit 避免了冷启动中 3m27s 的缓存上传。热启动的 post-cache 处理约 5s,新增上传为 0 bytes。 构建阶段内部拆分
结论经过完整性校验的仓库缓存将 Windows 主 job 几乎减半:28m02s → 14m35s。当前最大的剩余瓶颈是第一方 Rust release 编译/链接(热启动仍需 |
There was a problem hiding this comment.
🔵 Needs a closer look
It introduces broad, cross-platform CI caching + fallback behavior changes that can subtly affect build correctness and reliability and should be validated by a human reviewer end-to-end.
Pull request overview
该 PR 旨在通过将依赖下载与构建产物迁移到仓库内的隔离缓存(.artifacts)并在恢复后进行校验,从而显著减少 CI 中重复下载/编译(Rust / SwiftPM / Bun / JDTLS)的耗时,并在校验失败时安全降级回“重新下载/重建”的路径。
Changes:
- 新增
scripts/verify-download-cache.mjs及配套验证脚本,在 CI 恢复缓存后按 SHA-256/清单校验并剔除不可信条目(含符号链接防护、Git bare repo 安全检查等)。 - Windows CI/Release 引入 Cargo 下载缓存 + build outputs 缓存 + Bun/JDTLS 缓存,并增加失败后的清理与重试逻辑(含
invoke-*-with-cache-fallback脚本)。 - macOS CI/Release 用 composite action
.github/actions/prepare-macos-dependency-cache统一恢复与校验 SwiftPM/Cargo/JDTLS 的仓库级缓存,并在需要时执行 SwiftPM resolve 的 fallback。
File summaries
| File | Description |
|---|---|
| windows/tauri/rust-toolchain.toml | 将 Windows Tauri Rust toolchain 切换到 stable,以匹配 CI 缓存与构建策略。 |
| windows/tauri/package.json | 调整 Bun packageManager 版本,使 CI 通过 bun-version-file 与仓库声明保持一致。 |
| scripts/verify-download-cache.mjs | 新增:统一的下载/依赖缓存校验与清单封存工具(Cargo/JDTLS/SwiftPM/Bun)。 |
| scripts/validate-windows-build-caches.ps1 | 新增:Windows 侧缓存恢复结果检查 + 校验失败时清理并设置环境标志。 |
| scripts/validate-macos-dependency-caches.sh | 新增:macOS 侧缓存恢复结果检查 + 调用校验器并在失败时清理隔离缓存。 |
| scripts/test-verify-download-cache.mjs | 新增:校验器单元测试 + 断言工作流/脚本正确配置缓存隔离路径。 |
| scripts/test-classify-ci-changes.sh | 更新:将下载缓存校验器与 macOS composite action 纳入 CI 变更分类测试覆盖。 |
| scripts/prepare-macos-dependencies.sh | 新增:SwiftPM 依赖解析与缓存封存(写入 .lithe-integrity.json)并提供恢复后失败的重试降级。 |
| scripts/prepare-jdtls.sh | 更新:在缓存回退场景输出 GitHub Actions warning(更可观测)。 |
| scripts/prepare-jdtls.ps1 | 更新:在缓存回退场景输出 GitHub Actions warning(更可观测)。 |
| scripts/package-windows.ps1 | 更新:支持指定 Rust target、使用新的 Bun 安装脚本与 Tauri 构建 fallback,且校验 bundled extensions 资源完整性。 |
| scripts/invoke-windows-tauri-build.ps1 | 新增:Tauri build 在缓存恢复后失败时清理 target 并重试一次的统一封装。 |
| scripts/invoke-cargo-with-cache-fallback.ps1 | 新增:Cargo 命令在缓存恢复后失败时清理 target 并重试一次的统一封装。 |
| scripts/install-windows-frontend-dependencies.ps1 | 新增:Windows 前端依赖安装使用隔离 Bun cache/tmp,失败时清理并重试,同时支持封存 Bun cache 清单。 |
| scripts/classify-ci-changes.sh | 更新:将新增脚本与 composite action 正确映射到 CI lanes(swift/plugins/windows/rust_core 等)。 |
| scripts/build-windows.ps1 | 更新:改用新的 Bun 安装脚本与 Tauri 构建 fallback。 |
| .github/workflows/release-windows.yml | 更新:Windows Release 引入隔离缓存恢复、校验与 fallback,并改为调用打包脚本路径。 |
| .github/workflows/release-preview-windows.yml | 更新:Windows Preview Release 引入隔离缓存恢复、校验与 fallback。 |
| .github/workflows/release-preview-macos.yml | 更新:macOS Preview Release 使用新的 composite action 恢复/校验依赖缓存。 |
| .github/workflows/release-macos.yml | 更新:macOS Release 使用 composite action(并支持 restore-only)。 |
| .github/workflows/ci-windows.yml | 更新:Windows CI 引入隔离缓存恢复/校验与 fallback;新增运行校验器测试的步骤。 |
| .github/workflows/ci-plugins.yml | 更新:Plugins CI 使用 composite action 恢复/校验 SwiftPM 缓存。 |
| .github/workflows/ci-macos.yml | 更新:macOS CI 使用 composite action 恢复/校验 SwiftPM/Cargo 缓存。 |
| .github/workflows/ci-database.yml | 更新:Database CI 使用 composite action 恢复/校验 SwiftPM 缓存。 |
| .github/actions/prepare-macos-dependency-cache/action.yml | 新增:macOS 依赖缓存的统一 restore/validate/prepare composite action。 |
Review details
- Files reviewed: 25/25 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| "node": ">=22.0.0" | ||
| }, | ||
| "packageManager": "bun@1.3.14" | ||
| "packageManager": "bun@1.3.12" |
| await fs.writeFile(fakeBun, "#!/bin/sh\nprintf '1.3.14\\n'\n", { mode: 0o700 }); | ||
| await fs.mkdir(path.dirname(cachedPackage), { recursive: true }); | ||
| await fs.writeFile(bunLock, "fixture-lock\n"); | ||
| await fs.writeFile(cachedPackage, "export default 1;\n"); | ||
| const bunEnvironment = { ...testEnvironment, PATH: `${fakeBin}${path.delimiter}${process.env.PATH}` }; | ||
| const bunArguments = [ | ||
| "--cargo-cache", | ||
| cargoCache, | ||
| "--cargo-lock", | ||
| cargoLock, | ||
| "--bun-version", | ||
| "1.3.14", | ||
| "--bun-lock", |
此 PR 的目标是利用 Github Action 的缓存机制来避免出现频繁的下载 rust、swift、ts 依赖还有相关的编译工作的耗时导致 CI 流程需要的时间过长,因此使用缓存将下载的包等依赖使用包名+SHA256 校验的方式来校验是否变更,如果没有变更的部分依赖等等就直接进行复用缓存,否则的话才会降级到普通的下载+编译的逻辑上去