Pull Request已成功合入, 合并人@CANN-robot
(感谢 chenqi317 的贡献)变更摘要
本 PR 新增了一个 pre-push 本地编译门禁机制,通过 pre-commit 框架在 git push 时自动触发构建与单元测试检查,将 CI 质量门禁左移到开发者本地。核心是新增 scripts/ci/pre_push_build.sh 脚本,支持快速模式(根据变更文件路径智能识别 op_host/op_kernel/op_api/op_graph/arch35/experimental 等受影响模块,仅触发相关阶段)和完整模式(PRE_PUSH_FULL=1,直接调用 local_build.sh 复刻 CI 语义),同时在 .pre-commit-config.yaml 中注册了 pre-push-build hook。
主要改动
- 新增
scripts/ci/pre_push_build.sh脚本:实现 pre-push 门禁主逻辑,包含环境自检(CANN 检测、关键脚本校验)、变更文件计算(通过git merge-base与远程分支 diff)、四步变更识别(identify_changes函数按路径模式归类has_kernel/has_host/has_api/has_graph/has_arch35/md_only等标志位)、Pipeline Preview 概览输出,以及run_fast_mode和run_full_mode两种执行路径。 - 快速模式智能跳过策略:
run_fast_mode根据identify_changes识别的模块标志,仅触发相关阶段(如has_non_arch35_jit控制 JIT 打包、has_host控制 ophost UT),并在仅文档/配置/cmake/scripts 变更(md_only=true)或仅 experimental 变更时提前退出;arch35/op_kernel变更跳过 JIT 打包,由compile_ascend950_pkg.sh处理。 - CANN 环境未安装时的降级处理:检测
ASCEND_HOME_PATH、ASCEND_TOOLKIT_HOME、/usr/local/Ascend/ascend-toolkit/latest等路径下是否存在set_env.sh,未安装时输出红色高亮警告并直接退出,允许提交放行。 - 全流程日志与 UT 结果检查:
log_echo函数将所有输出同步写入终端和pre_push_build.log;check_ut_result和check_run_test_log对 UT 日志进行失败匹配(FAILED、errors、error:等关键词),失败时打印尾部错误并退出。 .pre-commit-config.yaml注册 pre-push hook:新增pre-push-buildhook 条目,entry指向bash scripts/ci/pre_push_build.sh,stages: [pre-push],pass_filenames: false,require_serial: true,与现有 pre-commit 检查无缝衔接,并注释说明了安装命令与旁路方式。


代码审查
审查总结
本 PR 新增 pre-push 本地编译门禁脚本及对应的 pre-commit 配置。共发现 8 个问题:
| 优先级 | 数量 | 说明 |
|---|---|---|
| P0 | 1 | .pre-commit-config.yaml 中 stages: [pre-push] 为无效值,导致 hook 永不被触发 |
| P2 | 4 | 四个管线管道(JIT 构建、ascend950 打包、experimental 打包×2)缺少 ${PIPESTATUS[0]} 退出码检查,构建/打包失败会被静默忽略 |
| P3 | 3 | 两处死代码(check_run_test_log 函数、kernel_ops 变量)及一处误导性注释(PRE_PUSH_FAST=1 变量不存在) |
变更文件审查确认:
.pre-commit-config.yaml:已审查,发现 2 个问题(1 P0 + 1 P3)scripts/ci/pre_push_build.sh:已审查,发现 6 个问题(4 P2 + 2 P3)
整体风险判断:P0 问题为阻断性缺陷——配置错误导致整个 pre-push 门禁功能完全失效,必须在上线前修复。4 个 P2 问题在快速模式下会导致构建/打包失败被静默吞掉,用户可能推送有问题的代码而不自知,建议在修复 P0 时一并处理。3 个 P3 为低风险清理项。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 1 |
| 🟡 建议 | 4 |
⛔ 需要修改


The MR can not be merged, because of CodeReview discussion not resolved
If you want to solve this problem, you can click here to do it in the FAQs.


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


本 PR 新增 pre-push 本地编译门禁脚本,将 CI 质量门禁左移到开发者本地,在
git push时自动触发构建与 UT 检查。改动原因
远程 CI 门禁失败导致开发往返成本高,开发者需要在本地反复调试后才能合入。通过 pre-push hook 在 push 前自动运行本地构建与 UT,提前发现问题,提升远程门禁成功率。
采取的方法
scripts/ci/pre_push_build.sh:pre-push hook 脚本,支持两种运行模式:PRE_PUSH_FULL=1):直接调用local_build.sh,100% 复刻 CI 门禁语义,适合合入前验证。.pre-commit-config.yaml注册 pre-push hook:通过 pre-commit 框架管理,与现有 pre-commit 检查无缝衔接。check_experimental_pkg.shcompile_ascend950_pkg.sh处理pre_push_build.log,包含 Pipeline Preview 概览和变更文件列表。关联的Issue
测试
matmul/mat_mul_v3/op_host/op_tiling/arch35/下文件,验证快速模式正确识别 arch35 变更,跳过 JIT 打包,触发 ascend950 pkg(force_jit)。op_host非 arch35 文件,验证 JIT 打包 + ophost UT 正确触发。.md文件,验证 md_only 早退逻辑生效,全部跳过。pre_push_build.log日志内容与终端输出一致,包含变更文件列表、模块识别、Pipeline Preview、各阶段命令与输出。文档更新
pre-commit.md:本地代码门禁使用指南(pre-commit + pre-push-build 合并文档),包含安装、环境前置条件、日常开发流程、跳过检查、运行模式、执行流程、典型场景、日志与报错排查、配置参数汇总、取消安装。类型标签
AI/Agent生成声明