fix(ci): 修复Staging E2E/API Tests DooD挂载路径问题 - 改用docker cp #769

Merged
xiaoxia merged 1 commits from fix/ci-staging-e2e-dood into develop 2026-07-23 20:04:20 +08:00
Owner

问题根因

Staging E2E Tests 和 Staging API Integration Tests 运行时找不到 package-lock.jsonnpm ci 直接失败,整个job 1秒就挂。

根因:DooD(Docker-outside-of-Docker)挂载路径不一致。

  • CI Job本身跑在Docker容器里,step_checkout.sh把代码下载到容器内的工作目录
  • docker run -v "$PWD:/workspace" 挂载的是宿主机的路径,不是CI容器内的路径
  • 宿主机上对应路径没有代码,导致playwright容器里/workspace/apps/web是空的
  • npm ci找不到package-lock.json,直接报错

修复方案

改用 docker create + docker cp + docker start 模式:

  1. docker create 创建容器(不启动)
  2. docker cp 把CI容器内的代码拷进playwright容器
  3. docker start -a 启动并attach输出
  4. docker wait 获取退出码,docker rm 清理

完全绕开-v挂载的路径问题,跟其他前端job(Frontend Lint等)的DooD处理思路一致。

改动

  • 只改 .gitea/workflows/ci-pipeline.yml
  • 涉及2个job:staging-e2estaging-api-tests
  • 不动业务代码
## 问题根因 Staging E2E Tests 和 Staging API Integration Tests 运行时找不到 `package-lock.json`,`npm ci` 直接失败,整个job 1秒就挂。 **根因**:DooD(Docker-outside-of-Docker)挂载路径不一致。 - CI Job本身跑在Docker容器里,`step_checkout.sh`把代码下载到容器内的工作目录 - `docker run -v "$PWD:/workspace"` 挂载的是**宿主机**的路径,不是CI容器内的路径 - 宿主机上对应路径没有代码,导致playwright容器里`/workspace/apps/web`是空的 - `npm ci`找不到`package-lock.json`,直接报错 ## 修复方案 改用 `docker create` + `docker cp` + `docker start` 模式: 1. `docker create` 创建容器(不启动) 2. `docker cp` 把CI容器内的代码拷进playwright容器 3. `docker start -a` 启动并attach输出 4. `docker wait` 获取退出码,`docker rm` 清理 完全绕开-v挂载的路径问题,跟其他前端job(Frontend Lint等)的DooD处理思路一致。 ## 改动 - 只改 `.gitea/workflows/ci-pipeline.yml` - 涉及2个job:`staging-e2e` 和 `staging-api-tests` - 不动业务代码
xiaoxia added 1 commit 2026-07-23 19:36:36 +08:00
fix(ci): 修复Staging E2E/API Tests DooD挂载路径问题 - 改用docker cp
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 12s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m24s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m9s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 30s
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 1m39s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m46s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 56s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 29s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m9s
AI Code Review / AI Code Review (pull_request) Successful in 4m42s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 12m15s
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 / Integration Tests (pull_request) Successful in 3m27s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 6m38s
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
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 14s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 54m45s
339802a440
auto-approve-bot approved these changes 2026-07-23 19:46:34 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-23 19:46:34 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

代码审查结果 - PR #769

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

  1. .gitea/workflows/ci-pipeline.yml 第1095行(及1159行):资源泄漏风险。
    • 脚本开头使用了 set -eu,这意味着 docker cpdocker start 一旦失败(例如源文件不存在或容器启动异常),脚本会立即退出。此时后续的 docker rm 清理命令将无法执行,导致创建的容器在宿主机上残留,长期运行会占用大量资源。
    • 建议添加 trap 指令以确保无论脚本因何种原因退出,都能执行清理操作。例如:trap 'docker rm -f "$CONTAINER_NAME" 2>/dev/null' EXIT

💡 建议(2个可选)

  1. 依赖拷贝逻辑优化:第1096行(及1160行)中 docker cp package-lock.json ... 2>/dev/null || true 的逻辑与后续 npm ci 命令冲突。npm ci 强制要求 package-lock.json 必须存在,如果拷贝失败(文件不存在),忽略错误只会导致后续 npm ci 报错退出,且掩盖了根本原因。建议移除 || true,让拷贝阶段直接报错,或者确认文件是否可选并改用 npm install
  2. 代码重复消除:两个 Job(Staging E2E 和 Staging API Tests)中的 Docker 操作逻辑完全一致。建议将此逻辑抽取为 Shell 脚本文件并在 Workflow 中调用,或者使用 YAML 的 Anchor & Alias 机制复用配置,以降低维护成本。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 11:49:51 | 模型:

## 代码审查结果 - PR #769 ### ⚠️ 问题(1个需要修改) 1. **.gitea/workflows/ci-pipeline.yml 第1095行(及1159行)**:资源泄漏风险。 - 脚本开头使用了 `set -eu`,这意味着 `docker cp` 或 `docker start` 一旦失败(例如源文件不存在或容器启动异常),脚本会立即退出。此时后续的 `docker rm` 清理命令将无法执行,导致创建的容器在宿主机上残留,长期运行会占用大量资源。 - 建议添加 `trap` 指令以确保无论脚本因何种原因退出,都能执行清理操作。例如:`trap 'docker rm -f "$CONTAINER_NAME" 2>/dev/null' EXIT`。 ### 💡 建议(2个可选) 1. **依赖拷贝逻辑优化**:第1096行(及1160行)中 `docker cp package-lock.json ... 2>/dev/null || true` 的逻辑与后续 `npm ci` 命令冲突。`npm ci` 强制要求 `package-lock.json` 必须存在,如果拷贝失败(文件不存在),忽略错误只会导致后续 `npm ci` 报错退出,且掩盖了根本原因。建议移除 `|| true`,让拷贝阶段直接报错,或者确认文件是否可选并改用 `npm install`。 2. **代码重复消除**:两个 Job(Staging E2E 和 Staging API Tests)中的 Docker 操作逻辑完全一致。建议将此逻辑抽取为 Shell 脚本文件并在 Workflow 中调用,或者使用 YAML 的 Anchor & Alias 机制复用配置,以降低维护成本。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 11:49:51 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 021001073b into develop 2026-07-23 20:04:20 +08:00

🗑️ 预览环境已清理

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

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

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