以前 NixOS の自動更新を GitHub Actions を利用して実施するという記事を書きました。この仕組みは、若干の手直しは入りつつも現在も元気に動いていて、わくわく鮟鱇ランドを支えるサーバーを日々更新し続けています。
ところがこのスクリプトが昨日(6/25)動かなくなりました。以下のようなエラーを出して boot サブコマンドが失敗してしまいます:
unix_listener: path "/home/runner/work/_temp/nixos-rebuild.g36xv1lg/ssh-b48c3e8aaee0754a4a371ba5ad5aa69719ff16f3.KKqwqYNtiRNu6Lmp" too long for Unix domain socket
どうも nixos-rebuild が動作するパスが長すぎるせいでエラーになってしまっているようです。
nixos-rebuild-ng の実装を確認すると Python の tempfile.gettempdir を使って一時ディレクトリのパスを取得しているようなので、下記のように TMPDIR を上書きしてより浅いパスを指定するようにすると問題は解決しました:
export TMPDIR="/tmp" # avoid "too long for Unix domain socket" error
export NIX_SSHOPTS="-o StrictHostKeyChecking=no"
nix run nixpkgs#nixos-rebuild -- boot \
--flake path:.#${{ inputs.hostname }} \
--target-host ${{ inputs.target-host }}
解決したのは解決したのでまぁ良かったのですが、いきなり壊れた原因はよくわかりません。
GitHub Actions の履歴を確認すると 6/24 までは動いていたようなので、昨日入った nixpkgs の更新(ハッシュ値 d5ae86799370174bdb80c70fae94ddc785ae0704 から 936860f69b3f2c3aeae777cb4660b2128587d172)が原因かもしれません。ただ、実は一昨日から昨日にかけて他の部分も修正していたので、その影響があるかもしれません。また、ワークフロー自体が参照する nix コマンドは(cachix/install-nix-action に引数を渡していないので)
nixos-unstable を参照しているはずで、そちらの更新が問題なのかもしれません。いずれにしてもワークアラウンドを見つけてしまったので特に深入りするつもりはなく、真相は闇のままです。