Home

Awesome

<!-- <link href="./style.css" rel="stylesheet"></link> -->

dotfiles

🍍🍕 0.4.1

🏴‍☠ budybye/dotfiles

初期設定

curl -fsLS https://chezmoi.io/get | sh -s -- -b ${HOME}/.local/bin init --apply budybye
# or
sh -c "$(curl -fsLS https://chezmoi.io/get)" -- -b ${HOME}/.local/bin init --apply budybye

~/dotfiles に配置する場合

cd ~
git clone git@github.com:budybye/dotfiles.git
cd dotfiles
make init

chezmoi applyrun_* スクリプトが実行されます。 install スクリプトを実行することもできます。

sh -c ~/dotfiles/install

git グローバル設定

# ~/.config/git/user.conf を分けて設定している
cat <<EOF >~/.config/git/user.conf
[user]
    name = {{ .name }}
    email = {{ .email }}
EOF

# or
git config --global user.name {{ .name }}
git config --global user.email {{ .email }}
# コミットメッセージのテンプレート
git config --global commit.template ~/.config/git/commit_template
# ~/.config/git/config の設定の確認
git config --list

概要

目次

  1. XDG ディレクトリ構成
  2. 管理方法
  3. Chezmoi
  4. Makefile
  5. Github Actions
  6. Mise
  7. 環境変数
  8. Docker
  9. Multipass
  10. 参考文献

XDG Base Directory

XDG Base Directory Specification

 .
├──  .devcontainer
│   ├──  ipfs
│   ├──  portainer
│   ├──  .env
│   ├──  .gitignore
│   ├──  devcontainer.json
│   ├──  docker-compose.yaml
│   ├──  Dockerfile
│   └──  entrypoint.sh
├──  .github
│   ├──  workflows
│   │   ├──  ipfs.yaml
│   │   ├──  push.yaml
│   │   ├──  tag.yaml
│   │   └──  test.yaml
│   └──  release.yml
├──  .vscode
│   └──  extensions.json
├──  cloud-init
│   ├──  lxd.yaml
│   ├──  multipass.yaml
│   ├──  network-config
│   └──  user-data
├──  home
│   ├──  .chezmoidata
│   │   └──  packages.yaml
│   ├──  .chezmoiscripts
│   │   ├──  darwin
│   │   ├──  linux
│   │   ├──  run_after_check.sh.tmpl
│   │   ├──  run_after_once_youtube.sh.tmpl
│   │   ├──  run_after_xrp.sh
│   │   ├──  run_once_before_age_decrypt.sh.tmpl
│   │   ├──  run_once_before_bw_unlock.sh.tmpl
│   │   ├──  run_once_ssh_keygen.sh.tmpl
│   │   ├──  run_onchange_activate.sh.tmpl
│   │   └──  run_onchange_vscode.sh.tmpl
│   ├──  dot_ssh
│   │   ├──  authorized_keys.tmpl
│   │   ├──  config.tmpl
│   │   ├──  encrypted_private_id_ed25519.age
│   │   ├──  encrypted_private_id_rsa.age
│   │   └──  id_ed25519.pub.tmpl
│   ├──  private_dot_config
│   │   ├──  act
│   │   ├──  alacritty
│   │   ├──  aquaproj-aqua
│   │   ├──  bat
│   │   ├──  byobu
│   │   ├──  Code
│   │   ├──  element
│   │   ├──  fcitx5
│   │   ├──  fish
│   │   ├──  fusuma
│   │   ├──  gh
│   │   ├──  git
│   │   ├──  ipfs
│   │   ├──  karabiner
│   │   ├──  lsd
│   │   ├──  mise
│   │   ├──  mpd
│   │   ├──  ncmpcpp
│   │   ├──  neofetch
│   │   ├──  nvim
│   │   ├──  ripgrep
│   │   ├──  sheldon
│   │   ├──  tabby
│   │   ├──  tmux
│   │   ├──  vim
│   │   ├──  wireshark
│   │   ├──  Brewfile
│   │   ├──  dot_editorconfig
│   │   └──  starship.toml
│   ├──  .chezmoi.toml.tmpl
│   ├──  .chezmoiexternal.toml.tmpl
│   ├──  .chezmoiignore
│   ├──  .env
│   ├──  dot_aliases
│   ├──  dot_bash_profile
│   ├──  dot_bashrc
│   ├──  dot_profile
│   ├──  dot_zlogin
│   ├──  dot_zprofile
│   ├──  dot_zshenv
│   ├──  dot_zshrc
│   ├──  key.txt.age
│   └──  shhh.txt
├──  .chezmoiroot
├──  .cursorrules
├──  .mise.toml
├──  .tool-versions
├──  install.sh
├──  Makefile
├──  README.md
├──  style.css
└──  etc...

