fix(ci): push 路径检测安全回溯——防止 concurrency 取消导致前端改动丢失 #1578

Merged
xiaoxia merged 1 commits from fix/ci-push-paths-safe-base into develop 2026-08-31 17:41:43 +08:00
Owner

问题

GITHUB_EVENT_BEFORE 只指向上一次 push 的 SHA。如果那次 push 的 workflow 被 concurrency 取消,前端改动永远不会被构建。后续 push 的 diff 不覆盖被取消的改动,skip_frontend 被错误设为 true。

实际影响:PR#1576(成片库UI改造)的前端改动至今未部署到 staging。

修复

在 diff 前查询最近一次实际构建了 web 镜像的成功 push run,用其 head_sha 作为 diff 基准:

  1. 调用 Gitea API 获取最近 30 个成功 push run
  2. 对每个 run 检查 Build Staging Web Image job 是否 success(非 skipped)
  3. 找到第一个真正构建了 web 的 run → 用其 SHA 作为 before
  4. 如果找不到 → 保守走全量构建

改动文件

  • scripts/ci/ci_push_paths.sh — 新增安全回溯逻辑(仅影响 push 事件的 check-push-paths job)
## 问题 `GITHUB_EVENT_BEFORE` 只指向上一次 push 的 SHA。如果那次 push 的 workflow 被 concurrency 取消,前端改动永远不会被构建。后续 push 的 diff 不覆盖被取消的改动,`skip_frontend` 被错误设为 true。 **实际影响**:PR#1576(成片库UI改造)的前端改动至今未部署到 staging。 ## 修复 在 diff 前查询最近一次**实际构建了 web 镜像**的成功 push run,用其 `head_sha` 作为 diff 基准: 1. 调用 Gitea API 获取最近 30 个成功 push run 2. 对每个 run 检查 `Build Staging Web Image` job 是否 `success`(非 skipped) 3. 找到第一个真正构建了 web 的 run → 用其 SHA 作为 `before` 4. 如果找不到 → 保守走全量构建 ## 改动文件 - `scripts/ci/ci_push_paths.sh` — 新增安全回溯逻辑(仅影响 push 事件的 `check-push-paths` job)
xiaoxia added 1 commit 2026-08-31 17:25:57 +08:00
fix(ci): push 路径检测安全回溯——防止 concurrency 取消导致前端改动丢失
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 3m9s
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
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m41s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m47s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m0s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m7s
AI Code Review / AI Code Review (pull_request) Successful in 4m27s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m24s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m28s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m22s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m45s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 8m9s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 2m25s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m18s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 17m11s
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 / CI Gate (pull_request) Successful in 2m43s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
97bafd5692
问题:GITHUB_EVENT_BEFORE 只指向上一次 push 的 SHA。如果那次 push 的
workflow 被 concurrency 取消,前端改动永远不会被构建。后续 push 的 diff
不覆盖被取消的改动,skip_frontend 被错误设为 true。

修复:在 diff 前查询最近一次**实际构建了 web 镜像**的成功 push run,用其
head_sha 作为 diff 基准。如果找不到,保守走全量构建。

影响:scripts/ci/ci_push_paths.sh(仅 push 事件的 check-push-paths job)

🚀 预览环境已部署

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

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

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

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

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

【阻塞级判定】

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

📊 审查概览

  • 整体评价:有建议
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须)

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

  1. [scripts/ci/ci_push_paths.sh: 35-73] Python 脚本变量注入风险

    • 具体内容:Python 脚本通过 Shell 字符串插值直接获取变量(如 token = '${GITHUB_TOKEN}')。虽然 CI 环境变量通常受信,但如果变量值包含单引号等特殊字符,会导致 Python 语法错误,进而导致脚本静默失败并回退到全量构建。
    • 修改建议:建议通过环境变量或命令行参数传递变量给 Python,例如在 Python 中使用 import os; token = os.environ.get('GITHUB_TOKEN'),或者使用 json.dumps 进行转义,以提高代码的健壮性。
  2. [scripts/ci/ci_push_paths.sh: 49] 作业名称匹配逻辑

    • 具体内容:代码使用 'Build Staging Web' in j.get('name', '') 进行子字符串匹配。如果存在名为 "Build Staging Web V2" 或 "Cancel Build Staging Web" 的作业,可能会产生误判。
    • 修改建议:如果意图是精确匹配,建议使用 == 'Build Staging Web';如果需要匹配多个变体,建议使用正则表达式或明确的列表判断。

良好实践

  • 增加了并发取消导致的前端改动遗漏的安全回溯机制,逻辑设计合理。
  • 在找不到历史构建记录时,采用了保守策略(全量构建),有效避免了漏构建风险。
  • 使用 ZERO 变量替代硬编码的 Hash 字符串,提高了代码可读性和可维护性。
  • Python 脚本中设置了超时参数,防止因网络问题导致 CI 任务挂起。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 09:30:23 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:有建议 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须) 无 ### 💡 改进建议(不阻塞合并) 1. **[scripts/ci/ci_push_paths.sh: 35-73] Python 脚本变量注入风险** - 具体内容:Python 脚本通过 Shell 字符串插值直接获取变量(如 `token = '${GITHUB_TOKEN}'`)。虽然 CI 环境变量通常受信,但如果变量值包含单引号等特殊字符,会导致 Python 语法错误,进而导致脚本静默失败并回退到全量构建。 - 修改建议:建议通过环境变量或命令行参数传递变量给 Python,例如在 Python 中使用 `import os; token = os.environ.get('GITHUB_TOKEN')`,或者使用 `json.dumps` 进行转义,以提高代码的健壮性。 2. **[scripts/ci/ci_push_paths.sh: 49] 作业名称匹配逻辑** - 具体内容:代码使用 `'Build Staging Web' in j.get('name', '')` 进行子字符串匹配。如果存在名为 "Build Staging Web V2" 或 "Cancel Build Staging Web" 的作业,可能会产生误判。 - 修改建议:如果意图是精确匹配,建议使用 `== 'Build Staging Web'`;如果需要匹配多个变体,建议使用正则表达式或明确的列表判断。 ### ✅ 良好实践 - 增加了并发取消导致的前端改动遗漏的安全回溯机制,逻辑设计合理。 - 在找不到历史构建记录时,采用了保守策略(全量构建),有效避免了漏构建风险。 - 使用 `ZERO` 变量替代硬编码的 Hash 字符串,提高了代码可读性和可维护性。 - Python 脚本中设置了超时参数,防止因网络问题导致 CI 任务挂起。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 09:30:23 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-31 17:35:56 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-31 17:35:56 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia merged commit ee6fa3e1cf into develop 2026-08-31 17:41:43 +08:00
xiaoxia deleted branch fix/ci-push-paths-safe-base 2026-08-31 17:41:44 +08:00

🗑️ 预览环境已清理

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

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

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