はじめに
Nixのhome-managerでdotfilesを管理しているのですが、flake.lock の更新をおこなうGitHub Actions がnix buildで頻繁にタイムアウトを起こし始めたので Cachix を導入してビルド時間の短縮を行ってみました。
GitHub Actions の タイムアウト時間を伸ばして解決することが一番シンプルですが、Cachix 導入は、flake.nix の substituters に Cacix で作成したキャッシュを代替ダウンロード先に登録することで、ローカルのビルド時間にも効果あるため、今後の投資として導入してみました。
Cachixとは
Cachix はバイナリキャッシュのホスティングサービスです。Nixでパッケージをビルドすると、依存関係を含めて同じ内容を毎回ゼロからビルドする必要があります。
Cachixは一度ビルドして生成されたバイナリをクラウド上にアップロードし、再度同じハッシュを持つビルドを要求されたときにビルドを省略してバイナリをダウンロードします。そのため、GitHub ActionsなどのCI/CDでビルド時間の短縮をすることができます。
Cachix に登録
Cachixにアクセスして、サインアップを行う。
今回私は、GitHub アカウントでサインアップをしました。
New Cacheボタンをクリック
Unique nameと Visibility、Signingを選択します。
Visibilityは 5GBの無料枠で運用したいので Publicを選択しました。Privateだと課金されちゃいます。
Signingは、Recommended されている Managed By Cachixを選択します。
flake.nixに公開鍵を使用するため、画面上にある公開鍵を控えておきます。
push 用の auth token を発行する
Settingsボタンをクリックして設定画面に移動
Auth Tokenから tokenを作成していきます。この token はビルド時に生成されたバイナリを Cachixのクラウドに書き込む際に必要となります。GitHubでいうpush時に必要となるtokenと思ってもらえれば
token名、権限(Write+Read)、期限を決めてGenerateをクリック。
生成されたtokenは後ほど使うため控えておきます。
GitHub の Secret に token を登録する
cachixを運用するリポジトリに行き、
Settings > Secret and Variables > Actionsへたどり、
New Repository SecretからSecretを作成します。
値は先程控えていたtokenをペーストして add secretをクリック。
flake.nix の substituter と公開鍵の設定
ここからは、人により変わってくる部分かと思います。一例として、私のflake.nixに適用した場合を載せておきます。
変更した点は、
-
nixConfigのextra-substitutersに、先程作成した Cachix の CacheのURLを追加 -
extra-trusted-public-keysの配列に、公開鍵を追加
GitHub Actions の nix build ワークフローにも Cachixを 導入
自分のdotfilesのCIフローは以下の流れになってます。
nix build を行う GitHub Actions のワークフローに、Cachix のセットアップを 1 ステップ追加しました。
if: は Nix 関連ファイルが変わった、または手動実行のときに実行する条件です
uses で cachix/cachix-action を呼び出し、name に接続するキャッシュ(mkiin-dotfiles)、authToken に push 用のトークンを渡しています。
ビルド時にキャッシュから取り出し、ビルドした成果物をキャッシュへ pushします。
あわせて timeout-minutes を 30 から 60 に伸ばし、初回のビルドが打ち切られないようにしました。
キャッシュ導入による変化
比較対象として、タイムアウトした際のワークフローの時間と、Cachix 導入から
キャッシュ導入前は、nixos側のビルドで30分タイムアウトが発生していましたが、導入後は9分で終了しており、21弱の短縮になりました。
もちろん、キャッシュが効いている前提なのでヒットしない場合は30分かかることもあります。
まとめ
- Cachix は Nix でビルドされたバイナリをキャッシュしてくれるクラウドサービス
- Cachix を利用することで、ビルド時に依存を再度すべてビルドせず済むため、CI の時間短縮になる
- CI 時間は 21 分弱短縮できることを確認