管理方法

1. Chezmoiの活用

2. Makeとの併用

3. .devcontainerとの統合

4. Github Actions でテスト

flowchart TD
    A[ドットファイル管理] --> B[Chezmoi]
    A --> C[Make]
    A --> D[Docker]
    A --> E[Multipass]

    B --> B1[初期化]
    B1 --> B2[設定ファイルを適用]
    B2 --> B3[環境変数を管理]

    C --> C1[Makefileを使用]
    C1 --> C2[シェルスクリプトを実行]
    C2 --> C3[環境ごとの設定を管理]

    D --> D1[Dockerイメージをビルド]
    D1 --> D2[コンテナを起動]
    D2 --> D3[環境を構築]

    E --> E1[MultipassでVMを起動]
    E1 --> E2[cloud-initを使用]
    E2 --> E3[カスタマイズされた環境を構築]
sequenceDiagram
    participant H as Home Directory
    participant W as Working Copy
    participant L as Local Repo
    participant R as Remote Repo

    H->>L: chezmoi init
    H->>W: chezmoi add <file>
    W->>W: chezmoi edit <file>
    W-->>H: chezmoi diff
    W->>H: chezmoi apply
    H-->>W: chezmoi cd
    W->>L: git add .
    W->>L: git commit
    L->>R: git push
    R->>H: chezmoi init --apply <repo>

管理方法

OS管理方法コメント
macOSChezmoiスクリプトの実行や環境設定に適している
UbuntuChezmoi同上
WindowsChezmoiWindows特有の設定を管理するのに適している

メリットとデメリット

メリットデメリット
一貫性のある開発環境学習コストがかかる
環境の再現性リソースの消費
依存関係の管理複雑性の増加

ツールのインストール


OSMacOSUbuntuDocker
Chezmoibrewmisemise
Scriptmakemakemake
Makefilemakemakemake
Zshdefaultaptapt
Gitbrewaptapt
Github Actions
Github CLIbrewaptapt
Bitwarden CLIbrewsnap/npmsnap/npm
Dockerbrewaptapt
Dev Container
Multipassbrewsnapsnap
Homebrew

CLI ToolMacOSUbuntuDocker
Byobubrewaptapt
Vimbrewaptapt
Fishbrewaptapt
aqua VMbrewaptapt
MPDbrewaptapt
Ncmpcppbrewaptapt
fcitx5aptapt
Neofetchfastfetchaptapt

Rust ToolMacOSUbuntuDocker
Misebrewcurlcurl
cargo-binstallcargocargocargo
Starshipbrewmise/cargomise/cargo
Sheldonbrewcargocargo
lsdbrewcargo/aptapt
batbrewcargo/aptapt
ripgrepbrewcargo/aptapt
fzfbrewcargo/aptapt
zoxidebrewcargo/aptapt
fd-findbrewcargo/aptapt

LanguageMacOSUbuntuDocker
Node.jsmisemisemise
Bunmisemisemise
Denomisemise/snapmise/snap
Gomisemise/snapmise/snap
Pythonmisemise/aptmise/apt
Javamisemise/aptmise/apt
Rustmisemise/aptmise/apt
Rubymisemise/aptmise/apt

DesktopMacOSUbuntuDocker
Xfce4aptapt
Xrdpaptapt
VSCodebrewapt
VSCodiumsnapsnap
CursorbrewAppImageAppImage
Github Desktopbrewaptapt
Tabbybrewaptapt
Bravebrewaptapt
Cloudflare Warpbrewaptapt
Wiresharkbrewaptapt
Fusumagemgem
Karabiner-Elementsbrew

