fix(ci): Web 镜像 buildx 幽灵缓存防护——Git Tree Hash Cache Bust #1585

Merged
xiaoxia merged 2 commits from fix/buildx-web-cache-bust into develop 2026-08-31 22:40:57 +08:00
Owner

问题

ci-builder-persist 持久化 builder 的 buildkit 层缓存偶尔出现"幽灵命中":COPY apps/web/ ./ 步骤认为自己没变(实际文件已改),导致 vite build 不执行,打出来的 Web 镜像前端文件是旧的。

修复原理

apps/web/ 目录的 git tree hash 作为 build arg 传入 Dockerfile。buildx 把 build arg 值作为缓存键的一部分,hash 变了 → RUN 步骤缓存失效 → vite build 必须重新执行。依赖层(npm ci)不受影响,仍然正常缓存。

改动

  1. web.Dockerfile:新增 ARG SOURCE_HASH,在构建步骤写入 .cache_bust 文件
  2. docker_build_push.sh:Web 镜像构建时计算 git tree hash 并传入
  3. docker_build_only.sh:同上

验证

  • 合并后触发 push 到 develop
  • 查看 Build Staging Web Image 日志,确认输出 Web cache bust: SOURCE_HASH=xxxxx
  • 修改 apps/web/ 下文件再次 push,确认 SOURCE_HASH 值变化且 vite build 执行
## 问题 ci-builder-persist 持久化 builder 的 buildkit 层缓存偶尔出现"幽灵命中":COPY apps/web/ ./ 步骤认为自己没变(实际文件已改),导致 vite build 不执行,打出来的 Web 镜像前端文件是旧的。 ## 修复原理 把 `apps/web/` 目录的 git tree hash 作为 build arg 传入 Dockerfile。buildx 把 build arg 值作为缓存键的一部分,hash 变了 → RUN 步骤缓存失效 → vite build 必须重新执行。依赖层(npm ci)不受影响,仍然正常缓存。 ## 改动 1. **web.Dockerfile**:新增 `ARG SOURCE_HASH`,在构建步骤写入 `.cache_bust` 文件 2. **docker_build_push.sh**:Web 镜像构建时计算 git tree hash 并传入 3. **docker_build_only.sh**:同上 ## 验证 - 合并后触发 push 到 develop - 查看 Build Staging Web Image 日志,确认输出 `Web cache bust: SOURCE_HASH=xxxxx` - 修改 apps/web/ 下文件再次 push,确认 SOURCE_HASH 值变化且 vite build 执行
xiaoxia added 1 commit 2026-08-31 21:09:29 +08:00
fix(ci): Web 镜像 buildx 幽灵缓存防护——Git Tree Hash Cache Bust
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 3m26s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m51s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m51s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m44s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 8m45s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m10s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m15s
CI/CD Pipeline / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
f34b076dcd
问题:ci-builder-persist 持久化 builder 的 buildkit 层缓存偶尔出现'幽灵命中':
COPY apps/web/ ./ 步骤认为自己没变(实际文件已改),导致 vite build 不执行,
打出来的 Web 镜像前端文件是旧的。

修复原理:
把 apps/web/ 目录的 git tree hash 作为 build arg 传入 Dockerfile。
buildx 把 build arg 值作为缓存键的一部分,hash 变了 → RUN 步骤缓存失效 →
vite build 必须重新执行。依赖层(npm ci)不受影响,仍然正常缓存。

改动:
1. web.Dockerfile:新增 ARG SOURCE_HASH,在构建步骤写入 .cache_bust 文件
2. docker_build_push.sh:Web 镜像构建时计算 git tree hash 并传入
3. docker_build_only.sh:同上

验证:
- 合并后触发 push 到 develop
- 查看 Build Staging Web Image 日志,确认输出 Web cache bust: SOURCE_HASH=xxxxx
- 修改 apps/web/ 下文件再次 push,确认 SOURCE_HASH 值变化且 vite build 执行

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1585 | | 预览链接 | [https://pr-1585.preview.xiaoxiajianji.com](https://pr-1585.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-31 21:32:35 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m16s
AI Code Review / AI Code Review (pull_request) Successful in 2m46s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m4s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m12s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m5s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m20s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Style (pull_request) Successful in 11m30s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 14m33s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Validate - Security (pull_request) Successful in 18m58s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 36m55s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 48m14s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 2m46s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 5m39s
148b41a5d6
Collaborator

代码审查结果 - PR #1585

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

💡 建议(0个可选)


格式检查通过 | 逻辑审查通过 | 性能无隐患


🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 13:41:27 | 模型:

## 代码审查结果 - PR #1585 ### ⚠️ 问题(0个需要修改) ### 💡 建议(0个可选) --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无隐患 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 13:41:27 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit bc9df316dc into develop 2026-08-31 22:40:57 +08:00

🗑️ 预览环境已清理

PR #1585 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1585 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.