GitHub Actions: Blacksmith の sticky disk に Nix store を置いて CI を速くする
Blacksmith のランナーでは useblacksmith/stickydisk で /nix をジョブ間で使い回せる。@ryoppippi さんの ccusage では Linux x86 のジョブが3分から14秒になった。
仕組み
sticky disk は、キーごとに前回のスナップショットを複製してランナーにマウントし、ジョブが終わると保存し直すディスク。actions/cache のようにアーカイブを毎回ダウンロード・展開しないので、Nix store のような数 GB の中身でもすぐ使える(公式の比較では 6GB で約3秒)。
yaml
jobs:
build:
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v6
- run: sudo mkdir -p /nix/store && sudo chmod -R 777 /nix
- uses: useblacksmith/stickydisk@v1
with:
key: ${{ github.repository }}-nix-${{ runner.os }}-${{ runner.arch }}-${{ github.job }}
path: /nix
- uses: nixbuild/nix-quick-install-action@v30
- run: nix buildコツ
- キーはジョブごとに分ける(
github.jobを含める)。ccusage では最初、同じアーキテクチャの全ジョブでキーを共有していた。開発シェル全体を作るジョブとnix buildだけのジョブが互いの store を上書きし、毎回 cache.nixos.org から取り直して実行時間が 149秒〜388秒とばらついた。 - 読むだけのジョブは
commit: "false"、変化があったときだけ保存するならcommit: "on-change"にできる。 - Nix 以外でも
~/.npmやnode_modulesなど大きなキャッシュに使える。
注意点
- Blacksmith(有料のサードパーティ製ランナー)専用。 GitHub ホストのランナーでは動かない。
uses:はタグではなく SHA か lockfile で固定する(GitHub Actions: ワークフローの依存を lockfile(actions.lock)で固定する)。- 1ジョブで使える sticky disk の数には上限がある(ドキュメントで確認)。
参考
- github.com
- ccusage の修正コミット: github.com