Chezmoi の使用

Chezmoi を使用して Dotfiles を管理します。

# インストールされてない場合
curl -sfL https://chezmoi.io/get | sh -s -- init --apply budybye
# or
make init

# MacOS
brew install chezmoi

# 初期化 ~/.local/share/chezmoi が作成されて ~/ 以下に反映される
chezmoi init --apply budybye
# cd コマンドで移動 ~/.local/share/chezmoi
chezmoi cd
# ファイルを追加
chezmoi add < Filename >
# ファイルを追加(シンボリックリンク)
chezmoi add --follow < Filename >
# ファイルの差分を確認
chezmoi diff < option Filename >
# 変更を適用
chezmoi apply < option Filename >
# ファイルの属性を変更
chezmoi chattr < Filename >
# リモートからの状態を反映
chezmoi update
# .chezmoi.* から取得できる情報を表示
chezmoi data

Makefile

Makefile でシェルスクリプトを管理。

# 環境ごとに分けたシェルスクリプトを実行
make sense
# シェルスクリプトを実行
make init
make install
make setup
make bootstrap
make defaults
make code
make link
make keygen
ifeq ($(OS),Darwin  )
    # MacOS の場合
    sense: init bootstrap
else ifeq ($(OS),Linux)
    # Ubuntu の場合
    sense: init install setup
endif

# 環境ごとに分けたシェルスクリプトを指定
install:
    sh $(HOME)/.local/bin/install.sh
bootstrap:
    sh $(HOME)/.local/bin/bootstrap.sh
setup:
    sh $(HOME)/.local/bin/setup.sh
init:
    curl -sfL https://chezmoi.io/get | sh -s -- init --apply -S .
...

Github Actions

test.yaml でテスト


jobs:
  # ubuntu 24.04 でテスト
  ubuntu:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      # make 経由でシェルスクリプトを実行
      - run: make sense
    ...
  # macos sequoia でテスト
  macos:
    runs-on: macos-15
    ...
  # docker でテスト
  docker:
    runs-on: ubuntu-latest
    steps:
      # docker製のアクションを使用
      - uses: docker/login-action@v3
      - uses: docker/setup-buildx-action@v3
      - uses: docker/setup-qemu-action@v3 # クロスプラットフォーム対応 遅い?
      - uses: docker/build-push-action@v5
    ...
  # windows でテスト
  windows:
    runs-on: windows-latest
    ...

Mise

Mise を使用してプログラミングツールやCLIツールを管理します。

# ツールをインストール
mise use < tool@version >
# global にインストール
mise use -g < tool@version >
# インストールしたツールを確認
mise ls
# .mise.toml の指定ファイルを信頼
mise trust
# 環境変数を表示
mise set

環境変数

設定ファイルを作成

touch ./.mise.toml
touch ./.env

./.env に環境変数を記述

# .env 例
export VAR=hoge
# .gitignore で.env ファイルを除外

./.mise.toml で読み込むファイル名を指定

[env]
_.file = ".env*"

現在のディレクトリを信頼してファイルを読み込み

# 環境変数が反映される
mise trust
echo $VAR

# 出力 hoge

説明


Docker

cd .devcontainer
# コンテナをビルド
docker build -t ubuntu-dev .
# イメージをプッシュ
docker push ubuntu-dev
# コンテナを起動
docker compose up -d
# コンテナ内に入る
docker compose exec ubuntu /bin/bash

Multipass

Multipass で cloud-init を使用して Ubuntu を起動

# オプションでカスタマイズ
# -n VM 名
# -c コア数
# -m メモリ
# -d ディスク
# --timeout タイムアウト時間 3600秒 = 1時間
# --mount マウント  from:to
# --cloud-init cloud-init の設定ファイルを指定

multipass launch \
  -n ubuntu \
  -c 4 \
  -m 4G \
  -d 40G \
  --timeout 3600 \
  --mount ${HOME}/data:/home/ubuntu/mount \
  --cloud-init ${HOME}/cloud-init/multipass.yaml

参考文献