blog.anqou.net
rss
author
tags

Nix で Git の private repo を src に指定する

Nix で derivation を作成する際 src フィールドにソースコードやその他入力を指定する必要があります。通常これは公開されているエンドポイントを指定します。典型的には GitHub の公開(public)レポジトリです:

  src = fetchFromGitHub {
    owner = "ushitora-anqou";
    repo = "logq";
    rev = "0.1.3";
    hash = "sha256-+fKi7vfE0CHagSOf9g9TRqIXrSQo35xjIWuQAk0RZoI=";
  };

一方で非公開の Git repository を指定したい場合は一工夫必要です。一番簡単なのは SSH でそのレポジトリにアクセスできるようにしておいた上で builtins.fetchGit を使う方法です:

  src = builtins.fetchGit {
    url = "ssh://[email protected]/ushitora-anqou/logq.git";
    ref = "0.1.3";
    rev = "740b83be8d66165fabc5ad1e87b78ac9069e6130";
  };

他に、fetchFromGitHubprivate フラグを使う方法もあります:

  src = fetchFromGitHub {
    owner = "ushitora-anqou";
    repo = "logq";
    rev = "0.1.3";
    hash = "sha256-+fKi7vfE0CHagSOf9g9TRqIXrSQo35xjIWuQAk0RZoI=";
    private = true; # ☆
  };

ただし private フラグを使う場合は nix-daemon が読める環境変数として NIX_GITHUB_PRIVATE_USERNAMENIX_GITHUB_PRIVATE_PASSWORD を設定しておく必要があります(参考)。NixOS の場合、まず configuration.nix で以下のように EnvironmentFile を指定します:

systemd.services.nix-daemon.serviceConfig.EnvironmentFile = "/etc/nixos/nix-daemon-environment";

/etc/nixos/nix-daemon-environment には以下のように書いておきます[1]

NIX_GITHUB_PRIVATE_USERNAME=ushitora-anqou
NIX_GITHUB_PRIVATE_PASSWORD=(gh auth token の出力)

なおインターネットには fetchgitPrivate を使う方法が散見されますが、これは古い仕組みで builtins.fetchGit の導入により削除されています(参考)。

注釈

  1. このファイルを NixOS 側で管理したい場合は agenix を使うなどの工夫が必要そうです。