ci: CI重复失败检测 - 自动识别高失败率job并飞书告警 #703

Merged
xiaoxia merged 6 commits from ci/repeated-failure-detection into develop 2026-07-22 11:39:58 +08:00
Owner

背景

第四层(持续监控)最后一块拼图:CI重复失败检测。

定期扫描最近N天的CI失败,按job分组统计失败率,识别高失败率的系统性故障,自动飞书告警。

功能

检测逻辑

  • 统计周期: 最近7天(可配置)
  • 数据源: Gitea Actions API
  • 统计维度: 按job名称分组

三级告警

级别 条件 处理
🔴 严重 连续失败≥3次 或 失败率≥50%且失败≥5次 飞书高优先级告警
🟡 警告 失败率≥30%且失败≥3次 飞书普通告警
🔵 关注 失败≥2次 仅记录在报告中

定时运行

  • 每6小时一次(cron: 0 */6 * * *)
  • 支持手动触发(workflow_dispatch)
  • 监控脚本永远不fail,避免告警风暴

文件清单

    • 检测脚本(409行)
    • 定时任务

四层防御架构补全

  • L1 事前防: 4/4
  • L2 事中自愈: 4/4
  • L3 事后诊断: 3/3
  • L4 持续监控: 4/4 (本PR补全最后一块)
