执行摘要
- 一句话:修复CI依赖安装脚本在Ubuntu 24.04上的包名兼容性问题,避免不必要的apt-get更新。
- 推荐动作:这是一个小而精的CI优化PR。虽然代码变更量小,但它解决了一个实际存在的、影响所有CI任务效率的痛点(尤其是在网络条件不佳的环境下)。对于关注CI/CD基础设施和构建效率的工程师,值得花几分钟精读。它展示了如何通过简单的脚本增强来提升大型项目工具链的健壮性。
功能与动机
根据PR body描述,问题的根源是:“On Ubuntu 24.04 images dpkg -l librdmacm1 never matches (the package is librdmacm1t64)”,这导致“every job runs apt-get update to install nothing; on runners with a slow apt proxy that costs 5+ minutes per job.”。修复旨在消除因包名变更导致的CI资源浪费和时间开销。
实现拆解
- 修改入口与核心逻辑调整:变更集中在一个文件
scripts/ci/cuda/ci_install_dependency.sh。核心变更是在现有的install_apt_packages函数之前,新增了一个辅助函数is_apt_package_installed。此函数接受一个包名作为输入,先尝试用原始包名($1)通过dpkg -l进行检查,如果失败(即命令返回非零退出码或输出中没有^ii匹配),则会自动尝试添加t64后缀的包名(${1}t64)再次检查。只要任一检查成功,即返回0(表示已安装),否则返回1。
- 替换检查逻辑:在
install_apt_packages函数中,原来的检查逻辑dpkg -l "$pkg" 2>/dev/null | grep -q "^ii"被替换为调用新函数is_apt_package_installed "$pkg"。这一改动使得MISSING_APT_PACKAGES数组的构建逻辑能够正确识别Ubuntu 24.04上带有t64后缀的包,从而避免了将已安装的包误判为缺失。
- 配套变更:本PR没有涉及测试文件、配置文件或部署脚本的修改。变更纯粹是为了提升现有CI脚本在特定系统环境下的正确性和鲁棒性。
关键文件:
scripts/ci/cuda/ci_install_dependency.sh(模块 CI脚本;类别 infra;类型 infrastructure;符号 is_apt_package_installed, install_apt_packages): 这是CI依赖安装的核心脚本,本PR的所有变更都集中于此。它控制着CI任务启动时软件环境的准备过程,其正确性和效率直接影响所有CI任务的耗时。
关键符号:is_apt_package_installed, install_apt_packages
关键源码片段
scripts/ci/cuda/ci_install_dependency.sh
这是CI依赖安装的核心脚本,本PR的所有变更都集中于此。它控制着CI任务启动时软件环境的准备过程,其正确性和效率直接影响所有CI任务的耗时。
# 新增的辅助函数,用于处理 Ubuntu 24.04 上 time64 库的包名变更问题。
# 在 Ubuntu 24.04 中,某些库(如 librdmacm1)被重命名为带 `t64` 后缀的形式。
# 标准 `dpkg -l` 无法通过 `Provides` 别名匹配到它们,导致检查失败。
# 此函数尝试检查原始包名和带 `t64` 后缀的包名,任一匹配即认为已安装。
is_apt_package_installed() {
local name
# Ubuntu 24.04 renamed time64 libraries (librdmacm1 -> librdmacm1t64);
# apt-get follows the Provides alias, dpkg -l does not.
for name in "$1" "${1}t64"; do
if dpkg -l "$name" 2>/dev/null | grep -q "^ii"; then
return 0
fi
done
return 1
}
# 在 install_apt_packages 函数内部,检查逻辑被替换为调用新函数。
# 原逻辑 : dpkg -l "$pkg" 2>/dev/null | grep -q "^ii" || MISSING_APT_PACKAGES+=("$pkg")
# 新逻辑 :
is_apt_package_installed "$pkg" || MISSING_APT_PACKAGES+=("$pkg")
评论区精华
本PR在提供的上下文中没有Review评论。提交历史显示了3次提交:初始实现、精简注释、以及与主分支的合并。这表明变更相对简单直接,可能在合并前已经过初步验证。
风险与影响
- 风险:风险极低。变更仅在一个CI辅助脚本中新增了一个幂等的检查函数,逻辑清晰(先检查原名,再检查
t64后缀)。它不会影响依赖安装的最终结果(该装的包依然会安装),只会影响apt-get update是否被调用。潜在的微小风险是如果未来Ubuntu包名再次变更,此函数可能无法覆盖,但这种情况罕见。
- 影响:影响范围集中在CI/CD流水线。对于所有运行在Ubuntu 24.04镜像上的CI任务,尤其是那些安装了
librdmacm1等time64库的任务,将直接收益:避免了无效的apt-get update,减少了每个任务数分钟的启动时间,提升了整体CI效率和资源利用率。对于使用旧版Ubuntu或不需要这些库的任务,无负面影响。
- 风险标记:CI健壮性提升
关联脉络
- PR #35313 [CPU] Update base image to Ubuntu 26.04: 同为CI基础设施维护PR,都涉及Ubuntu系统版本/镜像相关的调整。
- PR #37672 [CI] Install lmms-eval from PyPI, drop human-eval install, add clone token fallback: 同为CI脚本优化PR,旨在改进CI依赖安装的流程和可靠性。
- PR #37522 [CI] Re-enable GB300 jobs: 同为维护CI流水线健康性的PR,确保测试环境和任务的正常运行。
参与讨论