已关闭
[Requirement|需求建议]: 新增三方件离线下载脚本 download_3rd_party.sh(SHA256 校验、缓存复用、按架构下载) #1086
ouyangcaike创建于  8 天前关闭于  7 天前
ouyangcaike成员
8 天前 创建

Background(背景信息)

本仓在离线/网络隔离环境编译时,需依赖 15 项三方件(cann/cmake 构建框架 master-061、hcomm_utils 预编译包、json、makeself、openssl、rdma-core,以及 UT/ST 所需的 abseil-cpp、boost、googletest、mockcpp、protobuf 及各补丁)。现状问题:

  1. 需按文档表格手动逐个下载依赖包再上传编译环境,下载地址分散,版本/文件名易错配;
  2. 下载文件无完整性校验,缓存损坏或被篡改无法发现,直接导致离线编译失败或引入安全风险;
  3. 补丁文件存放位置无统一约定,与 cann/cmake 构建框架(master-061)的查找路径(patch/、patch/device/)不匹配时离线编译失败;
  4. 无缓存复用机制,二次准备环境需重复下载全部大文件。

需求:提供一键式离线下载脚本,在联网环境一次拉齐全部三方依赖、完成 SHA256 完整性校验,上传后配合 --cann_3rd_lib_path 即可离线编译。

Origin(信息来源)

