Prhub

#33644 [CI] Free hosted-runner disk space only when it is low

原始 PR 作者 hnyls2002 合并时间 2026-08-05 12:55 文件变更 2 提交数 1 评论 1 代码增减 +12 / -2

执行摘要

CI 磁盘清理改为按空间条件触发

PR body 指出:ubuntu-latest 现在自带 145G 根盘(清理前约 65G 空闲),CPU 套件峰值约 30G,但每个 CPU job 仍花费约 80 秒删除约 1M 个预装文件。因此需要将删除操作的门槛设为可用空间低于 40G,正常路径零成本,镜像或套件占用变化时兜底逻辑仍能保证 job 安全。

值得快速阅读,作为 CI 按需执行昂贵清理的典型示例。设计上先量化开销(80 秒删除约 1M 个文件)再引入条件化,思路清晰;后续可考虑把 df 解析包成可复用的 Action 或统一放到 prepare_runner.sh,并补充空值防御。

讨论亮点

该 PR 无实质 review 讨论。作者在 PR 内通过 /tag-and-rerun-ci 命令触发 CI 重跑,随后自行合并;唯一交互来自机器人 CI 状态检查(base 未通过、extra 失败),未涉及设计争论。

实现拆解

变更入口:两个 GitHub Actions 工作流文件 _pr-test-stage-cpu.ymlrerun-test.yml 中的 Free disk space 步骤。

  1. 定位步骤:两个文件各自的 Free disk space 步骤原先无条件执行 sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc,用于给 CPU 测试套件腾出磁盘空间。
  2. 加入空间探测:在删除前执行 df --output=avail -BG /,通过 tail -1 取数据行、tr -dc '0-9' 提取可用 GB 数值,存入 avail_gb
  3. 阈值判断:仅当 avail_gb < 40 时才执行删除;否则跳过,保留 df -h 输出当前磁盘状态。
  4. 改动影响:正常路径不再支付约 80 秒的删除开销;若镜像或套件占用变化导致空间不足,40G 阈值仍会触发清理,维持 job 安全。两个文件改动完全一致,保证主套件与重跑流程行为统一。
    无测试或配置配套改动;工作流本身即部署对象。
文件 模块 状态 重要度
.github/workflows/_pr-test-stage-cpu.yml 工作流 modified 3.86
.github/workflows/rerun-test.yml 工作流 modified 3.46

关键源码片段

.github/workflows/_pr-test-stage-cpu.yml infrastructure

CPU 测试主套件的工作流,本 PR 的核心改动点之一,将无条件磁盘清理改为按可用空间条件触发。

# 步骤:按需释放磁盘空间
# 背景:ubuntu-latest 镜像自带约 65G 可用空间,CPU 套件峰值约 30G,
# 但预装文件约 100 万个,无条件删除需约 80 秒,因此只在空间低时执行。
- name: Free disk space
  run: |
    # 用 df 取根分区可用空间(GB),并剥离非数字字符得到纯数字
    avail_gb=$(df --output=avail -BG / | tail -1 | tr -dc '0-9')
    if [ "${avail_gb}" -lt 40 ]; then
      # 低于 40G 才删除大目录,保证测试有足够空间
      sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
    fi
    # 始终打印磁盘状态,便于 CI 日志排查
    df -h

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险点集中在 shell 探测逻辑:

  • df --output=avail 是 GNU coreutils 扩展,当前仅适用于 Ubuntu runner;若工作流被复用到 macOS 或 Windows runner 会直接失败。
  • tr -dc '0-9' 依赖数字为 ASCII,若 locale 不同或输出异常,avail_gb 可能为空,此时 [ "${avail_gb}" -lt 40 ] 会报整数表达式错误,在 set -e 下可能导致步骤失败;当前 GitHub hosted 环境实测正常,但缺少空值保护。
  • 40G 阈值大于 CPU 套件峰值(30G),但当镜像预装文件减少或套件增长到 40G 以上时,该阈值需要人工演进;好在低于阈值仍会兜底清理。
  • 本 PR 不触及任何运行时代码,不影响推理、调度等核心路径。

影响范围限定在 GitHub Actions CI:

  • 所有 CPU 测试 job(_pr-test-stage-cpu.yml)与重跑 job(rerun-test.yml)在磁盘充足时跳过删除,每个 job 平均节省约 80 秒。
  • 低磁盘场景仍保留原有删除行为,与旧逻辑一致。
  • 对用户无感知,对团队收益是 CI 反馈速度提升;对系统无新增依赖。
依赖 df 输出解析 空值缺乏防御 40G 阈值需随演进跟进

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论