perf(ci): Worker基础镜像三级缓存策略优化 #832

Merged
xiaoxia merged 4 commits from fix/ci-worker-cache-optimization into develop 2026-07-24 19:04:19 +08:00
Owner

优化目标

将Worker镜像构建时间从2分47秒进一步压缩到1分钟内。

核心问题

  1. pre-build缓存失效bug:pre-build构建的镜像tag是Gitea地址,但worker.Dockerfile里FROM的是阿里云ACR地址,导致pre-build白做了,每次都fallback重新构建
  2. 没有利用本地daemon缓存:DooD模式下8个runner共享宿主机docker daemon,但没有先检查本地
  3. 构建后不推送:基础镜像构建完不推送到Registry,下次构建还得重新来

三级缓存策略

  • L1 本地daemon缓存(最快):先检查宿主机docker有没有ACR tag的镜像,有就直接用(秒过)
  • L2 Gitea Registry缓存(较快):本地没有从Gitea registry拉取,重tag为ACR地址供Dockerfile使用
  • L3 本地构建(最慢):前两级都失败才构建,构建成功后推送回Registry供后续复用

其他优化

  • 普通docker build模式启用DOCKER_BUILDKIT=1加速
  • Worker Dockerfile层顺序优化(变化少的文件放前面,提高缓存命中率)
  • 移除builder阶段冗余的全量strip(base镜像已strip过)

预期效果

  • 首次构建:~3分钟(和之前差不多,需要构建+推送)
  • 后续同runner构建:<30秒(L1本地缓存命中)
  • 不同runner构建:<1分钟(L2 Registry缓存命中)
## 优化目标 将Worker镜像构建时间从2分47秒进一步压缩到1分钟内。 ## 核心问题 1. **pre-build缓存失效bug**:pre-build构建的镜像tag是Gitea地址,但worker.Dockerfile里FROM的是阿里云ACR地址,导致pre-build白做了,每次都fallback重新构建 2. **没有利用本地daemon缓存**:DooD模式下8个runner共享宿主机docker daemon,但没有先检查本地 3. **构建后不推送**:基础镜像构建完不推送到Registry,下次构建还得重新来 ## 三级缓存策略 - **L1 本地daemon缓存**(最快):先检查宿主机docker有没有ACR tag的镜像,有就直接用(秒过) - **L2 Gitea Registry缓存**(较快):本地没有从Gitea registry拉取,重tag为ACR地址供Dockerfile使用 - **L3 本地构建**(最慢):前两级都失败才构建,构建成功后推送回Registry供后续复用 ## 其他优化 - 普通docker build模式启用`DOCKER_BUILDKIT=1`加速 - Worker Dockerfile层顺序优化(变化少的文件放前面,提高缓存命中率) - 移除builder阶段冗余的全量strip(base镜像已strip过) ## 预期效果 - 首次构建:~3分钟(和之前差不多,需要构建+推送) - 后续同runner构建:<30秒(L1本地缓存命中) - 不同runner构建:<1分钟(L2 Registry缓存命中)
xiaoxia added 1 commit 2026-07-24 16:58:09 +08:00
perf(ci): Worker基础镜像三级缓存策略优化\n\n- L1 本地daemon缓存:DooD模式8runner共享宿主机daemon,命中即秒过\n- L2 Registry缓存:从Gitea registry拉取后重tag供Dockerfile使用\n- L3 本地构建:构建成功后推送回Registry供后续复用\n- 修复pre-build构建镜像tag与Dockerfile FROM不一致的bug\n- 普通docker build改用DOCKER_BUILDKIT=1加速\n- Worker Dockerfile层顺序优化,变化少的文件放前面\n- 移除builder阶段冗余的全量strip(base镜像已strip过)
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 32s
AI Code Review / AI Code Review (pull_request) Successful in 3m36s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m40s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 15m41s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 30s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 42s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m27s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m42s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 55s
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 / 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 / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m42s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m12s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m33s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m44s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 5m49s
824222de87
xiaoxia added 1 commit 2026-07-24 17:38:18 +08:00
fix(ci): 补充unit/integration tests补充JWT_SECRET_KEY环境变量
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 4s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m19s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m24s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 28s
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 39s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m29s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m51s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 23s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 2m41s
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m36s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m21s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m30s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 6m47s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 8m16s
a1ba05d869
xiaoxia added 1 commit 2026-07-24 17:53:22 +08:00
fix(ci): unit tests脚本兜底JWT_SECRET_KEY
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 40s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 55s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m36s
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 / Validate - Migration (alembic) (pull_request) Successful in 1m58s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m59s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m6s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 26s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m12s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m9s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m25s
AI Code Review / AI Code Review (pull_request) Successful in 5m50s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 5m53s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m4s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m12s
38617515ee
xiaoxia added 1 commit 2026-07-24 18:54:05 +08:00
style: black格式化test_api_settings.py格式修复
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 15s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 51s
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 / Validate - Type Check (mypy) (pull_request) Successful in 1m37s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m40s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m50s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m59s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 28s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m1s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m6s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m20s
AI Code Review / AI Code Review (pull_request) Successful in 3m34s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m5s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 5m17s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 29s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 49m52s
5b42ff0e96
xiaoxia force-pushed fix/ci-worker-cache-optimization from 7324a33fd0 to 5b42ff0e96 2026-07-24 18:54:05 +08:00 Compare
Collaborator

