0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【cachix】GitHub ActionsのNixビルドを30分タイムアウトから9分完了まで短縮した

0
Posted at

はじめに

Nixのhome-managerでdotfilesを管理しているのですが、flake.lock の更新をおこなうGitHub Actions がnix buildで頻繁にタイムアウトを起こし始めたので Cachix を導入してビルド時間の短縮を行ってみました。

GitHub Actions の タイムアウト時間を伸ばして解決することが一番シンプルですが、Cachix 導入は、flake.nix の substituters に Cacix で作成したキャッシュを代替ダウンロード先に登録することで、ローカルのビルド時間にも効果あるため、今後の投資として導入してみました。

image.png

Cachixとは

Cachix はバイナリキャッシュのホスティングサービスです。Nixでパッケージをビルドすると、依存関係を含めて同じ内容を毎回ゼロからビルドする必要があります。

Cachixは一度ビルドして生成されたバイナリをクラウド上にアップロードし、再度同じハッシュを持つビルドを要求されたときにビルドを省略してバイナリをダウンロードします。そのため、GitHub ActionsなどのCI/CDでビルド時間の短縮をすることができます。

Cachix に登録

Cachixにアクセスして、サインアップを行う。

image.png

今回私は、GitHub アカウントでサインアップをしました。

image.png

New Cacheボタンをクリック

Unique nameと Visibility、Signingを選択します。

Visibilityは 5GBの無料枠で運用したいので Publicを選択しました。Privateだと課金されちゃいます。

Signingは、Recommended されている Managed By Cachixを選択します。

image.png

flake.nixに公開鍵を使用するため、画面上にある公開鍵を控えておきます。

push 用の auth token を発行する

Settingsボタンをクリックして設定画面に移動

image.png

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に適用した場合を載せておきます。

変更した点は、

  • nixConfigextra-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分かかることもあります。

導入前
image.png

導入後
image.png

まとめ

  • Cachix は Nix でビルドされたバイナリをキャッシュしてくれるクラウドサービス
  • Cachix を利用することで、ビルド時に依存を再度すべてビルドせず済むため、CI の時間短縮になる
  • CI 時間は 21 分弱短縮できることを確認
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?