🎃

chezmoiを使ってdotfiles管理をバージョンアップした

に公開

はじめに

ルート直下の設定ファイルは「ドットファイル」と呼ばれます。
ドットから始まるファイルが隠しファイルとして扱われるのは、Linux黎明期のバグから始まった慣習だそうです。

ドットファイルを集めたディレクトリをdotfilesとしてrepositoryにまとめて管理するのはエンジニアとしての仕事効率化の定番です。

私のdotfilesは、研究室でサーバーを行き来したり, インターンシップで複数の企業に行ったりしていた頃に始めました。
neovimを使い始めたのもこの頃で, YouTubeのneovim設定動画を参考にしながら少しずつ自分流にカスタマイズしていきました。
今でも Lua 設定には慣れきれていませんが、できる範囲で手を動かして調整しています。


dotfiles管理の課題

新しいパソコンやVMを立ち上げた時に設定するべき項目はdotfilesだけではありません。
普段使っている htoptmuxneovim などのインストールに加えて、フォントや pythonnodejsgo などのランタイムもセットアップが必要です。

私は以前、これらのインストールや設定を Ansible でまとめていました。
しかし、管理対象が増えるにつれて Playbook が複雑化し、細かな環境差分への対応が面倒になっていきました。

そこで導入したのが、chezmoi (シェモア) です。


chezmoi (シェモア) とは

chezmoiはdotfiles管理ツールで、設定ファイルの管理と同時にソフトウェアのインストールも行うことができます。
単なるdotfiles管理にとどまらず、環境構築/インストールの自動化まで行えます。

主な特徴

  • chezmoi apply 一発で設定を反映
  • ファイル名規則に基づいて、自動的にコピーを作成
  • .tmpl ファイルによるテンプレート管理
  • run_once_ スクリプトによる一度きりのセットアップ実行

以前は Makefile を利用してシンボリックリンクを手動で作成していましたが、
chezmoi apply コマンド一つで完結するようになりました。
chezmoi はリポジトリ内の命名規則に基づいて自動的に処理を行うため、
リンク作成やコピーのスクリプトを自分で書く必要がなくなります。

さらに、既存の設定を Git 管理下に取り込むのも簡単です。
chezmoi add で追加し、chezmoi edit で直接編集できます。
この「即適用できる軽さ」が、dotfiles 管理のハードルを大きく下げてくれました。

chezmoi をもっと活用する

導入後、私はいくつかの工夫を取り入れて運用しています。

環境によって変更したい値は.chezmoi.yaml.tmplに変数として切り出す

仕事時/プライベート時では, Gitのユーザ名やメールアドレスが異なります。
.gitconfigを直接chezmoiで管理してしまうと、これらを手動で切り替える必要があります。

これを避けるために、.gitconfig.tmplを作成し, 変数としてユーザ名やメールアドレスを切り出しました。
chezmoiでは、.tmplという拡張子を持つファイルはテンプレートとして扱われます。
テンプレート内ではGoのテンプレートエンジンが利用でき、変数を埋め込むことができます。
プロジェクトを最初に適用するときに、chezmoi init --applyコマンドを使うと、対話形式で変数の値を入力できます。
これにより、環境ごとに異なる値を簡単に設定できます。

ソフトウェアのインストールはスクリプトにまとめる

chezmoiでは、run_once_という接頭辞を持つスクリプトを作成することで、ソフトウェアのインストールを自動化できます。
例えば、run_once_install_htop.shというスクリプトを作成し, htopのインストールコマンドを記述します。


#!/bin/bash
if ! command -v htop &> /dev/null; then
    sudo apt-get update
    sudo apt-get install -y htop
fi

私は, フォントのインストール, cargo, nvim, uv, volta などよく使うソフトウェアのインストールをスクリプトにまとめています。
これらのスクリプトは, chezmoi applyコマンドを実行した際に一度だけ実行されます。
Ansibleを使えば環境の違いを吸収することができるのですが、chezmoirun_once_スクリプトはシェルスクリプトなので簡単に書けるのが良かったです。

CI環境では重い処理をスキップする

重い動作は以下のようにCIでは実行しないようにしています。

# -e: コマンド失敗でスクリプトを終了
# -u: 未定義変数を使用したらエラー
# -o pipefail: パイプ内のどれかが失敗したら全体を失敗とみなす
#!/usr/bin/env bash
set -euo pipefail

# Skip Install in CI environment
if [ -n "$CI" ]; then
  echo "CI environment detected. Skipping Nerd Fonts installation."
  exit 0
fi

このように set -euo pipefail を設定しておくことで、エラーや未定義変数を安全に扱う堅牢なスクリプトになります。

まとめ

私のdotfilesのrepositoryはこちらです。

chezmoi を使うことで、dotfiles の管理が非常に楽になりました。
以前は .zshrc が複数ファイルに分かれていたり、neovim に多数のプラグインを入れていたりして、気づけば管理が煩雑になっていました。
しかし、chezmoi への移行を機に設定を整理し、よりシンプルで再現性の高い環境に整えることができました。

dotfiles に依存した生活をしている方こそ、chezmoi は強力な味方になります。
まだ使っていない方は、ぜひ一度試してみてください。
環境構築のストレスが驚くほど減るはずです。

Rakuten Volunteers Tech Blog

Discussion