操作
機能 #374
完了CI: ブランチ別キャッシュ堆積によるランナーディスク枯渇の恒久対処
機能 #374:
CI: ブランチ別キャッシュ堆積によるランナーディスク枯渇の恒久対処
説明
背景¶
#355 (MR !17) の CI で test ジョブが15分以上「Compiling ferrhythm-audio」で停止し、no space left on device で job system failure。調査の結果、原因はコードではなく CI キャッシュがブランチ別キー(.gitlab-ci.yml の cache.key: "...-$CI_COMMIT_REF_SLUG")で堆積し、GitLab docker executor の孤児ボリュームが 69個 / 113.3GB まで膨張してランナーホスト(共有・他リポと兼用)のディスクを枯渇させたこと。clippy は解析のみ(65秒)で通るが、cargo test はフルコード生成+リンクを通常+--all-features の2回行い target/(≒2.5GB) を生成・保存するため、満杯近いホストを押し切った。
暫定対処(対応済み)¶
- 孤児ボリュームを手動回収(
docker volume prune等、ディスク使用率を14%へ回復)。 - VPS に安全な定期回収 cron を設置:
/usr/local/sbin/docker-gc.sh(#!/bin/sh・set -eu)+/etc/cron.d/docker-gc(6時間ごと)。7日以内のイメージ/ビルドキャッシュは温存、ディスク使用率70%超のときだけdocker volume pruneを発動。稼働中の redmine/postgres/uptime-kuma は全てバインドマウント(/home/izuna/...)のため prune 対象外=データ不可侵。
恒久対処(本チケットのスコープ)¶
発生源を .gitlab-ci.yml / workspace 設定で断つ:
-
キャッシュキーをブランチ別→共有化。
cache.key.files: [Cargo.lock](必要ならCargo.tomlも)+fallback_keysで develop のキャッシュを継承。ブランチ毎の新規キャッシュ生成を抑制しウォームスタート化(毎回コールド全ビルドの解消)。 -
target/の圧縮。ルートCargo.tomlの[profile.dev]/[profile.test]にdebug = "line-tables-only"(or0)を追加。テストバイナリ18〜27MB×2の主因=デバッグ情報を削減しtarget/を大幅縮小。 -
(任意)2パス/ピーク資源の見直し。test ジョブの
cargo test --workspace(通常)+--all-featuresの二重ビルドについて、target/キャッシュのpolicy: pull化やCARGO_BUILD_JOBSでピークメモリ/ディスクを抑制。
検証¶
- MR パイプラインで fmt/clippy/test が緑、かつキャッシュ再利用でビルド時間が短縮されること(コールド→ウォーム)。
- 連続 MR でランナーのボリューム/ディスクが再膨張しないこと(cron と併せて二重防御)。
担当¶
CI 設定変更(.gitlab-ci.yml + ルート Cargo.toml の profile 追記)。Codex 委譲可(source-only)。
参考¶
親フェーズ無し(CI 基盤の保守)。#355 とは独立。
操作