feat(ci): Validate阶段增加migration编号连续性检查 #652

Merged
auto-approve-bot merged 4 commits from feat/ci-migration-chain-validation into develop 2026-07-20 20:46:48 +08:00
Owner

背景

最近多次出现 PR 的 migration 编号断链(down_revision 指向不存在的版本),导致 Integration Tests 全挂才发现问题,浪费 CI 资源和排查时间。

方案

在 Validate 阶段增加 migration 编号连续性静态检查,不用等数据库迁移就秒级发现断链。

新增

scripts/ci/check_migration_chain.py(175行):

  • 静态扫描 alembic/versions/ 下所有 migration 文件
  • 提取 revisiondown_revision,验证链完整性
  • 支持旧格式(revision: str = "001")和新格式(revision = "038_error_retry"
  • 用数字前缀匹配,兼容纯数字编号和"数字_描述"两种命名
  • 检测项:断链、编号重复、编号不连续、多 baseline
  • 不依赖数据库,秒级完成

scripts/ci/run_validate.sh:在第8步 Alembic 迁移验证前增加 8.1 静态检查

效果

migration 编号错误从 Integration Tests 阶段(分钟级)提前到 Validate 阶段(秒级),反馈更快。

验证

本地 python3 scripts/ci/check_migration_chain.py 通过,47个版本链完整。

## 背景 最近多次出现 PR 的 migration 编号断链(down_revision 指向不存在的版本),导致 Integration Tests 全挂才发现问题,浪费 CI 资源和排查时间。 ## 方案 在 Validate 阶段增加 migration 编号连续性静态检查,不用等数据库迁移就秒级发现断链。 ## 新增 **scripts/ci/check_migration_chain.py**(175行): - 静态扫描 `alembic/versions/` 下所有 migration 文件 - 提取 `revision` 和 `down_revision`,验证链完整性 - 支持旧格式(`revision: str = "001"`)和新格式(`revision = "038_error_retry"`) - 用数字前缀匹配,兼容纯数字编号和"数字_描述"两种命名 - 检测项:断链、编号重复、编号不连续、多 baseline - 不依赖数据库,秒级完成 **scripts/ci/run_validate.sh**:在第8步 Alembic 迁移验证前增加 8.1 静态检查 ## 效果 migration 编号错误从 Integration Tests 阶段(分钟级)提前到 Validate 阶段(秒级),反馈更快。 ## 验证 本地 `python3 scripts/ci/check_migration_chain.py` 通过,47个版本链完整。

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #652 | | 预览链接 | [https://pr-652.preview.xiaoxiajianji.com](https://pr-652.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 3 commits 2026-07-20 20:09:56 +08:00
根因:后端EditPlanGenerationStatusResponse有error_message字段,
但前端GenerationStatusResponse和ClipStatusItem类型定义漏了,
导致Frontend Lint报TS2339错误。

修复:
- GenerationStatusResponse增加error_message?: string
- ClipStatusItem增加error_message?: string
- GeneratePage.tsx中防御性的error/message字段访问改用类型断言
新增 scripts/ci/check_migration_chain.py:
- 静态扫描 alembic/versions/ 下所有 migration 文件
- 提取 revision 和 down_revision,验证链的完整性
- 支持旧格式(带类型注解)和新格式(带描述后缀)
- 检测:断链、编号重复、编号不连续、多baseline
- 不依赖数据库,秒级完成,Validate阶段就能发现问题

之前多次出现PR的migration编号断链(down_revision指向不存在的版本),
导致Integration Tests全挂才发现。现在提前到Validate阶段就报错,
反馈更快,避免浪费CI资源。
fix(ci): auto-fix lint/format issues
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
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 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
AI Code Review / AI Code Review (pull_request) Successful in 2m17s
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
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m50s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 6s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 1m59s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m41s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 4m34s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 5m4s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 11m34s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 6m14s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m13s
ec85b90155
xiaoxia force-pushed feat/ci-migration-chain-validation from b05b777ae4 to ec85b90155 2026-07-20 20:09:56 +08:00 Compare
xiaoxia added 1 commit 2026-07-20 20:37:58 +08:00
fix(frontend): 移除重复的error_message类型定义
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 15s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m51s
AI Code Review / AI Code Review (pull_request) Successful in 2m28s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 3m36s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 7m2s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 7m39s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m23s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 8m48s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 32s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 6m41s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 8m32s
849ca2fc98
Collaborator

代码审查结果 - PR #652

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

💡 建议(1个可选)

  1. scripts/ci/check_migration_chain.py 第101行down_revision 为空字符串时的处理逻辑
    • 说明:当前逻辑中,如果 down_revision 被赋值为空字符串 ""if down 判断为假,导致 down_num 被置为 None。这会将空字符串误判为基线(baseline)。
    • 建议:虽然 Alembic 通常使用 None 或具体 ID,但为了更严格地校验,建议显式检查空字符串并报错,或者确认这是符合项目预期的行为。

格式检查通过 | 逻辑审查通过 | 性能良好


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

## 代码审查结果 - PR #652 ### ⚠️ 问题(0个需要修改) ### 💡 建议(1个可选) 1. **scripts/ci/check_migration_chain.py 第101行**:`down_revision` 为空字符串时的处理逻辑 - **说明**:当前逻辑中,如果 `down_revision` 被赋值为空字符串 `""`,`if down` 判断为假,导致 `down_num` 被置为 `None`。这会将空字符串误判为基线(baseline)。 - **建议**:虽然 Alembic 通常使用 `None` 或具体 ID,但为了更严格地校验,建议显式检查空字符串并报错,或者确认这是符合项目预期的行为。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-20 20:40:27 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-07-20 20:45:40 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 61dcd196fd into develop 2026-07-20 20:46:48 +08:00
auto-approve-bot deleted branch feat/ci-migration-chain-validation 2026-07-20 20:46:48 +08:00

🗑️ 预览环境已清理

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

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

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