feat(ci): P2-4 基础设施自动重试策略 #653

Merged
auto-approve-bot merged 3 commits from feat/ci-p2-infra-retry into develop 2026-07-20 20:06:52 +08:00
Owner

P2-4: CI失败自动重试策略

给基础设施侧容易波动的步骤增加重试机制,降低偶发网络问题导致的CI失败率。

改动清单

1. code-review.yml - Checkout 加重试

  • actions/checkout@v3 步骤增加 retry: max_attempts: 2
  • 网络波动自动重试,不影响业务逻辑

2. ci-trigger-monitor.yml - Checkout 加重试

  • 同上,actions/checkout@v3 增加重试

3. ci-pipeline.yml - Docker login 加重试

  • 3处 Docker login 步骤(Staging Build / Staging Deploy / Production Build)
  • 增加 bash 级别的 3 次重试,每次失败等待 5s
  • 覆盖 ACR + Gitea Registry 两个镜像仓库登录

已有重试(无需改动)

  • step_checkout.sh (tarball方式) - 已有 5 次重试
  • Docker build/push - 已有 3 次手动重试
  • 前端 pnpm install - 已有 retry 配置

目标

基础设施类偶发失败率降低 80%+,CI稳定性进一步提升。

## P2-4: CI失败自动重试策略 给基础设施侧容易波动的步骤增加重试机制,降低偶发网络问题导致的CI失败率。 ### 改动清单 **1. code-review.yml - Checkout 加重试** - `actions/checkout@v3` 步骤增加 `retry: max_attempts: 2` - 网络波动自动重试,不影响业务逻辑 **2. ci-trigger-monitor.yml - Checkout 加重试** - 同上,`actions/checkout@v3` 增加重试 **3. ci-pipeline.yml - Docker login 加重试** - 3处 Docker login 步骤(Staging Build / Staging Deploy / Production Build) - 增加 bash 级别的 3 次重试,每次失败等待 5s - 覆盖 ACR + Gitea Registry 两个镜像仓库登录 ### 已有重试(无需改动) - ✅ step_checkout.sh (tarball方式) - 已有 5 次重试 - ✅ Docker build/push - 已有 3 次手动重试 - ✅ 前端 pnpm install - 已有 retry 配置 ### 目标 基础设施类偶发失败率降低 80%+,CI稳定性进一步提升。
xiaoxia added 3 commits 2026-07-20 19:57:27 +08:00
ci: Docker login增加重试机制
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 / 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 / Check if frontend-only change (pull_request) Successful in 17s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 2m26s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m28s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 3m40s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 8m10s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 8m16s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 9m22s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 26s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 8m39s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m3s
76ff797642
Collaborator

📊 审查概览

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

需修改的问题(严重)

  1. [.gitea/workflows/ci-pipeline.yml: 468-479, 599-610, 872-883] 重试逻辑缺少失败处理

    • 问题描述:在 for 循环实现的 Docker 登录重试逻辑中,如果 3 次尝试全部失败,循环结束后脚本会继续向下执行,而不会显式报错退出。虽然脚本开头有 set -eu,但登录失败发生在 if 条件内部,不会触发 set -e 的退出机制。这将导致后续的 docker builddocker pull 命令因未登录而报错,错误信息会误导开发者以为是构建问题而非登录问题。
    • 修改建议:在 for 循环结束后(即 done 之后),添加显式的失败退出逻辑,例如:
      done
      # 检查最后一次登录状态,如果失败则退出
      docker info > /dev/null 2>&1 || { echo "❌ Docker login 最终失败"; exit 1; }
      
  2. [.gitea/workflows/ci-trigger-monitor.yml: 24-26, .gitea/workflows/code-review.yml: 28-30] 非标准的 Actions 语法配置

    • 问题描述:在 actions/checkout@v3 步骤中直接添加 retry 字段并非 GitHub Actions 或 Gitea Actions 的标准语法。标准规范中,Step 级别不支持 retry 关键字(通常需要使用 continue-on-error 或在 Shell 脚本中实现重试)。此配置极大概率会被 Runner 忽略,导致网络波动时无法按预期重试。
    • 修改建议:如果 Gitea 官方文档未明确支持该扩展字段,应删除此配置。若需重试,建议在 run 脚本中实现,或使用支持重试的第三方 Action。

