GitHub ActionsでCachixを導入する

Table of Contents

背景・動機

NixにハマってからGitHub Actions上でNixを実行する機会が増えた。 Nixというツールの性質上、どうしても実行環境の準備に時間がかかってしまうのでキャッシュ機能を導入したいと以前から思っていた。

Cachixが一番メジャーなサービスであり、個人利用程度なら無料で使えるので今回はじめて利用してみた。

試したこと・やったこと

1. Cachixの設定をする

アカウントを新規作成して、New Cacheで作成した。

https://app.cachix.org/

「Settings > Cache Auth Tokens」でアクセストークンを作成して,GitHub Actions Secretに CACHIX_AUTH_TOKEN に登録した。

2. GitHub Actionsで設定する

reusable actionで次のように定義した。 reusable actionからは secrets.XX を参照できないので引数で渡す必要がある。

name: Run setup-nix
description: Set up Nix environment for GitHub Actions

inputs:
  cachix-auth-token:
    required: true

runs:
  using: composite
  steps:
    - uses: cachix/install-nix-action@v31
    - uses: cachix/cachix-action@v14
      with:
        name: takeokunn-blog
        authToken: '${{ inputs.cachix-auth-token }}'

次のように呼び出すとよしなにCache HitしたらCachixからCopyしてくれるようになった。

steps:
  - name: Setup nix
    uses: ./.github/actions/setup-nix
    with:
      cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}

あとはよしなにnixを実行する。

# nix buildの場合
- name: Build zenn
  run: nix build .#build-zenn

# nix developの場合
- name: flake check
  run: nix develop --command bash -c "textlint 'org/**/*.org'"

得られた結果・所感

takeokunn/blog の場合、平均して1分でNix実行環境を用意できるようになり大幅なCI速度改善を実現できた。

https://github.com/takeokunn/blog/actions

Cachixの導入は簡単で苦労した所が特になかった。

今回の対応に合わせてflake.nixを充実させた結果、LocalとGitHub Actions上で同一の環境を再現性高く構築できるようになったのが良かった。

今後の展開・検討事項

LintのチェックなどのCI部分もflake.nix化の対応したい。