cann/runtime 仓已合入同类需求(PR #5411「离线下载增加三方件 sha256 校验 && 增加下载目录参数」),本需求为 hcomm 仓对齐该能力。

Benefit / Necessity (价值/作用)

  • 离线/隔离网络环境(企业内网、黄区流水线等)一键准备全部三方依赖,消除手工下载与版本错配;
  • 每个文件强制 SHA256 校验(哈希固定在脚本清单内,与 cann/cmake master-061 及本仓 cmake 声明值一致),保证离线包与构建系统期望逐字节一致,提升供应链安全;
  • 缓存复用:二次调用自动跳过已校验文件,仅重下损坏/过期项,支持增量更新;
  • 下载目录布局与 cann/cmake master-061 各组件缓存查找路径逐项对齐,离线编译开箱即用;hcomm_utils 按构建机架构自动选择 x86_64/aarch64 包;
  • 统一补丁管理(patch/ 目录);文档(docs/zh/build/build.md、docs/en/build/build.md)与公网地址声明表(SECURITY.md、SECURITY_en.md)同步更新,地址经 gitcode/OBS 双源下载哈希比对验证。

Design(设计方案)

总体思路:仓库根目录新增 Bash 脚本,集中维护「URL + SHA256 + 存放路径」三元组下载清单,逐项下载并校验,目录布局与构建系统缓存查找路径对齐。

参数解析:  --3rd_party <dir> | --3rd_party=<dir> | -h|--help
默认目录:  <脚本所在仓根>/third_party(与 build.sh 的 CANN_3RD_LIB_PATH 默认值一致)
严格模式:  set -euo pipefail;启动前检查 wget/sha256sum 可用性

架构检测:  case uname -m
             x86_64  -> cann-hcomm-utils_9.2.0_linux-x86_64.tar.gz  (sha256 f2c6f5e8…)
             aarch64 -> cann-hcomm-utils_9.2.0_linux-aarch64.tar.gz (sha256 f33f9bc5…)
             *       -> 报错退出

下载清单 DOWNLOAD_LIST = [ "URL SHA256 相对路径", ... ]   # 共 15 项(11 个包 + 4 个补丁)
  - 三方库源码/二进制包平铺存放于 CANN_3RD_LIB_PATH 根下
  - 所有补丁统一存放于 CANN_3RD_LIB_PATH/patch/

主循环:
  for item in DOWNLOAD_LIST:
      if 已存在 && check_sha256(期望哈希, 文件):   跳过             # 缓存复用
      elif 已存在 && 校验失败:                     删除缓存重新下载
      wget 下载至临时文件 <file>.part.XXXXXX
        失败时降级 --no-check-certificate 重试      # 企业网关自签证书场景,
                                                    # 完整性仍由 SHA256 保证
      check_sha256(临时文件) 通过后 mv 原子替换
      trap EXIT/INT/TERM 清理残留临时文件

收尾:  rdma-core、abseil-cpp 补丁复制到 patch/device/   # Device 侧离线构建查找路径

配套适配:
  - cmake/third_party/mockcpp.cmake: 补丁查找优先 patch/ 子目录,回退根目录(兼容存量缓存)
  - docs/zh/build/build.md、docs/en/build/build.md: 离线编译章节改为脚本用法说明,附录补 NOTE
  - SECURITY.md、SECURITY_en.md: 公网地址声明表修正过时版本路径(域名不变,双源哈希已验证一致)
likedislike
Oouyangcaike成员
8 天前 添加了label:requirement
Oouyangcaike成员
8 天前 修改了issue 的描述
LLeewis成员
8 天前 将 ouyangcaike 设为负责人
LLeewis成员
8 天前 issue类型由 任务 改变为 需求
Leewis成员
8 天前 评论:

📋 Issue 分析报告

判定结果: ✅ 确认为有效问题

问题类型: feature-request
分类审视: 标题模板选择正确,与问题类型一致;Issue 类型已修正为「需求」
严重程度: medium
置信度: 90%

📋 问题摘要

仓库缺少统一的三方件离线下载脚本,无法一键下载、SHA256校验和缓存复用三方依赖

🔍 根因分析

这是一个功能缺失问题,而非代码 Bug。当前仓库现状如下:

  1. 无统一下载脚本:仓库根目录不存在 download_3rd_party.sh 或类似脚本。SECURITY.md 和 SECURITY_en.md 中仅以表格形式声明了 9 项三方件的公网下载 URL(makeself、json、openssl、googletest、mockcpp、protobuf、rdma-core 及 rdma-core-patch),但未提供任何自动化下载机制,用户需手动逐个下载。

  2. 无 SHA256 完整性校验:SECURITY.md 中的公网地址声明表仅列出 URL,未包含任何 SHA256 哈希值。Third_Party_Open_Source_Software_List.yaml 列出了 10 项三方件(abseil-cpp、boost、googletest、json、libboundscheck、makeself、mockcpp、openssl、protobuf、rdma-core)的版本和类型(build/test),但同样无哈希校验信息。下载文件损坏或被篡改时无法发现。

  3. 无缓存复用机制:现有代码中不存在任何缓存检查逻辑。experimental/cluster_link_diag/scripts/setup_third_party.py 中虽有 component_installed() 函数检查文件是否存在,但该脚本服务于 cluster_link_diag 子项目,使用 git clone + cmake 编译方式,与主仓 hcomm 的三方件下载需求(wget 下载预编译包/源码包)完全不同。

  4. 无架构自动检测:Issue 提到 hcomm_utils 需按 x86_64/aarch64 架构选择不同预编译包,但当前代码中无任何架构检测逻辑。

  5. 补丁文件路径无统一约定:SECURITY.md 中 mockcpp 补丁和 rdma-core 补丁的存放路径未明确约定与 cann/cmake master-061 查找路径(patch/、patch/device/)的对齐关系。

综上,该 Issue 描述的功能缺失真实存在,需求合理且设计详尽。

📁 涉及的文件/模块

  • SECURITY.md
  • SECURITY_en.md
  • Third_Party_Open_Source_Software_List.yaml

💡 建议的修复方案

按 Issue 设计方案实现:

  1. 在仓库根目录新增 download_3rd_party.sh 脚本,内置 15 项三方件的「URL + SHA256 + 存放路径」下载清单,支持 --3rd_party <dir> 参数,默认目录为 <仓根>/third_party;
  2. 脚本主循环实现:缓存命中且 SHA256 校验通过则跳过、校验失败则删除重下、wget 下载至临时文件后原子 mv 替换、trap 清理临时文件;
  3. 添加 uname -m 架构检测,为 hcomm_utils 选择 x86_64/aarch64 预编译包;
  4. 收尾阶段将 rdma-core、abseil-cpp 补丁复制到 patch/device/ 目录;
  5. 同步更新 SECURITY.md、SECURITY_en.md 公网地址声明表(补充缺失项及修正版本路径);
  6. 更新 docs/zh/build/build.md、docs/en/build/build.md 离线编译章节为脚本用法说明;
  7. 适配 cmake/third_party/mockcpp.cmake,补丁查找优先 patch/ 子目录并回退根目录以兼容存量缓存。

⚠️ 风险提示

  1. SHA256 哈希值需与 cann/cmake master-061 构建系统声明值严格一致,若版本升级时遗漏同步将导致校验失败;
  2. --no-check-certificate 降级重试虽由 SHA256 保证完整性,但在严格安全策略环境下可能被审计标记;
  3. 新增脚本增加了维护成本,三方件版本变更时需同步更新脚本清单、SECURITY.md 和 Third_Party_Open_Source_Software_List.yaml 三处;
  4. 补丁查找路径回退逻辑(patch/ 优先、根目录回退)需确保不引入路径歧义。

👤 责任人与责任田分配

责任人(关联 PR 作者): @ouyangcaike(已关联 PR #6180,直接指定)

(未匹配到责任田) → @Leewis

  • SECURITY.md
  • SECURITY_en.md
  • Third_Party_Open_Source_Software_List.yaml

待确认负责人: @ouyangcaike


⏳ 等待人工确认

请以上负责人确认此问题:

  • 确认有效 → 评论 /label add confirmed 添加确认标签,并回复问题闭环计划(修复方案、计划完成时间/目标版本)
  • 如非有效问题 → 回复说明理由(供 Issue 提出人参考),并关闭 Issue

本回复为 AI 结合源码深度分析生成,将同步对应责任田团队进行二次确认。

likedislike
LLeewis成员
8 天前 添加了label:pending-confirmation
Leewis成员
8 天前 评论:

/assign @ouyangcaike

likedislike
CANN-robotCANN-robot成员
7 天前 关闭了 issue
ouyangcaike成员
7 天前 评论:

/label add confirmed 1012/master

likedislike
CANN-robot
CANN-robot成员
7 天前 评论:

Label Command Feedback

The repository doesn't have the label(s) 1012/master, it cannot be added!

likedislike
CANN-robotCANN-robot成员
7 天前 添加了label:confirmed
CANN-robotCANN-robot成员
7 天前 添加了label:resolved