chezmoi
Manage your dotfiles across multiple machines, securely.
https://www.chezmoi.io/
Photo by Markus Spiske on Unsplash
こんにちは。ウォンテッドリーのEnablingチームでバックエンドエンジニアをしている冨永(@kou_tominaga)です。Enablingチームでは技術的な取り組みを社外にも発信すべく、メンバーが週替わりで技術ブログをリレー形式で執筆しています。前回は市古さんによる「Rubyで始めるAIエージェント入門」 でした。今回は「dotfilesを1年運用して得た知見について」についてです。
MacBookを新調したり新しい開発環境を構築する際、環境設定やツールインストールに時間を取られ、1日があっという間に終わってしまうことは少なくありません。私自身も以前はPCセットアップに丸1日費やし、業務開始が遅れることが当たり前になっていました。chezmoiでdotfilesを運用するようになってから、この課題を大きく改善できました。本記事ではその具体的な方法と運用して得た知見を紹介します。
記事のゴール
導入背景
PCセットアップの悩み
dotfilesという解決策
chezmoiの特徴と選定理由
dotfiles managerの比較検討
chezmoiの特徴
初期セットアップコマンド
運用フロー
運用Tips
設定漏れ防止
テンプレート化と環境変数管理
トラブルと改善
まとめ
本記事ではdotfilesとは何か、管理しない場合の問題、chezmoiの特徴や選定理由、1年間運用して分かったメリット、実際の運用フロー、トラブルとその改善策を実体験をもとにまとめています。dotfiles管理に興味はあるものの手を出せずにいた方が、導入から運用までの具体的イメージを持ち、次回以降のPCセットアップを数十分で完了できる再現性の高い環境構築ができるようになることを目指しています。
私はこれまでMacを買い替えたり業務用PCが支給された際に開発環境を整えるまで丸1日かかることが当たり前になっていました。たとえば、以下のような作業に時間を費やしていました。
brew install コマンドを手元のメモや記事から探す中でも大変だったのは環境変数やAPIキーなどのシークレット設定です。.zprofileに直接書いていたため、どこに書いたか忘れてPCを行き来して探したり、再発行するなどの対応が必要でした。また、私は複数台のPCで開発しているため設定の同期作業も煩雑で、少し変更するたびに全PCへ反映する必要がありミスや差分放置が発生していました。
こうした問題を解決するために有効なのがdotfilesでの管理です。dotfilesとはファイルの先頭がドット"."で始まる設定ファイルやディレクトリのことです。dotfilesをGitで管理することで新しいPCでもリポジトリをクローンしシンボリックリンクを張ることで、同じ設定を簡単に再現できます。ただし、Git管理だけではホストごとの設定分岐やシークレット管理など、より複雑な運用にはスクリプト追加が必要になるという課題がありました。
逆にdotfilesを管理していないと、新PC構築のたびに設定を探し回る必要があり、何をインストールしていたか再現できず、日々積み上げたaliasや関数が失われる場合もあります。最終的には環境構築が面倒でPC移行が億劫になるという状況に陥ります。そこで私は、dotfilesを単純にGit管理するだけでなく、ホストごとの分岐やシークレット管理を統合できるdotfiles managerを使って、より効率的に運用できないかと考えるようになりました。
最初に検討したのがGNU Stowです。Stowはシンボリックリンク管理ツールとして非常にシンプルで強力ですが、環境変数による条件分岐やテンプレート処理などが標準ではサポートされていません。複数環境で異なる設定を共存させる可能性があり、その場合は追加のスクリプトが必要でした。
他にもyadmというツールも試しました。bare Git管理に加えてホストごとの条件分岐や限定的なテンプレート機能がある点は魅力的でしたが、シークレット管理は外部ツール連携前提で統合感はやや弱い印象を持ちました。
そうした中で見つけたのがchezmoiでした。chezmoiはGoで作られたdotfiles managerで、複数環境対応やテンプレート処理、シークレット管理まで統合的にサポートしているのが特徴です。特に便利だと感じたのはテンプレート機能です。{{ if eq .chezmoi.hostname "darwin" }}のようにホスト名条件で設定ファイルの一部を分岐させたり、1Passwordなどのパスワードマネージャーと連携してシークレットを埋め込めるため、別途スクリプトを書かずに済みました。この統合感と拡張性が決め手となり最終的にchezmoiを採用しました。
※.chezmoi.hostname はchezmoiが自動で認識するホスト名変数で条件分岐に便利です。詳細は公式ドキュメントを参照してください。
初期導入は非常に簡単です。以下コマンドでGitHub上のdotfilesリポジトリをクローンして~/.zshrc,.gitconfig などの設定が即座に整います。
brew install chezmoi
chezmoi init <your-github-username>
chezmoi applychezmoiを導入してからは、日常的な設定変更や新規ファイル追加も非常にスムーズになりました。普段の運用は以下のような流れです。まず、設定を変更したら以下のコマンドを実行してリポジトリに取り込みます。
chezmoi add ~/.zshrc
chezmoi add ~/.gitconfigその後、差分を確認してコミットします。
chezmoi diff
chezmoi git commit -- -m "Update zshrc and git config"
chezmoi git pushこれによりリモートリポジトリに変更が反映され、他のPCでもchezmoi updateするだけで設定を同期できます。
運用していて便利だったTipsをいくつか紹介します。
変更後にchezmoi diffを習慣化することで、コミット漏れや管理外ファイルを防げます。特に複数環境で作業していると別のPCの設定漏れなどの事故を防げるため重要です。
chezmoiのテンプレート機能は非常に柔軟で、環境変数やホスト名に応じて出力内容を切り替えられます。例えば、以下のようにホスト名ごとにbrew bundleの内容を分岐させています。
{{ if eq .chezmoi.hostname "work-mac" }}
brew "karabiner-elements"
brew "iterm2"
{{ else if eq .chezmoi.hostname "personal-mac" }}
brew "vlc"
brew "rectangle"
{{ else }}
# デフォルトのインストールパッケージ
brew "htop"
{{ end }}また、APIキーなどのシークレットはchezmoiのテンプレートファイル(例:.envrc.tmpl)に記述し、pass show や op コマンドで安全に埋め込むことで、GitHubに直書きせず管理できます。
運用を始めて半年ほど経った頃から変更を追加するのを忘れたり、意図せずchezmoi applyを実行しないままになってしまうといった問題が発生することがありました。
そこで現在は、GitHub Actionsでchezmoi applyを実行するCIテストを導入しています。具体的には、dotfilesリポジトリに以下のようなワークフローを追加し、テンプレートが正しく展開可能かどうかをコミット段階でテストするようにしています。この仕組みによってテンプレート構文エラーや変数参照漏れを検知できるようになり、実環境でapplyして壊れるリスクを下げることができました。運用開始当初は「dotfiles管理=単なる設定バックアップ」程度に考えていましたが、こうしたトラブル対応やCI的テスト導入を経て、dotfilesは開発基盤の重要なインフラと実感しました。
name: test
on:
pull_request:
branches:
- main
jobs:
test:
name: Test
runs-on: macos-latest
steps:
- name: Install chezmoi
run: brew install chezmoi
- name: Initialize chezmoi
run: chezmoi init https://github.com/<your-github-username>/dotfiles.git
- name: Apply chezmoi
run: chezmoi apply
dotfilesをchezmoiで管理するようになってから、PCセットアップや環境構築にかかる時間は大幅に短縮されました。以前はPCを変更するたびに1日仕事だったセットアップが今では数十分で完了し、その日のうちに通常業務を始められるようになっています。また、chezmoiのテンプレート機能やシークレット管理を活用することで、異なる環境間でも最適化された設定を自動で出し分けられるようになり、環境構築の再現性と信頼性が大幅に向上しました。単なる設定ファイルの同期に留まらず、APIキー管理まで統合できるのは大きな魅力です。
またdotfiles自体を運用していて特に良かったのは、他の開発者のdotfilesを見る機会が増え、開発効率向上のヒントを得られたことです。dotfilesの管理は一見大変に感じるかもしれませんが一度環境を構築してしまえば、PCセットアップや環境同期にかかる時間を大幅に削減でき、長期的には初期導入コストを上回る開発効率の向上が期待できます。