💡 改进建议(一般)

  1. [.gitea/workflows/ci-pipeline.yml] 消除代码重复
    • 具体内容:Docker 登录的重试逻辑在三个不同的 Job 中完全重复了三次。建议将此逻辑封装为一个 Shell 脚本(例如 scripts/docker-login.sh)并添加到仓库中,然后在 Workflow 中通过 run: scripts/docker-login.sh 调用,便于统一维护和修改。

良好实践

  • ci-pipeline.yml 中使用 printf '%s' 代替 echo 处理密码,有效避免了密码中包含转义字符导致的安全风险或解析错误。
  • 意识到网络波动问题并引入重试机制,提高了 CI 流程的稳定性。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-20 19:59:54 | 模型:

### 📊 审查概览 - **整体评价**:需修改 - **严重问题数量**:2 个 - **一般建议数量**:1 个 ### ❌ 需修改的问题(严重) 1. **[.gitea/workflows/ci-pipeline.yml: 468-479, 599-610, 872-883] 重试逻辑缺少失败处理** - **问题描述**:在 `for` 循环实现的 Docker 登录重试逻辑中,如果 3 次尝试全部失败,循环结束后脚本会继续向下执行,而不会显式报错退出。虽然脚本开头有 `set -eu`,但登录失败发生在 `if` 条件内部,不会触发 `set -e` 的退出机制。这将导致后续的 `docker build` 或 `docker pull` 命令因未登录而报错,错误信息会误导开发者以为是构建问题而非登录问题。 - **修改建议**:在 `for` 循环结束后(即 `done` 之后),添加显式的失败退出逻辑,例如: ```yaml done # 检查最后一次登录状态,如果失败则退出 docker info > /dev/null 2>&1 || { echo "❌ Docker login 最终失败"; exit 1; } ``` 2. **[.gitea/workflows/ci-trigger-monitor.yml: 24-26, .gitea/workflows/code-review.yml: 28-30] 非标准的 Actions 语法配置** - **问题描述**:在 `actions/checkout@v3` 步骤中直接添加 `retry` 字段并非 GitHub Actions 或 Gitea Actions 的标准语法。标准规范中,Step 级别不支持 `retry` 关键字(通常需要使用 `continue-on-error` 或在 Shell 脚本中实现重试)。此配置极大概率会被 Runner 忽略,导致网络波动时无法按预期重试。 - **修改建议**:如果 Gitea 官方文档未明确支持该扩展字段,应删除此配置。若需重试,建议在 `run` 脚本中实现,或使用支持重试的第三方 Action。 ### 💡 改进建议(一般) 1. **[.gitea/workflows/ci-pipeline.yml] 消除代码重复** - **具体内容**:Docker 登录的重试逻辑在三个不同的 Job 中完全重复了三次。建议将此逻辑封装为一个 Shell 脚本(例如 `scripts/docker-login.sh`)并添加到仓库中,然后在 Workflow 中通过 `run: scripts/docker-login.sh` 调用,便于统一维护和修改。 ### ✅ 良好实践 - 在 `ci-pipeline.yml` 中使用 `printf '%s'` 代替 `echo` 处理密码,有效避免了密码中包含转义字符导致的安全风险或解析错误。 - 意识到网络波动问题并引入重试机制,提高了 CI 流程的稳定性。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-20 19:59:54 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #653 | | 预览链接 | [https://pr-653.preview.xiaoxiajianji.com](https://pr-653.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-07-20 20:05:46 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 9a457d06cb into develop 2026-07-20 20:06:52 +08:00
auto-approve-bot deleted branch feat/ci-p2-infra-retry 2026-07-20 20:06:52 +08:00

🗑️ 预览环境已清理

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

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

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