## 背景 第四层(持续监控)最后一块拼图:CI重复失败检测。 定期扫描最近N天的CI失败,按job分组统计失败率,识别高失败率的系统性故障,自动飞书告警。 ## 功能 ### 检测逻辑 - **统计周期**: 最近7天(可配置) - **数据源**: Gitea Actions API - **统计维度**: 按job名称分组 ### 三级告警 | 级别 | 条件 | 处理 | |------|------|------| | 🔴 严重 | 连续失败≥3次 或 失败率≥50%且失败≥5次 | 飞书高优先级告警 | | 🟡 警告 | 失败率≥30%且失败≥3次 | 飞书普通告警 | | 🔵 关注 | 失败≥2次 | 仅记录在报告中 | ### 定时运行 - 每6小时一次(cron: 0 */6 * * *) - 支持手动触发(workflow_dispatch) - 监控脚本永远不fail,避免告警风暴 ## 文件清单 - - 检测脚本(409行) - - 定时任务 ## 四层防御架构补全 - L1 事前防: 4/4 ✅ - L2 事中自愈: 4/4 ✅ - L3 事后诊断: 3/3 ✅ - **L4 持续监控: 4/4 ✅(本PR补全最后一块)**
xiaoxia added 2 commits 2026-07-22 10:57:21 +08:00
ci: 添加CI重复失败检测定时任务
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 / Check if frontend-only change (pull_request) Successful in 28s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 28s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 39s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 48s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 43s
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 / Validate - Code Quality (pull_request) Failing after 1m23s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m0s
CI/CD Pipeline / Frontend Unit Tests (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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m6s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m6s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 58s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m24s
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
246406eeb0

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #703 | | 预览链接 | [https://pr-703.preview.xiaoxiajianji.com](https://pr-703.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-07-22 11:00:34 +08:00
fix: 修复时间字段名(created_at->started_at)
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 / Check if frontend-only change (pull_request) Successful in 34s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 41s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 49s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 49s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 54s
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 / PR Build Web Image (pull_request) Successful in 1m34s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 55s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m14s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m0s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m11s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m51s
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
8c1566cec3
xiaoxia added 1 commit 2026-07-22 11:04:33 +08:00
style: black format ci_repeated_failure_detector.py
CI/CD Pipeline / PR Build Worker Image (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 39s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 31s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m4s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 25s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 42s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 53s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m5s
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 Merge on CI Green + Approved (pull_request) Successful in 56s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 37s
CI/CD Pipeline / Frontend Unit Tests (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 / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
2cb273b472
xiaoxia added 1 commit 2026-07-22 11:11:40 +08:00
style: fix isort import ordering
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 35s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 36s
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 / Validate - Type Check (mypy) (pull_request) Successful in 48s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 55s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 59s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 33s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m1s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 49s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m7s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m15s
CI/CD Pipeline / Frontend Unit Tests (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m31s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m19s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m55s
AI Code Review / AI Code Review (pull_request) Successful in 4m20s
52e866b750
Collaborator

代码审查结果 - PR #703

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

  1. scripts/ci/ci_repeated_failure_detector.py 第95行:时间比较逻辑不可靠,使用字符串直接比较ISO格式时间。

    • 原因datetime.now().isoformat() 生成的字符串通常包含微秒(如 ...12:00:00.123456),而Gitea API返回的时间戳通常只有秒精度(如 ...12:00:00)。直接进行字符串比较(started >= since)会导致精度不匹配,可能错误地过滤掉边界时间点的Run,导致统计数据不准确。
    • 后果:统计结果可能遗漏部分CI运行记录,导致失败率计算偏差。
  2. scripts/ci/ci_repeated_failure_detector.py 第57-65行:API错误处理过于宽泛,掩盖了认证或服务器错误。

    • 原因api_get 函数在捕获 HTTPError 或其他异常时仅打印日志并返回 None。上游函数 fetch_recent_runs 判断 if not data: break 会直接终止循环,脚本最终输出“没有找到runs”。
    • 后果:如果Token配置错误(401)或API服务不可用(500),脚本会静默失败并报告“无异常”,导致运维人员误以为CI状态良好,掩盖了真实的配置或系统故障。

💡 建议(2个可选)

  1. scripts/ci/ci_repeated_failure_detector.py 第153行:存在N+1查询性能风险。

    • 说明:在 analyze_failures 循环中对每个Run调用 fetch_run_jobs(run_id)。如果统计周期内(如7天)有大量Run(例如100+),将产生大量串行HTTP请求,可能导致脚本执行时长超过Workflow设置的10分钟超时限制,或触发API速率限制。建议考虑增加并发请求(如使用concurrent.futures)或限制单次扫描的Run数量上限。
  2. .gitea/workflows/ci-failure-monitor.yml 第37-40行:建议使用标准Checkout方式。

    • 说明:使用 curl ... | bash 动态下载并执行脚本存在安全风险(虽然此处是从同一仓库获取)且依赖网络环境。如果Gitea支持 actions/checkout,建议使用标准Action;如果必须使用脚本,建议增加对下载内容的校验(如SHA256校验)。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 11:16:42 | 模型:

## 代码审查结果 - PR #703 ### ⚠️ 问题(2个需要修改) 1. **scripts/ci/ci_repeated_failure_detector.py 第95行**:时间比较逻辑不可靠,使用字符串直接比较ISO格式时间。 - **原因**:`datetime.now().isoformat()` 生成的字符串通常包含微秒(如 `...12:00:00.123456`),而Gitea API返回的时间戳通常只有秒精度(如 `...12:00:00`)。直接进行字符串比较(`started >= since`)会导致精度不匹配,可能错误地过滤掉边界时间点的Run,导致统计数据不准确。 - **后果**:统计结果可能遗漏部分CI运行记录,导致失败率计算偏差。 2. **scripts/ci/ci_repeated_failure_detector.py 第57-65行**:API错误处理过于宽泛,掩盖了认证或服务器错误。 - **原因**:`api_get` 函数在捕获 `HTTPError` 或其他异常时仅打印日志并返回 `None`。上游函数 `fetch_recent_runs` 判断 `if not data: break` 会直接终止循环,脚本最终输出“没有找到runs”。 - **后果**:如果Token配置错误(401)或API服务不可用(500),脚本会静默失败并报告“无异常”,导致运维人员误以为CI状态良好,掩盖了真实的配置或系统故障。 ### 💡 建议(2个可选) 1. **scripts/ci/ci_repeated_failure_detector.py 第153行**:存在N+1查询性能风险。 - **说明**:在 `analyze_failures` 循环中对每个Run调用 `fetch_run_jobs(run_id)`。如果统计周期内(如7天)有大量Run(例如100+),将产生大量串行HTTP请求,可能导致脚本执行时长超过Workflow设置的10分钟超时限制,或触发API速率限制。建议考虑增加并发请求(如使用`concurrent.futures`)或限制单次扫描的Run数量上限。 2. **.gitea/workflows/ci-failure-monitor.yml 第37-40行**:建议使用标准Checkout方式。 - **说明**:使用 `curl ... | bash` 动态下载并执行脚本存在安全风险(虽然此处是从同一仓库获取)且依赖网络环境。如果Gitea支持 `actions/checkout`,建议使用标准Action;如果必须使用脚本,建议增加对下载内容的校验(如SHA256校验)。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 11:16:42 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia added 1 commit 2026-07-22 11:18:29 +08:00
style: fix black/isort formatting (line-length=120)
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 / Check if frontend-only change (pull_request) Successful in 31s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 35s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 37s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 39s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 40s
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 / Frontend Lint (pull_request) Successful in 56s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 53s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m58s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 2m15s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m20s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m43s
AI Code Review / AI Code Review (pull_request) Successful in 8m13s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 30s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 22m26s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 34m32s
6d8656b3f6
xiaoxia merged commit e4ce3caad1 into develop 2026-07-22 11:39:58 +08:00

🗑️ 预览环境已清理

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

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

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