fix: 修复 Worker Base Image 构建失败(去掉 buildx registry cache) #1425

Closed
xiaoxia wants to merge 1 commits from fix/worker-base-image-build into develop
Owner

问题

Worker Base Image 构建(Run #33051)两个 job 都失败:

  1. builder job:buildx registry cache 导出时 RPC 崩溃
    ERROR: failed to build: rpc error: code = Unavailable desc = closing transport due to: connection error
    
  2. runtime job:镜像成功推到 ACR,但 docker tag 找不到本地镜像(buildx --push 不加载到本地 daemon)
    Error response from daemon: No such image: ***/worker-base-runtime:latest
    

修复

修改 scripts/ci/docker_build_push.sh

  • 去掉 buildx + registry cache,改用普通 docker build + docker push
  • 普通 docker build 会将镜像加载到本地 daemon,后续 docker tag 正常工作
  • 保持参数兼容性(仍接受 cache_ref 参数但不使用)

影响范围

  • worker-base-image.yml(本次主要修复目标)
  • ci-pipeline.yml(PR 构建也使用同一脚本,registry cache 改为不使用后仍可正常工作,只是没有跨构建共享缓存)

Fixes #1421

## 问题 Worker Base Image 构建(Run #33051)两个 job 都失败: 1. **builder job**:buildx registry cache 导出时 RPC 崩溃 ``` ERROR: failed to build: rpc error: code = Unavailable desc = closing transport due to: connection error ``` 2. **runtime job**:镜像成功推到 ACR,但 `docker tag` 找不到本地镜像(buildx `--push` 不加载到本地 daemon) ``` Error response from daemon: No such image: ***/worker-base-runtime:latest ``` ## 修复 修改 `scripts/ci/docker_build_push.sh`: - **去掉 buildx + registry cache**,改用普通 `docker build` + `docker push` - 普通 `docker build` 会将镜像加载到本地 daemon,后续 `docker tag` 正常工作 - 保持参数兼容性(仍接受 cache_ref 参数但不使用) ## 影响范围 - `worker-base-image.yml`(本次主要修复目标) - `ci-pipeline.yml`(PR 构建也使用同一脚本,registry cache 改为不使用后仍可正常工作,只是没有跨构建共享缓存) Fixes #1421
xiaoxia added 1 commit 2026-08-18 18:27:21 +08:00
fix: remove buildx registry cache from docker_build_push.sh to fix Worker Base Image build
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 / Check if frontend-only change (pull_request) Successful in 33s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 46s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m43s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m51s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m45s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m20s
AI Code Review / AI Code Review (pull_request) Failing after 4m1s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 20s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 35s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m59s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 14m58s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 15m27s
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 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
CI/CD Pipeline / Integration Tests (pull_request) Successful in 6m3s
CI/CD Pipeline / CI Gate (pull_request) Successful in 7s
ac9bd91897
- Replace buildx build + registry cache with plain docker build + docker push
- Fixes RPC crash (rpc error: code = Unavailable desc = closing transport)
  during cache export to registry
- Fixes 'No such image' error: docker buildx --push doesn't load image
  to local daemon, causing subsequent docker tag to fail
- Maintains backward compatibility: script still accepts cache_ref param

Fixes #1421
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:是
  • 阻塞级问题数量:2 个

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

  1. [scripts/ci/docker_build_push.sh: 23] 参数解析逻辑与 set -u 冲突

    • 问题类型:逻辑bug / 边界条件遗漏
    • 问题描述:脚本开头使用了 set -eu,意味着使用未设置的变量时会报错退出。在第 23 行 CACHE_REF=$3 直接引用第三个参数。然而,注释(第 4 行)提示“cache_ref 参数保留兼容性但不再使用”,这暗示调用者可能会省略该参数。如果调用者根据注释省略了 cache_ref$3 将为空,导致脚本因 unbound variable 错误直接崩溃,无法执行后续构建逻辑。
    • 修改建议:如果 cache_ref 确实不再使用且变为可选参数,应修改赋值方式为 CACHE_REF="${3:-}",或者在使用前进行变量存在性检查,以兼容 set -u 模式。
  2. [scripts/ci/docker_build_push.sh: 32-37] 移除 buildx 导致跨平台构建能力丢失

    • 问题类型:逻辑bug / 功能回归
    • 问题描述:代码从 docker buildx build 切换为 docker builddocker build 默认仅支持构建当前宿主架构的镜像,不支持通过 QEMU 模拟进行跨平台构建(例如在 x86_64 的 CI 跑者上构建 arm64 镜像)。如果该 CI 脚本用于多架构支持的场景,此变更将直接导致构建失败。
    • 修改建议:请确认 CI 环境是否仅用于构建与宿主同构的镜像。如果需要跨平台构建能力,必须保留 docker buildx 或使用 docker build --platform。建议恢复 buildx 或明确文档说明此脚本不再支持跨平台构建。

💡 改进建议(不阻塞合并)

  1. [scripts/ci/docker_build_push.sh: 32] Shell 变量引用未加引号
    • 具体内容:在 docker build 命令中,$NO_CACHE_FLAG$BUILD_ARGS 未被双引号包裹。虽然在此场景下 NO_CACHE_FLAG 通常为空或单一单词,风险较低;但 BUILD_ARGS 包含用户传入的参数,如果构建参数值中包含空格(例如 ARG="value with space"),会导致参数被 shell 拆分,破坏命令语义。建议改为 "$NO_CACHE_FLAG""$BUILD_ARGS"

良好实践

  • 脚本保留了 timeout 命令,有效防止了构建过程无限挂起。
  • 移除了复杂的缓存重试逻辑,虽然牺牲了一定的健壮性,但显著简化了代码逻辑,提高了可读性(在不需要复杂缓存的场景下)。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-18 10:31:24 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:2 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 1. **[scripts/ci/docker_build_push.sh: 23] 参数解析逻辑与 `set -u` 冲突** - 问题类型:逻辑bug / 边界条件遗漏 - 问题描述:脚本开头使用了 `set -eu`,意味着使用未设置的变量时会报错退出。在第 23 行 `CACHE_REF=$3` 直接引用第三个参数。然而,注释(第 4 行)提示“cache_ref 参数保留兼容性但不再使用”,这暗示调用者可能会省略该参数。如果调用者根据注释省略了 `cache_ref`,`$3` 将为空,导致脚本因 `unbound variable` 错误直接崩溃,无法执行后续构建逻辑。 - 修改建议:如果 `cache_ref` 确实不再使用且变为可选参数,应修改赋值方式为 `CACHE_REF="${3:-}"`,或者在使用前进行变量存在性检查,以兼容 `set -u` 模式。 2. **[scripts/ci/docker_build_push.sh: 32-37] 移除 `buildx` 导致跨平台构建能力丢失** - 问题类型:逻辑bug / 功能回归 - 问题描述:代码从 `docker buildx build` 切换为 `docker build`。`docker build` 默认仅支持构建当前宿主架构的镜像,不支持通过 QEMU 模拟进行跨平台构建(例如在 x86_64 的 CI 跑者上构建 arm64 镜像)。如果该 CI 脚本用于多架构支持的场景,此变更将直接导致构建失败。 - 修改建议:请确认 CI 环境是否仅用于构建与宿主同构的镜像。如果需要跨平台构建能力,必须保留 `docker buildx` 或使用 `docker build --platform`。建议恢复 `buildx` 或明确文档说明此脚本不再支持跨平台构建。 ### 💡 改进建议(不阻塞合并) 1. **[scripts/ci/docker_build_push.sh: 32] Shell 变量引用未加引号** - 具体内容:在 `docker build` 命令中,`$NO_CACHE_FLAG` 和 `$BUILD_ARGS` 未被双引号包裹。虽然在此场景下 `NO_CACHE_FLAG` 通常为空或单一单词,风险较低;但 `BUILD_ARGS` 包含用户传入的参数,如果构建参数值中包含空格(例如 `ARG="value with space"`),会导致参数被 shell 拆分,破坏命令语义。建议改为 `"$NO_CACHE_FLAG"` 和 `"$BUILD_ARGS"`。 ### ✅ 良好实践 - 脚本保留了 `timeout` 命令,有效防止了构建过程无限挂起。 - 移除了复杂的缓存重试逻辑,虽然牺牲了一定的健壮性,但显著简化了代码逻辑,提高了可读性(在不需要复杂缓存的场景下)。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-18 10:31:24 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-08-18 18:32:46 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1425 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
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 / Check if frontend-only change (pull_request) Successful in 33s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 46s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m43s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m51s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m45s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m20s
AI Code Review / AI Code Review (pull_request) Failing after 4m1s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 20s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 35s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m59s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 14m58s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 15m27s
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 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
CI/CD Pipeline / Integration Tests (pull_request) Successful in 6m3s
CI/CD Pipeline / CI Gate (pull_request) Successful in 7s

Pull request closed

Sign in to join this conversation.