代码审查结果 - PR #832

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

  1. .gitea/workflows/ci-pipeline.yml 第677-707行:构建基础镜像的重试逻辑存在严重缺陷。脚本使用了 set -eu,但在 if docker buildx build ...; then 语句中,即使命令失败也不会触发 set -e 的退出机制。如果3次重试全部失败,循环结束后脚本会继续向下执行,导致后续步骤尝试使用不存在的镜像进行构建,从而产生误导性的错误信息。必须在循环结束后检查构建状态,若失败则显式执行 exit 1

💡 建议(2个可选)

  1. .gitea/workflows/ci-pipeline.yml:变量命名 ACR_REGISTRY 具有误导性。脚本中并未包含登录或拉取阿里云 ACR 镜像的逻辑,该变量仅作为本地 docker tag 的命名前缀以匹配 Dockerfile 中的 FROM 地址。建议重命名为 TARGET_IMAGE_PREFIXLOCAL_TAG_PREFIX,避免维护者误以为需要配置 ACR 鉴权信息。
  2. .gitea/workflows/ci-pipeline.yml:敏感信息硬编码。JWT_SECRET_KEY 直接明文写在 Workflow 配置文件中。虽然这是测试用的密钥,但建议使用 CI 平台的 Secrets 管理功能(如 secrets.TEST_JWT_SECRET)进行引用,符合安全最佳实践,防止密钥泄露。

格式检查通过 | 逻辑审查需修改 | 性能无明显问题


🤖 由 AI 代码审查机器人自动生成 | 2026-07-24 10:59:11 | 模型:

## 代码审查结果 - PR #832 ### ⚠️ 问题(1个需要修改) 1. **.gitea/workflows/ci-pipeline.yml 第677-707行**:构建基础镜像的重试逻辑存在严重缺陷。脚本使用了 `set -eu`,但在 `if docker buildx build ...; then` 语句中,即使命令失败也不会触发 `set -e` 的退出机制。如果3次重试全部失败,循环结束后脚本会继续向下执行,导致后续步骤尝试使用不存在的镜像进行构建,从而产生误导性的错误信息。必须在循环结束后检查构建状态,若失败则显式执行 `exit 1`。 ### 💡 建议(2个可选) 1. **.gitea/workflows/ci-pipeline.yml**:变量命名 `ACR_REGISTRY` 具有误导性。脚本中并未包含登录或拉取阿里云 ACR 镜像的逻辑,该变量仅作为本地 `docker tag` 的命名前缀以匹配 Dockerfile 中的 `FROM` 地址。建议重命名为 `TARGET_IMAGE_PREFIX` 或 `LOCAL_TAG_PREFIX`,避免维护者误以为需要配置 ACR 鉴权信息。 2. **.gitea/workflows/ci-pipeline.yml**:敏感信息硬编码。`JWT_SECRET_KEY` 直接明文写在 Workflow 配置文件中。虽然这是测试用的密钥,但建议使用 CI 平台的 Secrets 管理功能(如 `secrets.TEST_JWT_SECRET`)进行引用,符合安全最佳实践,防止密钥泄露。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-24 10:59:11 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 58fe71c483 into develop 2026-07-24 19:04:19 +08:00

🗑️ 预览环境已清理

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

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

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