fix(ci): resolve Staging API Integration Tests 0s failure - container name conflict #1278

Merged
xiaoxia merged 1 commits from fix/staging-tests-container-cleanup into develop 2026-08-07 20:08:39 +08:00
Owner

问题

Staging API Integration Tests 每次都在 0 秒内失败(秒挂)。

根因

通过 Gitea Actions 日志确认:

Error response from daemon: Conflict. The container name "/staging-api-tests-38" is already in use by container "e243227..."

CI 容器内 PID 每次都是 38,所以容器名固定是 staging-api-tests-38。上一次运行失败后 set -eu 直接退出,没有执行到 docker rm,残留容器导致下次 docker create 立即失败。

E2E job 有 docker rm -f 清理步骤所以没这个问题,API Tests job 漏了这个步骤。

修复内容

  1. staging-api-tests: 在 docker create 前加 docker rm -f 清理残留容器(与 staging-e2e 保持一致)
  2. 两个 staging job: 删除无效的 docker cp package-lock.json 行(该文件在仓库根目录不存在,且已通过 docker cp apps 包含)

影响

  • 不影响 PR 合并流程(Staging 测试不在 CI Gate 中)
  • 修复后 Staging API Integration Tests 可以正常执行

Fixes #1275

## 问题 Staging API Integration Tests 每次都在 0 秒内失败(秒挂)。 ## 根因 通过 Gitea Actions 日志确认: ``` Error response from daemon: Conflict. The container name "/staging-api-tests-38" is already in use by container "e243227..." ``` CI 容器内 PID 每次都是 38,所以容器名固定是 `staging-api-tests-38`。上一次运行失败后 `set -eu` 直接退出,没有执行到 `docker rm`,残留容器导致下次 `docker create` 立即失败。 E2E job 有 `docker rm -f` 清理步骤所以没这个问题,API Tests job 漏了这个步骤。 ## 修复内容 1. **staging-api-tests**: 在 `docker create` 前加 `docker rm -f` 清理残留容器(与 staging-e2e 保持一致) 2. **两个 staging job**: 删除无效的 `docker cp package-lock.json` 行(该文件在仓库根目录不存在,且已通过 `docker cp apps` 包含) ## 影响 - 不影响 PR 合并流程(Staging 测试不在 CI Gate 中) - 修复后 Staging API Integration Tests 可以正常执行 Fixes #1275
xiaoxia added 1 commit 2026-08-07 20:07:24 +08:00
fix(ci): resolve Staging API Integration Tests 0s failure
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 57s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 59s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 20s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m24s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 31s
AI Code Review / AI Code Review (pull_request) Failing after 1m47s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m57s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m9s
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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m57s
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 - Code Quality (pull_request) Successful in 4m41s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m13s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 4m7s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m56s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 11m15s
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 51s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
88c71268c9
Root cause: container name conflict. The CI container PID is always 38,
so the container name 'staging-api-tests-38' collides with a leftover
container from the previous failed run (set -eu exits before docker rm).

Fixes:
- Add 'docker rm -f' cleanup before 'docker create' in staging-api-tests
  (matching the existing pattern in staging-e2e)
- Remove invalid 'docker cp package-lock.json' from both staging jobs
  (file doesn't exist at repo root; already included via 'docker cp apps')

Fixes #1275
xiaoxia merged commit 8b6800b63f into develop 2026-08-07 20:08:39 +08:00
xiaoxia deleted branch fix/staging-tests-container-cleanup 2026-08-07 20:08:39 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1278 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Collaborator

【阻塞级判定】

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

📊 审查概览

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

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

  1. [.gitea/workflows/ci-pipeline.yml: 1105, 1167] 删除 package-lock.json 拷贝导致依赖安装失败
    • 问题类型:逻辑bug
    • 问题描述:脚本中执行的命令是 npm ci,该命令严格要求当前目录下必须存在 package-lock.json,否则会报错退出。原代码显式地将宿主机的 package-lock.json 拷贝到容器工作目录,说明该文件位于 apps 目录之外。删除这行拷贝命令后,容器内将缺失该文件,导致 npm ci 无法执行,CI 流程必然失败。
    • 修改建议:请确认 package-lock.json 是否已移动至 apps 目录内。如果未移动,必须恢复 docker cp package-lock.json ... 这行代码;如果已移动,请确保 npm ci 的工作目录(CWD)正确切换到了包含该文件的目录(当前命令未显示切换目录的操作)。

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

良好实践

  1. [.gitea/workflows/ci-pipeline.yml: 1158] 添加容器清理逻辑
    • 具体内容:在 docker create 之前添加 docker rm -f ... 是非常好的实践,有效解决了因上次构建异常退出导致容器名称残留("name already in use")引发的偶发性失败。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 12:11:35 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:1 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:0 个 ### 🔴 阻塞级问题(必须修复) 1. **[.gitea/workflows/ci-pipeline.yml: 1105, 1167] 删除 `package-lock.json` 拷贝导致依赖安装失败** - 问题类型:逻辑bug - 问题描述:脚本中执行的命令是 `npm ci`,该命令严格要求当前目录下必须存在 `package-lock.json`,否则会报错退出。原代码显式地将宿主机的 `package-lock.json` 拷贝到容器工作目录,说明该文件位于 `apps` 目录之外。删除这行拷贝命令后,容器内将缺失该文件,导致 `npm ci` 无法执行,CI 流程必然失败。 - 修改建议:请确认 `package-lock.json` 是否已移动至 `apps` 目录内。如果未移动,必须恢复 `docker cp package-lock.json ...` 这行代码;如果已移动,请确保 `npm ci` 的工作目录(CWD)正确切换到了包含该文件的目录(当前命令未显示切换目录的操作)。 ### 💡 改进建议(不阻塞合并) 无 ### ✅ 良好实践 1. **[.gitea/workflows/ci-pipeline.yml: 1158] 添加容器清理逻辑** - 具体内容:在 `docker create` 之前添加 `docker rm -f ...` 是非常好的实践,有效解决了因上次构建异常退出导致容器名称残留("name already in use")引发的偶发性失败。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 12:11:35 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1278 | | 预览链接 | [https://pr-1278.preview.xiaoxiajianji.com](https://pr-1278.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Sign in to join this conversation.