|
| 1 | +# GEM5 分层CI架构 (Tiered CI) |
| 2 | + |
| 3 | +解决当前CI在PR阶段运行过久、拖慢开发效率的问题。 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +## 📊 核心改进 |
| 8 | + |
| 9 | +| 阶段 | 之前 | 现在 | 改进 | |
| 10 | +|-----|------|------|------| |
| 11 | +| PR快速反馈 | 2-4小时 | **5-10分钟** | ⚡ 95%+ | |
| 12 | +| 按需性能测试 | 每个PR强制 | 需要时触发 | 🎯 按需 | |
| 13 | +| 完整测试 | 每个PR重复 | 只在合入后 | ✅ DRY | |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +## 层次一:PR快速检查 (Tier 1) ⚡ |
| 18 | + |
| 19 | +**文件**: `.github/workflows/pr-quick-check.yml` |
| 20 | + |
| 21 | +**目标**: 5-10分钟内给出快速反馈 |
| 22 | + |
| 23 | +**触发**: 每次 push 到 PR 分支 |
| 24 | + |
| 25 | +**内容**: |
| 26 | +- ✅ 编译 GEM5 opt 版本 |
| 27 | +- ✅ 单元测试 (Unit Tests) |
| 28 | +- ✅ 冒烟测试 (Difftest Check) |
| 29 | + |
| 30 | +**说明**: |
| 31 | +- 遵循 DRY 原则,这些测试不会在 Post-Merge 阶段重复运行 |
| 32 | +- 使用本地 DRAMSim3 缓存,避免网络IO |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +## 层次 1.5:按需性能测试 (Tier 1.5) 🎯 |
| 37 | + |
| 38 | +**文件**: `.github/workflows/on-demand-spec.yml` |
| 39 | + |
| 40 | +**目标**: 在合入前,按需检查有性能风险的 PR |
| 41 | + |
| 42 | +**触发**: 在 PR 评论中输入命令 |
| 43 | + |
| 44 | +### 支持的命令 |
| 45 | + |
| 46 | +```bash |
| 47 | +/run-spec # 默认:SPEC06 INT 80%覆盖率 (~500 checkpoints) |
| 48 | +/run-spec spec06-1.0c # SPEC06 100%覆盖率 |
| 49 | +/run-spec spec17-1.0c # SPEC17 100%覆盖率 |
| 50 | +/run-spec spec06-rvv-1.0c # SPEC06 RVV扩展 100% |
| 51 | +/run-spec spec06int-rvv-0.8c # SPEC06 INT RVV 80% |
| 52 | +``` |
| 53 | + |
| 54 | +### 权限控制 |
| 55 | + |
| 56 | +仅以下角色可触发:OWNER / MEMBER / COLLABORATOR |
| 57 | + |
| 58 | +### 性能结果 |
| 59 | + |
| 60 | +由现有的性能评论机器人 (`actions_gem5.py`) 自动处理: |
| 61 | +- 📊 与主分支性能对比 |
| 62 | +- 📊 与PR上一个commit对比 |
| 63 | +- �� 详细的性能指标表格 |
| 64 | + |
| 65 | +### 优势 |
| 66 | + |
| 67 | +- 只在需要时运行,节省资源 |
| 68 | +- 支持多种 benchmark 类型 |
| 69 | +- 添加新 benchmark 类型只需修改 template |
| 70 | + |
| 71 | +--- |
| 72 | + |
| 73 | +## 层次二:主线完整测试 (Tier 2) 🛡️ |
| 74 | + |
| 75 | +**目标**: 确保 `xs-dev` 分支永远健康、可发布 |
| 76 | + |
| 77 | +**触发**: PR 合入 `xs-dev` 分支后自动运行 |
| 78 | + |
| 79 | +### 包含的测试 Workflows |
| 80 | + |
| 81 | +#### 1. `gem5.yml` - 功能回归测试 |
| 82 | +8个并行 jobs(遵循DRY原则,排除已在 Tier 1 运行的测试) |
| 83 | + |
| 84 | +**已移除**(避免重复): |
| 85 | +- ~~`unit_tests`~~ → 在 `pr-quick-check.yml` |
| 86 | +- ~~`difftest_check`~~ → 在 `pr-quick-check.yml` |
| 87 | + |
| 88 | +#### 2. `gem5-perf.yml` - 标准性能测试 |
| 89 | +SPEC06 80%覆盖率性能基线 |
| 90 | + |
| 91 | +#### 3. `gem5-ideal-btb-perf.yml` - BTB性能测试 |
| 92 | +BTB 配置下的 SPEC06 性能测试 |
| 93 | + |
| 94 | +#### 4. 其他测试 |
| 95 | +- `gem5-vector.yml` - RVV 扩展测试 |
| 96 | +- `gem5-ideal-btb-perf-nosc.yml` - 无SC的BTB测试 |
| 97 | +- `gem5-ideal-btb-perf-weekly.yml` - 定时任务(每周四) |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +## 🔑 配套策略 |
| 102 | + |
| 103 | +### 1. "主线红了" 怎么办:立即回滚 (Revert) |
| 104 | + |
| 105 | +**原则**: 不允许主线 (`xs-dev`) 保持红色状态 |
| 106 | + |
| 107 | +**动作**: |
| 108 | +```bash |
| 109 | +git revert <merge-commit-sha> -m 1 |
| 110 | +git push origin xs-dev |
| 111 | +``` |
| 112 | +或者直接在github 网页端,找到已经被关闭的PR, 在最下方有revert 按钮,来直接revert 这个PR. |
| 113 | + |
| 114 | +**后续**: 原 PR 作者修复 Bug 后,重新提交新的 PR |
| 115 | + |
| 116 | +### 2. 合并策略:必须支持回滚 |
| 117 | + |
| 118 | +**推荐**: ✅ "Create a merge commit" |
| 119 | +- 保留 PR 完整提交历史 |
| 120 | +- 回滚简单 |
| 121 | + |
| 122 | +**禁用**: ❌ "Rebase and Merge" |
| 123 | +- 难以回滚 |
| 124 | +- 回滚操作危险 |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +## 📖 使用指南 |
| 129 | + |
| 130 | +### PR 作者 |
| 131 | + |
| 132 | +```bash |
| 133 | +# 场景1: 小改动(文档/注释) |
| 134 | +# 只需要通过 Tier 1 快速检查即可 |
| 135 | + |
| 136 | +# 场景2: 性能相关改动 |
| 137 | +/run-spec # 标准性能测试 |
| 138 | +/run-spec spec06-1.0c # 完整覆盖率测试 |
| 139 | + |
| 140 | +# 或者把当前分支改名为*-perf, 这样每次push 会自动运行v3 的性能。 |
| 141 | +``` |
| 142 | + |
| 143 | +### 维护者 |
| 144 | + |
| 145 | +1. 检查 Tier 1 快速检查结果 |
| 146 | +2. 对于性能敏感的 PR,评论 `/run-spec` |
| 147 | +3. 审查代码和性能影响 |
| 148 | +4. 合入后监控 Tier 2 测试 |
| 149 | +5. 如发现失败,立即回滚 |
| 150 | + |
| 151 | +--- |
| 152 | + |
| 153 | +## 🤖 性能评论机器人 |
| 154 | + |
| 155 | +**位置**: `https://github.com/OpenXiangShan/env-scripts/blob/main/github/actions_gem5.py` |
| 156 | + |
| 157 | +**运行**: |
| 158 | +```bash |
| 159 | +python actions_gem5.py --token <github-token> --always-on |
| 160 | + |
| 161 | +# 可以联系yanyue 来重新触发机器人 |
| 162 | +``` |
| 163 | + |
| 164 | +**兼容性**: 完全兼容新的分层 CI |
| 165 | + |
| 166 | +--- |
| 167 | + |
| 168 | +## 🎯 设计原则 |
| 169 | + |
| 170 | +- **DRY**: 测试不重复,配置单一来源 |
| 171 | +- **KISS**: 简化 workflow,最小化复杂度 |
| 172 | +- **Fail Fast**: PR 阶段快速发现问题 |
| 173 | +- **Separation of Concerns**: 快速检查 vs 完整验证 |
| 174 | + |
| 175 | +--- |
| 176 | + |
| 177 | +## 📚 相关文件 |
| 178 | + |
| 179 | +- `.github/workflows/pr-quick-check.yml` - Tier 1 |
| 180 | +- `.github/workflows/on-demand-spec.yml` - Tier 1.5 |
| 181 | +- `.github/workflows/gem5-perf-template.yml` - 性能测试模板 |
| 182 | +- `.github/workflows/gem5.yml` - Tier 2 功能测试 |
| 183 | +- `env-scripts/github/actions_gem5.py` - 性能评论机器人 |
| 184 | + |
| 185 | +--- |
| 186 | + |
| 187 | +## 💡 常见问题 |
| 188 | + |
| 189 | +**Q: 为什么 PR 不再自动运行性能测试?** |
| 190 | +A: 性能测试耗时长,会拖慢 PR 审查。现在改为按需触发,既节省资源,又保持灵活性。 |
| 191 | + |
| 192 | +**Q: 如何触发性能测试?** |
| 193 | +A: 在 PR 评论中输入 `/run-spec [可选benchmark类型]` |
| 194 | + |
| 195 | +**Q: 新增 benchmark 类型需要修改哪些文件?** |
| 196 | +A: 只需修改 `gem5-perf-template.yml` |
| 197 | + |
| 198 | +--- |
| 199 | + |
| 200 | +## 🎉 总结 |
| 201 | + |
| 202 | +分层 CI 架构核心价值: |
| 203 | + |
| 204 | +1. **开发效率提升 95%+**:PR 反馈从 2-4 小时降至 5-10 分钟 |
| 205 | +2. **资源优化**:性能测试按需运行 |
| 206 | +3. **灵活性**:支持多种 benchmark 类型 |
| 207 | +4. **主线稳定**:Post-Merge 完整测试确保质量 |
| 208 | +5. **易于维护**:集中管理配置,遵循 DRY 和 KISS 原则 |
| 209 | +6. **易于回滚**:保留 merge commit,回滚简单安全 |
0 commit comments