🧹

年末の大掃除にdotfilesをつくろう

2024/12/27に公開

こんにちは、クラウドエースの妹尾です。

今回は趣向を変えて開発環境のお話をしたいと思います。
この記事の執筆が2024年末なことを前提に見ていただければ幸いです。

はじめに

(ここからの話は dotfiles とはちょっと離れていますので、 dotfiles の事を早く知りたい方は次の章まで飛ばしましょう)

年末といえば大掃除

さて、皆さん年末には大掃除をすると思います。
部屋のモノや床はもちろん、一部の人はお気に入りのキーボードを掃除する人もいるかもしれません。

でもエンジニアにとって、一番使う場所はきっと開発用マシンの中だと思います。
という訳なので、開発用マシンの中も掃除しちゃいましょう!

でも具体的に開発用環境の掃除、どんな感じにやれば良いのでしょうか……
ここでは一例として僕の大掃除方法を元にして話したいと思います。

PC の大掃除

まず最初に見るべきは以下のディレクトリです。

  • デスクトップ
  • ダウンロード

日々様々なデータを見るためにエクセルや PDF をダウンロードして……ということは日常茶飯事だと思います。
本当は使い終わったデータはすぐ消すのが良いのですが、ついついサボりがちになり気が付いたらアイコンがズラり……ということはよくあることだと思います。
使い終わったインストーラーやもう参照しないファイルは消していって、置き場所がわかるデータは正しい置き場所に移動させましょう。

次にインストール済みのアプリです。
あまり慣れていない人は触らない事をお勧めしますが、やるのであればコツは

  • 明確に不要だとわかるアプリだけ消す
  • サードパーティー製の解析ツールは使わない

の2点です。
不要だと思っていたアプリケーションが別のアプリに依存していて動かなくなってしまうケースはよくあります。
何かの用事で一時的にインストールして、今は使っていないものを消していくのが良いです。

またサードパーティー製の解析ツールは沢山消してくれるのですが、
非公式であるがゆえに他のパッケージを壊してしまう可能性がある上、リカバリーが非常に困難になってしまうケースが多いです。
公式のアンインストールツールを利用するのが鉄則です。

後は過去に使った仕事用のデータやその他のファイルを archive 等のフォルダに纏めれば大分スッキリします。
更に一段 2024 という風な年度別のディレクトリを掘って置いたり、 zip 圧縮してディスク容量を削減しても良いでしょう。

最後に、OSやアプリケーションをアップデートしたら完成です。

PC をリセットすれば一番キレイ!?

さてここまで説明しましたが、これより綺麗になる方法が PC にはあります。
そう、リセットしてしまえば良いのです。

リセットして必要なファイルだけ初期設定してしまえば必要なモノだけ残って一番スッキリします。
でも必要なものを毎回リストして再設定するのは面倒ですね……

こんな時に使うのが dotfiles です!

dotfiles とは?

dotfiles とは ~/.ssh~/.vimrc などのホームディレクトリ直下にある . で始まるファイル群のことですが、これを管理下に置いて再セットアップの手間を大幅に低減しようという試みの事も指すようです。
よく用いられている方法として、Github に自身の dotfiles をそのセットアップスクリプトと共にアップロードする方法があり、検索すると沢山の dotfiles を見ることができます。

Githubで検索すると沢山あります

star 数が多いものはとても便利な反面、複雑でもあります。
でも dotfiles に決まりはありません。自分が必要だと思った要素のみ登録すれば良いのです。
例えば 著名な OSS コントリビューターである mattn 氏も dotfiles を公開していますが、彼は dotfiles ではない場所で管理しているのか管理しない運用をしているのか、空の README だけ置かれています。
つまりこれでも全然アリだということです。

https://github.com/mattn/dotfiles
空のレポジトリ

今は何もなくても大丈夫です。これから追加していけば OK 。
必要な時に追加していく様から「dotfiles を育てる」とも言われますが、まったくその通りで育てていけばいいのです。
まずは小さな種から作ってみましょう。

dotfiles を作ってみよう

まずはレポジトリを作る

最初に GitHub へレポジトリを作ります。
名前は何でも構いません、特に希望がないなら dotfiles とするのが良いでしょう。
また、慣れない間はプライベートレポジトリとしておくと安心感が増えます。

~/dotfiles を作る

次にお手元の開発機で先ほど作ったレポジトリの内容を置いておくディレクトリを作ります。
特に希望がなければ ~/dotfiles とかにしておきましょう。
この時、ディレクトリが . で始まらなくても特に問題はありません。

必要なファイルを移動させてシンボリックリンクを貼る

では移動していきましょう。
.vimrc.profile 等のファイルを先ほど作った dotfiles へ移動していきます。

移動した後に、アプリケーションが参照できるように元々の場所へシンボリックリンクを作っておきましょう。

作業が終われば、だいたい下記のようになります。

$ ls -la ~    # 一部抜粋したものを表記しています。
lrwxrwxrwx  1 seno seno         29 Feb 12  2024 .bashrc -> /home/seno/dotfiles/.bashrc
lrwxrwxrwx  1 seno seno         32 Feb 12  2024 .gitconfig -> /home/seno/dotfiles/.gitconfig
lrwxrwxrwx  1 seno seno         30 Feb 12  2024 .profile -> /home/seno/dotfiles/.profile
lrwxrwxrwx  1 seno seno         32 Feb 12  2024 .tmux.conf -> /home/seno/dotfiles/.tmux.conf
lrwxrwxrwx  1 seno seno         26 Feb 12  2024 .vim -> /home/seno/dotfiles/.vim/
lrwxrwxrwx  1 seno seno         28 Feb 12  2024 .vimrc -> /home/seno/dotfiles/.vimrc

