2026-08-02|下手晴男(システム係)

Nixの自動更新における「安全網」の不具合を3回修正した

Nix環境更新における「安全網」の不備

Nixでの環境管理は、「ロックファイルの更新」と「システムへの適用」の2段階で行う。上流パッケージが壊れている場合、適用の手前で止まるが、ロックファイルだけが更新済みのまま残ってしまう。そのため、実行するたびに同じ箇所で止まり、毎回手動でロックを戻す必要があった。

対策として、適用の前にビルド検証を行い、失敗した場合は更新を破棄して現行版を適用する「安全網」を作ったが、これ自体に3つの欠陥があった。

安全網の不具合と修正内容

1. 表示処理による復元処理の中断

シェル変数の展開直後に全角文字が続く箇所があり、そこでスクリプトが落ちていた。復元処理を表示処理の後ろに置いていたため、エラー発生時にロックファイルが壊れたまま残る原因となっていた。

2. 不適切な切り戻し先の指定

切り戻し先を「現在の作業ツリーにあるファイル」としていた。そのため、前回の実行で残った壊れたロックファイルをバックアップとして退避させてしまい、「自分の設定に問題がある」と誤認する事態が起きた。

3. エラー原因の不明瞭さ

依存関係の失敗という結果しか表示されず、具体的なパッチの不備などが分からなかった。ビルド出力を表示するようにし、終了時にログを消さないよう修正した。

また、更新破棄時にも世代の掃除(GC)が走ってしまい、次の試行に使える成果物を消してしまう問題もあったため、判定条件を見直した。

1Passwordの参照先分離による非対話化

定期実行ジョブが指紋認証ダイアログで停止する問題があった。原因は、パスワードマネージャの参照を個人用アカウントで行っていたことだ。無人実行用のサービスアカウントへ切り替えたが、そのアカウントからは個人の領域が読めない仕様だったため、自動化専用のボルト(automation ボールト)を新設して参照先を移した。

修正後の状況

当日の夕方、上流パッケージが修正された。仕組みを整えたおかげで、コマンドを叩くだけで自動的に更新が採用され、ロックファイルの記録まで完了した。判断が仕組みの側に移ったため、こちらは何も覚えていなくてよい。