fix(ci): 去掉前端脚本DooD嵌套,直接在CI容器内运行Node命令 #756

Merged
auto-approve-bot merged 2 commits from fix/frontend-dood-mount into develop 2026-07-23 17:38:09 +08:00
Owner

问题

Docker模式Runner下,前端脚本(step_frontend_install.sh / step_frontend_run.sh)使用 DooD(Docker-out-of-Docker)方式启动Node容器,-v "$PWD:/workspace" 挂载的是job容器内路径,宿主机docker daemon找不到对应路径,导致子容器内工作目录为空。

现象:No files matching the pattern "src" were found.,Frontend Lint 和 Frontend Unit Tests 全红。

方案

CI基础镜像(ci-base:latest)已包含 Node 20 + pnpm 9 + npm 10,完全不需要再套一层DooD。直接在job容器内运行前端命令,从根本上解决挂载路径问题。

  • step_frontend_install.sh:去掉docker run,直接pnpm install
  • step_frontend_run.sh:去掉docker run,直接执行命令

影响

  • 去掉一层Docker嵌套,启动更快
  • 消除挂载路径不匹配问题
  • 缓存从docker volume改为直接使用工作目录node_modules(后续可优化为pnpm store共享)
## 问题 Docker模式Runner下,前端脚本(step_frontend_install.sh / step_frontend_run.sh)使用 DooD(Docker-out-of-Docker)方式启动Node容器,`-v "$PWD:/workspace"` 挂载的是job容器内路径,宿主机docker daemon找不到对应路径,导致子容器内工作目录为空。 现象:`No files matching the pattern "src" were found.`,Frontend Lint 和 Frontend Unit Tests 全红。 ## 方案 CI基础镜像(ci-base:latest)已包含 Node 20 + pnpm 9 + npm 10,完全不需要再套一层DooD。直接在job容器内运行前端命令,从根本上解决挂载路径问题。 - step_frontend_install.sh:去掉docker run,直接pnpm install - step_frontend_run.sh:去掉docker run,直接执行命令 ## 影响 - 去掉一层Docker嵌套,启动更快 - 消除挂载路径不匹配问题 - 缓存从docker volume改为直接使用工作目录node_modules(后续可优化为pnpm store共享)
xiaoxia added 1 commit 2026-07-23 13:55:34 +08:00
fix(ci): 去掉前端脚本DooD嵌套,直接在CI容器内运行
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 25s
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 / Frontend Lint (pull_request) Failing after 41s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 53s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 53s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m58s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m1s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 27s
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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m5s
AI Code Review / AI Code Review (pull_request) Successful in 3m39s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m34s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m23s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m25s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 3m47s
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 Worker Image (pull_request) Successful in 12m24s
f9e95f2049
xiaoxia added 1 commit 2026-07-23 17:31:05 +08:00
fix(ci): 前端脚本改用npm ci(项目用package-lock.json而非pnpm)
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 33s
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 Web Image (pull_request) Successful in 55s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m4s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m38s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m50s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 20s
AI Code Review / AI Code Review (pull_request) Successful in 2m54s
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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m2s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m20s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m22s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 3m41s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m54s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m0s
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 / Deploy Production (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 Worker Image (pull_request) Successful in 13m26s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 41s
a4f518b880
Collaborator

📊 审查概览

  • 整体评价:需修改
  • 严重问题数量:1 个
  • 一般建议数量:2 个

需修改的问题(严重)

  1. [scripts/ci/step_frontend_install.sh: 第18行] 移除网络重试机制导致 CI 稳定性下降
    • 问题描述:原代码在执行 npm ci 时包含 for i in 1 2 3 的重试逻辑,以应对网络抖动或 npm 镜像源(registry.npmmirror.com)不稳定的情况。新代码直接执行 `npm ci``,一旦网络请求失败,CI 流程将直接报错退出,可能导致频繁的 CI 失败。
    • 修改建议:建议恢复重试逻辑,或者使用 npm-retry 等工具,确保在网络不稳定时能自动重试。

💡 改进建议(一般)

  1. [scripts/ci/step_frontend_install.sh: 第14行] 缺少关键文件前置检查

    • 具体内容:npm ci 命令强制要求 package-lock.json 文件存在。原代码在逻辑中包含了对该文件的检查,新代码直接运行 npm ci。虽然 npm ci 失败会触发 set -e 退出,但显式检查能提供更明确的错误提示(如 "Error: package-lock.json not found"),帮助开发者快速定位是文件缺失还是网络问题。
  2. [scripts/ci/step_frontend_run.sh: 第10行] 命令参数校验缺失

    • 具体内容:脚本直接使用 sh -lc "$CMD" 执行传入的参数。虽然在 CI 环境中参数来源通常是受控的,但缺乏对 $CMD 是否为空的校验可能导致无意义的执行。此外,直接拼接命令存在潜在的命令注入风险(如果调用方未做好过滤),建议添加基本的非空校验,并在文档中明确调用规范。

良好实践

  • 简化了复杂的 Docker Volume 缓存逻辑,显著降低了脚本的维护复杂度和出错点(前提是 CI 环境确实已内置 Node.js 且不需要跨任务持久化缓存)。
  • 保留了 set -eu,确保脚本在错误或变量未定义时能及时退出,符合 Shell 脚本最佳实践。
  • 使用 npm ci 而非 npm install,确保了 CI 环境下依赖版本的可复现性。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 09:34:37 | 模型:

### 📊 审查概览 - 整体评价:需修改 - 严重问题数量:1 个 - 一般建议数量:2 个 ### ❌ 需修改的问题(严重) 1. **[scripts/ci/step_frontend_install.sh: 第18行] 移除网络重试机制导致 CI 稳定性下降** - 问题描述:原代码在执行 `npm ci` 时包含 `for i in 1 2 3` 的重试逻辑,以应对网络抖动或 npm 镜像源(registry.npmmirror.com)不稳定的情况。新代码直接执行 `npm ci``,一旦网络请求失败,CI 流程将直接报错退出,可能导致频繁的 CI 失败。 - 修改建议:建议恢复重试逻辑,或者使用 `npm-retry` 等工具,确保在网络不稳定时能自动重试。 ### 💡 改进建议(一般) 1. **[scripts/ci/step_frontend_install.sh: 第14行] 缺少关键文件前置检查** - 具体内容:`npm ci` 命令强制要求 `package-lock.json` 文件存在。原代码在逻辑中包含了对该文件的检查,新代码直接运行 `npm ci`。虽然 `npm ci` 失败会触发 `set -e` 退出,但显式检查能提供更明确的错误提示(如 "Error: package-lock.json not found"),帮助开发者快速定位是文件缺失还是网络问题。 2. **[scripts/ci/step_frontend_run.sh: 第10行] 命令参数校验缺失** - 具体内容:脚本直接使用 `sh -lc "$CMD"` 执行传入的参数。虽然在 CI 环境中参数来源通常是受控的,但缺乏对 `$CMD` 是否为空的校验可能导致无意义的执行。此外,直接拼接命令存在潜在的命令注入风险(如果调用方未做好过滤),建议添加基本的非空校验,并在文档中明确调用规范。 ### ✅ 良好实践 - 简化了复杂的 Docker Volume 缓存逻辑,显著降低了脚本的维护复杂度和出错点(前提是 CI 环境确实已内置 Node.js 且不需要跨任务持久化缓存)。 - 保留了 `set -eu`,确保脚本在错误或变量未定义时能及时退出,符合 Shell 脚本最佳实践。 - 使用 `npm ci` 而非 `npm install`,确保了 CI 环境下依赖版本的可复现性。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 09:34:37 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit 2ee710ca16 into develop 2026-07-23 17:38:09 +08:00
auto-approve-bot deleted branch fix/frontend-dood-mount 2026-07-23 17:38:10 +08:00

🗑️ 预览环境已清理

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

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

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