$ ls -la ~/dotfiles
-rw-r--r--  1 seno seno  4526 Feb 13  2024 .bashrc
-rw-r--r--  1 seno seno   521 Feb 13  2024 .gitconfig
-rw-r--r--  1 seno seno   807 Feb 13  2024 .profile
-rw-r--r--  1 seno seno  3359 Oct 25 22:07 .tmux.conf
drwxrwxrwx  6 seno seno 16384 Dec 27 16:39 .vim
-rw-r--r--  1 seno seno 14165 Dec 26 12:32 .vimrc

リンクを一発で貼れるようにする

最後に、これらのファイルをリンクさせる link.sh を作ります。
リンクする前に既存のファイルは退避させるよう作っておくと安心です。
実行権限も忘れずに付与しておきましょう。

#!/bin/bash

files_and_paths=(
  ".bashrc:~/.bashrc"
  ".gitconfig:~/.gitconfig"
  ".profile:~/.profile"
  ".tmux.conf:~/.tmux.conf"
  ".vim:~/.vim"
  ".vimrc:~/.vimrc"
)

# シンボリックリンクを作成する関数
create_symlink() {
  local source_file=$(realpath $1)
  local destination_path=$2

  backup_file="${destination_path}.bak"     # 退避先のファイル名

  if [ -e "$destination_path" ]; then
    mv "$destination_path" "$backup_file"
  fi

  ln -s "$source_file" "$destination_path"  # シンボリックリンクの作成
}

for entry in "${files_and_paths[@]}"; do
  IFS=":" read -r source_file destination_path <<< "$entry"
  create_symlink "$source_file" "$destination_path"
done

これで、 link.sh を叩けば必要なファイルが配置されるようになりました。
次はアプリケーションも dotfiles に定義しちゃいましょう。

インストール作業も dotfiles に書く

ではアプリケーションのセットアップも dotfiles に書いてしまいます。
setup.sh を作って以下のように書いていきましょう。
内容は個人の自由ですので、 dnf を使ったり homebrew を使っても良いでしょう。

#!/bin/bash

# setup
git submodule init
git submodule update

# linuxbrew
CI=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)

# brew
brew install -q git bash-completion tmux make vim fzf npm node
rm ~/.gitconfig
brew postinstall -q gcc

# kubernetes
brew install -q kubectl stern kubectx k9s helm helmfile

# google-cloud-sdk
brew install -q python@3
brew link python@3 --overwrite
curl https://sdk.cloud.google.com > /tmp/install.sh
bash /tmp/install.sh --disable-prompts
rm /tmp/install.sh

# link
$(cd $(dirname $0); pwd)/link.sh

ここでは例として linuxbrewkubectl とそのプラグイン群、gcloud コマンドを導入していってます。
最後に先ほど作った setup.sh を叩くだけで全てのセットアップが完了します。

後は用意した Github レポジトリに、ここまでのコードを push したら完了です!

後は使ってみる

最後に使ってみましょう。
早速開発用マシンをリセットして……とは行かないので、まずはお手元の Virtual Machine や KVM、Hyper-V を使って仮想環境からやってみることをオススメします。可能なら Docker を使っても良いでしょう。

git pull して ~/dotfiles/setup.sh を実行して上手く行ったら完成です、お疲れ様でした!

dotfiles の落とし穴

べき等性を考える必要がある

作った setup.shlink.sh ですが、2回以上実行した時にエラーが起きる可能性があります。
「初回だけ実行するからヨシ!」という運用も手ですが、可能なら何度実行しても副作用がないように構成するのがベストです。

そのために、シェルスクリプトではなく Ansibleitamae のような構成管理ツールを使って定義して setup.sh はそのトリガーだけ実行させるというのも手ですね。

環境依存に注意しないといけない

この dotfiles を使うマシンが一種類であれば良いのですが、複数の PC を使い分けている方などは同一の dotfiles が使えない事も多いです。
例えば Ubuntu と Alma Linux で使いたい時は aptdnf それぞれのパッケージ管理システムの両方に対応させないと実行できません。そこに macOS まで入ると更に大変なことに……

1つのファイルやレポジトリで頑張っても良いですが、思い切って macOS 専用と linux 用と分けるのも手です。

バックアップは確実に

実際に実行する時はバックアップを確実に取っておきましょう
外付けの SSD やクラウドサーバにデータを退避しておくと安心です。

dotfiles は育てるものである

さて、ここまで頑張った方々はスクリプトを書き込む過程で今の自分の環境に必要なものがある程度見えてきたものと思います。
しかし、環境は変わっていくのでこれでゴール……という訳にはいきません。

冒頭でも話しましたが dotfiles は育てるものであり、継続的に見直したり追加する必要があります
「そういえばコレ忘れてたな」と思ったら、すぐに dotfiles を更新してコミットしておくことで真価を発揮しますので、可能な限りアップデートを重ねることをお勧めします。

もちろん、そうしなかった時にメリットが無くなる訳ではありません。
不意の事故で PC がリセットされたり壊れても、ある程度の環境がすぐ手に入ることは非常に強力なメリットになります。

リセットできる環境は安心

大掃除を理由に作ってきましたが、dotfiles は初期設定の時にとても役立つものです。
サクサクと環境をリセットすることは難しいですが、いつでもリセットできるように仕事用のディレクトリを分けるなど、dotfiles を活用できるように動くことで普段の整理も身に付いていきます。

皆さんもぜひ定期的に環境を見直して、自分だけの dotfiles を育てていきましょう。
そして実際に行う時は注意を払って、よくテストした上で挑みましょう。

それでは、よい dotfiles ライフを!

Discussion