fix(ci): Web构建改用layer缓存替代cache mount,根治node_modules缓存损坏 #521

Merged
auto-approve-bot merged 1 commits from fix/web-build-cache-mount into develop 2026-07-18 16:05:11 +08:00
Owner

问题

Web构建连续4轮失败(从#518开始),根因是 --mount=type=cache,target=/app/apps/web/node_modules 的BuildKit cache mount缓存损坏,里面缺少vitest、typescript等关键依赖。

Cache mount数据只存在buildx builder本地卷里,不走ACR,内容完整性无保障,一旦损坏所有后续构建连锁失败。

修复

移除node_modules的cache mount,改为写入镜像layer,走ACR缓存:

  • 依赖层(package.json + npm ci)由layer哈希保证完整性
  • layer缓存通过 --cache-from/--cache-to type=registry 走ACR,跨runner共享
  • 损坏后自动miss缓存重新构建,自愈

保留的cache mount(不影响正确性,只是加速):

  • /root/.npm — npm下载缓存
  • .tscache — TS增量编译缓存

影响

  • 构建速度:依赖层命中时略慢几秒(读layer vs 挂本地卷),但可靠性大幅提升
  • 跨runner:之前各跑各的缓存,现在统一走ACR共享
  • 自愈能力:之前缓存坏了一直坏,现在缓存miss自动重建
## 问题 Web构建连续4轮失败(从#518开始),根因是 `--mount=type=cache,target=/app/apps/web/node_modules` 的BuildKit cache mount缓存损坏,里面缺少vitest、typescript等关键依赖。 Cache mount数据只存在buildx builder本地卷里,不走ACR,内容完整性无保障,一旦损坏所有后续构建连锁失败。 ## 修复 移除node_modules的cache mount,改为写入镜像layer,走ACR缓存: - 依赖层(package.json + npm ci)由layer哈希保证完整性 - layer缓存通过 `--cache-from/--cache-to type=registry` 走ACR,跨runner共享 - 损坏后自动miss缓存重新构建,自愈 保留的cache mount(不影响正确性,只是加速): - `/root/.npm` — npm下载缓存 - `.tscache` — TS增量编译缓存 ## 影响 - 构建速度:依赖层命中时略慢几秒(读layer vs 挂本地卷),但可靠性大幅提升 - 跨runner:之前各跑各的缓存,现在统一走ACR共享 - 自愈能力:之前缓存坏了一直坏,现在缓存miss自动重建
xiaoxia added 1 commit 2026-07-18 16:00:22 +08:00
fix(ci): Web构建改用layer缓存替代cache mount,避免node_modules缓存损坏导致构建全挂
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (pull_request) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 22s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 51s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 56s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m51s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m4s
Auto Approve CI PRs / Auto Approve on CI Green (pull_request) Successful in 3m33s
AI Code Review / AI Code Review (pull_request) Successful in 4m5s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m28s
Auto Merge CI PRs / Auto Merge on CI Green + Approved (pull_request) Successful in 4m49s
Preview Cleanup / Cleanup Preview Environment (pull_request) Failing after 1s
c9839b265c
- 移除node_modules的cache mount,改为写入镜像layer走ACR缓存
- 保留/root/.npm cache mount加速下载(不影响正确性)
- 保留.tscache cache mount加速TS增量编译(坏了不影响构建)
- layer缓存由ACR跨runner共享,内容完整性由layer哈希保证

🚀 预览环境已部署

项目 详情
PR号 #521
预览链接 https://pr-521.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #521 | | 预览链接 | [https://pr-521.preview.xiaoxiajianji.com](https://pr-521.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-07-18 16:03:55 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-18 16:03:55 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
Collaborator

代码审查结果 - PR #521

⚠️ 问题(0个需要修改)

💡 建议(1个可选)

  1. infra/docker/web.Dockerfile 依赖安装阶段:如果项目未来引入私有 npm 源(通过 .npmrc 配置),当前的 npm config set registry 可能会覆盖源内的配置或导致私有包拉取失败。建议确认是否需要保留 .npmrc 文件或调整注册表配置策略。

格式检查通过 | 逻辑审查通过 | 性能优化合理

📊 审查概览

  • 整体评价:通过
  • 严重问题数量:0 个
  • 一般建议数量:1 个

需修改的问题(严重)

💡 改进建议(一般)

  1. [infra/docker/web.Dockerfile] 私有源兼容性建议
    • 具体内容:当前代码在 npm ci 前执行了 npm config set registry https://registry.npmmirror.com。这会将全局注册表锁定为淘宝镜像。如果项目中包含需要从私有源拉取的包(通常配置在 .npmrc 中),可能会导致解析失败。建议确认项目是否完全依赖公共包,或者考虑将 .npmrc 文件(如果存在)在 npm ci 之前复制到工作目录,以确保配置优先级正确。

良好实践

  1. 构建稳定性优化:将 node_modules 从 BuildKit cache mount 转移到镜像层存储,利用 ACR(或其它镜像仓库)的层缓存机制。这在 CI/CD 环境中能有效利用远程缓存,避免因本地缓存失效导致的完全重新构建,提升了构建的确定性和复用性。
  2. 依赖安装安全:使用 npm ci 而非 npm install,确保了 package-lock.json 的版本一致性,符合生产环境构建的最佳实践。
  3. 缓存策略清晰:保留了 /root/.npm 的 cache mount 用于加速下载包,同时将构建产物持久化到层中,兼顾了速度与正确性。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 16:04:27 | 模型:

## 代码审查结果 - PR #521 ### ⚠️ 问题(0个需要修改) 无 ### 💡 建议(1个可选) 1. **infra/docker/web.Dockerfile 依赖安装阶段**:如果项目未来引入私有 npm 源(通过 `.npmrc` 配置),当前的 `npm config set registry` 可能会覆盖源内的配置或导致私有包拉取失败。建议确认是否需要保留 `.npmrc` 文件或调整注册表配置策略。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能优化合理 ### 📊 审查概览 - 整体评价:通过 - 严重问题数量:0 个 - 一般建议数量:1 个 ### ❌ 需修改的问题(严重) 无 ### 💡 改进建议(一般) 1. **[infra/docker/web.Dockerfile] 私有源兼容性建议** - 具体内容:当前代码在 `npm ci` 前执行了 `npm config set registry https://registry.npmmirror.com`。这会将全局注册表锁定为淘宝镜像。如果项目中包含需要从私有源拉取的包(通常配置在 `.npmrc` 中),可能会导致解析失败。建议确认项目是否完全依赖公共包,或者考虑将 `.npmrc` 文件(如果存在)在 `npm ci` 之前复制到工作目录,以确保配置优先级正确。 ### ✅ 良好实践 1. **构建稳定性优化**:将 `node_modules` 从 BuildKit cache mount 转移到镜像层存储,利用 ACR(或其它镜像仓库)的层缓存机制。这在 CI/CD 环境中能有效利用远程缓存,避免因本地缓存失效导致的完全重新构建,提升了构建的确定性和复用性。 2. **依赖安装安全**:使用 `npm ci` 而非 `npm install`,确保了 `package-lock.json` 的版本一致性,符合生产环境构建的最佳实践。 3. **缓存策略清晰**:保留了 `/root/.npm` 的 cache mount 用于加速下载包,同时将构建产物持久化到层中,兼顾了速度与正确性。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 16:04:27 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit b9df592148 into develop 2026-07-18 16:05:11 +08:00
auto-approve-bot deleted branch fix/web-build-cache-mount 2026-07-18 16:05:11 +08:00
Sign in to join this conversation.