Pull Request已成功合入, 合并人@CANN-robot
(感谢 sinat_31531339 的贡献)变更摘要
此 PR 修复了切换分支编译时闭源二进制包(bundle)始终固定拉取 master 分支包的问题(Issue #169)。核心改动是将 OAM_BUNDLE_BRANCH 从硬编码的 "master" 改为三级决策机制:显式指定 > git 探测 > master 兜底。build.sh 新增 --bundle_branch 参数供显式指定;install_bundle.cmake 新增 oam_resolve_bundle_branch() 函数,在未显式指定时通过对比 HEAD 相对各候选发布分支(origin/master、origin/9.1.0-beta.2)的领先提交数自动选择血缘最近者,并增加白名单硬校验防止下载不存在的包。
主要改动
-
build.sh新增--bundle_branch参数:在getopt长选项列表中加入bundle_branch:,解析后存入BUNDLE_BRANCH变量,并在build_oam_tools()中仅当用户显式提供该参数时透传-DOAM_BUNDLE_BRANCH给 CMake,未提供则不传,由 CMake 配置期自行探测。 -
install_bundle.cmake移除硬编码分支并新增三级决策函数oam_resolve_bundle_branch():删除原有的set(OAM_BUNDLE_BRANCH "master"),新增该函数实现显式指定优先、git 探测次之、master 兜底的逻辑。git 探测部分对OAM_BUNDLE_REF_CANDIDATES列表中的每个候选 ref 计算rev-list --count <ref>..HEAD,取领先提交数最小者作为最近血缘分支,并将origin/9.1.0-beta.2映射为 OBS 路径名9.1.0。 -
新增白名单硬校验防止下载不存在的包:定义
OAM_BUNDLE_KNOWN_BRANCHES白名单("master"、"9.1.0"),在oam_resolve_bundle_branch()执行后检查最终分支是否在白名单内,若不在则以FATAL_ERROR立即终止配置阶段,避免拼出无效 URL 后下载 403 空包、将失败推迟到install阶段难以定位。 -
新增
OAM_BUNDLE_REF_CANDIDATES候选映射与白名单配置项:以"origin/ref=mapped_name"格式定义候选发布分支列表,支持 ref 不存在时自动跳过;代码注释中标注了维护点——新增 release 线时需同步更新此列表和OAM_BUNDLE_KNOWN_BRANCHES白名单。


代码审查
审查总结
已完成对全部 3 个变更文件的审查:
| 文件 | 结果 |
|---|---|
README.md |
无问题 — 文档新增内容准确描述了 bundle 分支解析行为,无安全隐患 |
build.sh |
1 个 P3 建议:BUNDLE_BRANCH 未做 shell 安全校验即拼入 cmake 参数 |
cmake/install_bundle.cmake |
1 个 P2 问题:白名单错误提示消息格式含 shell 重定向字符,易误导用户 |
- P0:0 个
- P1:0 个
- P2:1 个(错误提示消息格式问题)
- P3:1 个(可选:shell 参数校验增强)
总体风险判断:低。核心逻辑(分支三级决策、git 探测算法、CMake PARENT_SCOPE 作用域、白名单硬校验)经过分析均正确,未发现会导致编译失败或拉取错误包的功能缺陷。README.md 文档补充准确。唯一需要关注的是错误提示消息的格式问题(P2),建议在合并前修正以免用户在排错时被误导。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


/lgtm


/approve


描述
修复切换分支编译时闭源二进制包(bundle)始终固定拉取
master分支包的问题。OAM_BUNDLE_BRANCH由硬编码master改为三级决策:显式指定 > git 探测 > master 兜底,并对结果做白名单硬校验(OBS 上无对应包的分支在配置阶段即报错,而非下载到 403 空包后把失败推迟到install阶段)。取包的三条入口(已就绪的
bundle/目录、本地预置 tar、OBS 下载)都要核对分支——只修下载路径不够,因为切分支后最常走的恰恰是前两条。主要改动
build.sh新增--bundle_branch=<NAME>:解析后存入BUNDLE_BRANCH,仅在用户显式指定时透传-DOAM_BUNDLE_BRANCH给 CMake;不传则由 CMake 配置期自行探测。取值做字符白名单校验([A-Za-z0-9._/-]),拒绝含空格或 shell 元字符的分支名。BUNDLE_BRANCH在checkopts()解析选项前显式清空,避免环境里的同名变量被当成"用户显式指定"——那样既盖掉自动探测,又绕过上述字符校验(校验只在--bundle_branch分支里跑)。cmake/install_bundle.cmake新增oam_resolve_bundle_branch():实现三级决策。git 探测按模式枚举远端发布线分支(git for-each-ref refs/remotes+ 正则^[0-9]+\.[0-9]+\.[0-9]+(-beta\.[0-9]+)?$),去掉-beta.N后缀归一化为 OBS 路径名(9.1.0-beta.3→9.1.0),取领先提交数最小者(血缘最近)。不硬编码任何具体 ref——同一发布线并存9.1.0、9.1.0-beta.1/2/3等多个分支,硬编码任一个都会让其余分支探测不到而静默回退 master。不限定origin,fork 场景下发布线常只在upstream。已就绪的
bundle/目录也校验分支:bundle/非空即跳过下载,是切分支后最常命中的路径;不校验就会静默复用上一条线的闭源包(连显式--bundle_branch也无效)。取包成功后在bundle/.bundle_branch落分支元数据(解压产物本身不含分支信息),复用前读取比对,不一致则FATAL_ERROR并提示--make_clean刷新或--bundle_branch=<现有分支>沿用现包。本改动之前拉下的 bundle 无元数据,降级为告警而非报错,避免既有工作目录必须先重下闭源包才能构建。离线预置包按分支校验:预置包文件名不含分支信息(各分支同名),命中后直接复用会静默混入其它分支的闭源包。
cmake/download_libs.py下载后在包旁写<tar>.branch元数据;install_bundle.cmake命中预置包时读取并与目标分支比对,不一致则配置阶段FATAL_ERROR。无元数据的既有包按旧约定放行并告警。cmake/download_libs.py支持--bundle_branch,且元数据只反映本轮实际结果:分支解析规则与白名单与install_bundle.cmake完全一致,使联网机器预置与离线机器联编两端对齐。元数据只写本轮确实下载成功的 tar(原先按"文件是否存在"写,会把目录里残留的旧分支包贴上本轮标签,联编时反而错误校验通过——比没有元数据更糟);本轮未取到的包会清掉其陈旧元数据,让联编侧如实走"无元数据"告警分支;bundle 一个都没取到时以非零码退出;wget -O失败时删除残留的半截文件,避免被后续误当作可用预置包。中英文档同步:
README.md/docs/zh/quick_install.md与README_en.md/docs/en/quick_install.md四处改动一一对应,均说明按分支拉取规则、--bundle_branch用法、离线预置须与联编分支一致,闭源包表格表头由「版本」改为「分支」。新增测试
test/ut/asys/testcase/common/test_bundle_branch.py:32 条用例。cmake 部分不做字符串匹配,而是在临时 git 仓/预置的 bundle 目录里真正跑 cmake 求值,覆盖:显式指定优先、9.1.0 线各分支(参数化 4 个)、master 探测、ref 均不存在回退、git 不可用回退、非 origin remote、OBS 无包发布线被忽略、已有 bundle 分支一致则复用 / 不一致则报错 / 无元数据则告警、预置包分支校验、元数据只给本轮下载成功者、两端白名单同步。变更类型
请选择本次引入的变更类型(勾选对应项):
关联的Issue
关联 Issue #169
如何测试
# 1) 自动探测(不传参数):从 9.1.0 线分支编译应拉 9.1.0 包,从 master 拉 master 包 bash build.sh # 2) 显式指定 bash build.sh --bundle_branch=9.1.0 # 3) 非法分支应在配置阶段报错并提示可用取值 bash build.sh --bundle_branch=nonexistent # 4) 非法字符应被入口校验拒绝 bash build.sh --bundle_branch='bad name' # 5) 切分支场景:master 构建后切到 9.1.0 直接构建,应报错提示 --make_clean 而非静默复用 bash build.sh # 在 master 上 git checkout 9.1.0-beta.3 bash build.sh # 应因 bundle/ 分支不符而报错 # 6) 离线预置两端一致 python cmake/download_libs.py --bundle_branch=9.1.0 bash build.sh --cann_3rd_lib_path=<预置目录> --bundle_branch=9.1.0 # 7) 单元测试 python3 -m pytest test/ut/asys/testcase/common/test_bundle_branch.py -v本地验证:
test/ut/asys/全量 536 passed。test/ut/asys/+test/ut/msaicerr/合计 1155 passed / 15 skipped,唯一失败test_compile_op_ascend950.py::test_get_ub_size_not_tbe为存量失败——把本 PR 全部改动 stash 后该用例同样失败,与本改动无关。cmake/download_libs.py与新增测试跑过增量 codecheck 规则(E501/T201/S607/PLR0915/PLR6301/PLR1722),无告警。UT_Test。核对清单
其他信息
历轮评审共修复了六个实际缺陷:
-DOAM_BUNDLE_BRANCH=\"${BUNDLE_BRANCH}\"的转义引号在cmake ${cmake_args} ..非引号展开时作为字面量传入 CMake,白名单比对必然失配,--bundle_branch功能不可用(jinyingqi 指出,已实测复现)。origin/9.1.0-beta.2漏掉同一发布线的其它分支,从9.1.0/beta.1/beta.3编译都会静默回退 master(newstarzj 指出方向)。--format=%(refname:short)未加引号时括号被当作参数分隔符,git 只输出%,探测全部失效(新增测试时发现)。bundle/非空即 return,完全跳过分支解析与校验——切分支后最常走这条路径,旧闭源包被静默复用,PR 修复目标在主场景下失效(jinyingqi 指出)。BUNDLE_BRANCH未在checkopts()初始化,环境变量可绕过字符校验并覆盖自动探测(jinyingqi 指出)。