执行摘要
- 一句话:CI 磁盘清理改为按空间条件触发
- 推荐动作:值得快速阅读,作为 CI 按需执行昂贵清理的典型示例。设计上先量化开销(80 秒删除约 1M 个文件)再引入条件化,思路清晰;后续可考虑把
df 解析包成可复用的 Action 或统一放到 prepare_runner.sh,并补充空值防御。
功能与动机
PR body 指出:ubuntu-latest 现在自带 145G 根盘(清理前约 65G 空闲),CPU 套件峰值约 30G,但每个 CPU job 仍花费约 80 秒删除约 1M 个预装文件。因此需要将删除操作的门槛设为可用空间低于 40G,正常路径零成本,镜像或套件占用变化时兜底逻辑仍能保证 job 安全。
实现拆解
变更入口:两个 GitHub Actions 工作流文件 _pr-test-stage-cpu.yml 与 rerun-test.yml 中的 Free disk space 步骤。
- 定位步骤:两个文件各自的
Free disk space 步骤原先无条件执行 sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc,用于给 CPU 测试套件腾出磁盘空间。
- 加入空间探测:在删除前执行
df --output=avail -BG /,通过 tail -1 取数据行、tr -dc '0-9' 提取可用 GB 数值,存入 avail_gb。
- 阈值判断:仅当
avail_gb < 40 时才执行删除;否则跳过,保留 df -h 输出当前磁盘状态。
- 改动影响:正常路径不再支付约 80 秒的删除开销;若镜像或套件占用变化导致空间不足,40G 阈值仍会触发清理,维持 job 安全。两个文件改动完全一致,保证主套件与重跑流程行为统一。
无测试或配置配套改动;工作流本身即部署对象。
关键文件:
.github/workflows/_pr-test-stage-cpu.yml(模块 工作流;类别 infra;类型 infrastructure): CPU 测试主套件的工作流,本 PR 的核心改动点之一,将无条件磁盘清理改为按可用空间条件触发。
.github/workflows/rerun-test.yml(模块 工作流;类别 infra;类型 infrastructure): 重跑测试的工作流,包含相同的磁盘清理步骤,一并修改以保持行为一致。
关键符号:未识别
关键源码片段
.github/workflows/_pr-test-stage-cpu.yml
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
评论区精华
该 PR 无实质 review 讨论。作者在 PR 内通过 /tag-and-rerun-ci 命令触发 CI 重跑,随后自行合并;唯一交互来自机器人 CI 状态检查(base 未通过、extra 失败),未涉及设计争论。
风险与影响
- 风险:风险点集中在 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 阈值需随演进跟进
关联脉络
- PR #33619 [CI] Speed up dependency install: dual-ABI Rust ext cache and prevalidation pruning: 同样聚焦 CI 提速,通过缓存与裁剪预校验避免重复开销;与本 PR 的磁盘清理条件化同属 CI 性能优化线。
- PR #33597 [CI] Extract
download-rust-ext and give every install step a cache fallback: 为 CI 安装步骤引入缓存回退,与本 PR 一样希望降低 job 固定开销,改动文件也都在 .github/workflows 下。
参与讨论