Prhub

#24801 [CI][NPU] use internal HTTP cache for Rust toolchain via RUSTUP_CACHE

原始 PR 作者 Goalina 合并时间 2026-05-13 14:58 文件变更 2 提交数 3 评论 3 代码增减 +94 / -86

执行摘要

NPU CI 启用内部 HTTP 缓存加速 Rust 工具链安装

作为 #23514 的后续,NPU CI 所在的 aarch64 runner 依赖 Rust 工具链,原有 rsproxy.cn 镜像虽快但不在团队直接控制下。集群内已有用于 PyPI 等的 nginx 缓存,将其用于 rustup 可复用基础设施、减少外部依赖并加速安装。

值得读者关注 install_rustup.sh 中的条件分支模式,它展示了如何优雅地支持缓存优先安装策略,并注意 GITHUB_PATH 这类 CI 环境的边界问题。

讨论亮点

gemini-code-assist[bot] 指出原版改动移除了 GITHUB_PATH 更新逻辑,会导致后续 GitHub Actions 步骤找不到 cargo/rustc,另外缓存分支额外加了 --default-toolchain stable 造成不一致。Goalina 随后修复:将 GITHUB_PATH 导出移到脚本顶部,并统一移除 --default-toolchain 标志。

实现拆解

  1. 修改 CI 工作流 (pr-test-npu.yml):在所有 NPU job 中,将原先分别设置的 RUSTUP_DIST_SERVERRUSTUP_UPDATE_ROOT 替换为一个统一的环境变量 RUSTUP_CACHE_URL=http://cache-service.nginx-pypi-cache.svc.cluster.local:8082
  2. 重写安装脚本 (install_rustup.sh):脚本先导出 CARGO_HOME/binGITHUB_PATH 以保证后续步骤能找到 Rust 二进制。随后根据是否设置 RUSTUP_CACHE_URL 决定安装方式:若设定了,则从缓存 URL 构建 Rustup Dist Server,手动下载对应架构的 rustup-init 并执行安装;否则回退到官方 curl 安装方式。两个分支均移除了 --default-toolchain stable 标志以避免不一致。
文件 模块 状态 重要度
.github/workflows/pr-test-npu.yml CI 工作流 modified 5.28
scripts/ci/utils/install_rustup.sh 安装脚本 modified 4.37

关键源码片段

scripts/ci/utils/install_rustup.sh infrastructure

安装脚本,包含条件分支实现缓存优先安装,并修复了 GITHUB_PATH 导出问题。

# 确保 cargo/rustc 在后续步骤中可见
export PATH="${CARGO_HOME:-$HOME/.cargo}/bin:${PATH}"
if [ -n "${GITHUB_PATH:-}" ]; then
  echo "${CARGO_HOME:-$HOME/.cargo}/bin" >> "${GITHUB_PATH}"
fi# 如果设置了 RUSTUP_CACHE_URL(NPU CI 使用内部缓存),则从缓存下载
if [ -n "${RUSTUP_CACHE_URL:-}" ]; then
  export RUSTUP_DIST_SERVER="${RUSTUP_CACHE_URL}/rustup"
  export RUSTUP_UPDATE_ROOT="${RUSTUP_CACHE_URL}/rustup/rustup"
  # 检测架构并下载对应的 rustup-init
  case "$(uname -m)" in
    x86_64) RUSTUP_ARCH="x86_64-unknown-linux-gnu" ;;
    aarch64) RUSTUP_ARCH="aarch64-unknown-linux-gnu" ;;
    *) echo "ERROR: unsupported arch $(uname -m)"; exit 1 ;;
  esac
  RUSTUP_TMP="$(mktemp -d)"
  trap 'rm -rf "${RUSTUP_TMP}"' EXIT
  curl --retry 3 --retry-delay 2 -sSfL \
    "${RUSTUP_UPDATE_ROOT}/dist/${RUSTUP_ARCH}/rustup-init" \
    -o "${RUSTUP_TMP}/rustup-init"
  chmod +x "${RUSTUP_TMP}/rustup-init"
  "${RUSTUP_TMP}/rustup-init" -y --no-modify-path
else
  # 回退到官方安装脚本
  curl --proto '=https' --tlsv1.2 --retry 3 --retry-delay 2 -sSf https://sh.rustup.rs \
    | sh -s -- -y --no-modify-path
fi

评论区精华

GITHUB_PATH 回归与 --default-toolchain 一致性 正确性

gemini-code-assist[bot] 指出移除了 GITHUB_PATH 更新会导致后续步骤找不到 cargo/rustc,同时缓存分支额外添加了 --default-toolchain stable 造成不一致。Goalina 回复已修复:将 GITHUB_PATH 导出移到脚本顶部,并同步移除 --default-toolchain 标志。

结论:修复完成,两个分支现在行为一致且 GITHUB_PATH 正确设置。 · 已解决

风险与影响

变更仅影响 NPU CI 环境中的 Rust 安装路径。主要风险是新的内部缓存服务不可用时安装可能失败,但脚本保留了未设置 RUSTUP_CACHE_URL 时的 fallback 至官方源。已在 review 中修复了 GITHUB_PATH 回归问题,当前版本无已知回归。

仅对 NPU CI 的 Rust 工具链安装环节生效,安装速度预期更快且更稳定(依赖内部基础设施而非公共镜像)。不影响其他 CI 或用户功能。

仅影响 NPU CI 环境 回归风险已修复

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论