Skip to content

setup.sh を1スクリプトで完結する包括的なセットアップスクリプトに改善 #28

@yellow-seed

Description

@yellow-seed

概要

現在の setup.sh は chezmoi の初期化のみを行う最小限のスクリプトですが、参考リポジトリ(https://github.com/shunk031/dotfiles/blob/master/setup.sh)のように、このスクリプト一発でセットアップが完了する包括的なスクリプトに改善したい。

現在の状態

既存の構造

  • setup.sh: chezmoi のインストールと初期化のみ
  • install/macos/common/: macOS用のインストールスクリプト
    • brew.sh: Homebrew のインストール
    • brewfile.sh: Brewfile からのパッケージインストール
    • Brewfile: インストールするパッケージ定義
  • install/ubuntu/common/: Ubuntu用のインストールスクリプト(未実装)
  • install/template.sh: 新しいインストールスクリプトのテンプレート

現在の動作

  • setup.sh 実行 → chezmoi で dotfiles 適用
  • 個別インストールスクリプト(install/macos/common/*.sh)は手動実行が必要

参考リポジトリとの主な違い

1. 見た目と UX の改善

  • ロゴ/バナーの表示
  • カラフルな出力(色付きメッセージ)
  • プログレス表示

2. 環境検出とOS別処理

  • get_os_type() 関数の実装(Darwin/Linux の判別)
  • macOS 固有の初期化処理(initialize_os_macos()
    • 既存の install/macos/common/brew.sh を呼び出し
    • Apple Silicon/Intel の判別と適切な PATH 設定(brew shellenv の評価)
  • Linux 固有の初期化処理(initialize_os_linux()
    • install/ubuntu/common/ 配下のスクリプトを呼び出し
  • システム情報の取得(get_system_from_chezmoi()

3. インストールスクリプトの統合

  • setup.sh から install/ 配下のスクリプトを自動実行
    • macOS: install/macos/common/brew.shinstall/macos/common/brewfile.sh
    • Ubuntu: install/ubuntu/common/ 配下のスクリプト
  • OS検出に基づく適切なスクリプトの選択
  • スクリプト実行順序の制御

4. sudo 権限管理

  • keepalive_sudo() 機能の実装
    • macOS: Keychain を使用したパスワード管理
    • Linux: 定期的な sudo タイムスタンプ更新
  • CI/非TTY環境の検出と適切な処理
    • is_ci() 関数
    • is_tty() / is_not_tty() 関数
    • is_ci_or_not_tty() 関数

5. デバッグモード

  • DOTFILES_DEBUG 環境変数のサポート(install/ 配下では既に実装済み)
  • setup.sh でのデバッグモード実装
  • デバッグ時の詳細出力(set -x

6. chezmoi の詳細な制御

  • chezmoi バイナリの明示的なダウンロードと配置($HOME/.local/bin
  • --branch オプションのサポート
  • --use-builtin-git オプションの使用
  • --force オプションの使用
  • CI/非TTY環境での --no-tty オプションの使用
  • 暗号化ファイル(encrypted_*)の CI 環境での自動除外

7. プライベート dotfiles のサポート

  • プライベートリポジトリの初期化
    • PRIVATE_DOTFILES_REPO_URL の設定
    • PRIVATE_DOTFILES_PATH の設定
    • PRIVATE_DOTFILES_CONFIG_PATH の設定
  • SSH 経由でのプライベートリポジトリのクローン
  • 別設定ファイルでの管理

8. エラーハンドリングと後処理

  • at_exit() 関数によるクリーンアップ処理
  • トラップハンドラの設定
  • 一時ファイルの自動削除

9. シェルの再起動

  • restart_shell_system() 関数の実装
  • セットアップ完了後のシェル再起動(ログインシェルとして)

10. パスの管理

  • $HOME/.local/bin への PATH 追加
  • バイナリのインストール先の明示的な管理

11. 関数の構造化

  • 明確な責任分離
    • initialize_os_env(): OS環境の初期化 + 既存インストールスクリプトの呼び出し
    • run_chezmoi(): chezmoi の実行
    • initialize_dotfiles(): dotfiles の初期化全体
    • main(): メイン処理のオーケストレーション

提案する実装順序

Phase 1: 基本構造の改善

  • OS 検出機能
  • デバッグモード(setup.sh への追加)
  • 関数の構造化
  • 既存の install/ スクリプトとの連携基盤

Phase 2: 環境別処理と既存スクリプトの統合

  • macOS:
    • install/macos/common/brew.sh の呼び出し
    • install/macos/common/brewfile.sh の呼び出し
    • アーキテクチャ判別と PATH 設定
  • Linux:
    • install/ubuntu/common/ 配下のスクリプト実装
    • パッケージマネージャー対応
  • sudo 権限管理

Phase 3: chezmoi の詳細制御

  • ブランチ指定
  • CI/非TTY対応
  • 暗号化ファイル処理

Phase 4: プライベート dotfiles

  • SSH設定
  • 別リポジトリの初期化

Phase 5: UX改善

  • ロゴ/バナー
  • カラー出力
  • プログレス表示

設計方針

スクリプトの責任分離

  • setup.sh: オーケストレーション層

    • OS検出
    • 環境変数設定
    • 実行順序の制御
    • エラーハンドリング
    • chezmoi の実行
  • install/ 配下: 個別ツールのインストール層(既存構造を維持)

    • OS/ツール固有のインストールロジック
    • 既に DOTFILES_DEBUG 対応済み
    • 独立して実行可能(テストしやすい)

実行フロー(改善後)

setup.sh 実行
  ↓
OS検出(Darwin/Linux)
  ↓
sudo権限管理の開始
  ↓
OS別の初期化
  ├─ macOS: install/macos/common/brew.sh
  │         install/macos/common/brewfile.sh
  └─ Linux: install/ubuntu/common/*.sh
  ↓
chezmoi のセットアップ
  ├─ バイナリのダウンロード
  ├─ リポジトリの初期化
  └─ dotfiles の適用
  ↓
プライベート dotfiles(オプション)
  ↓
シェルの再起動

期待される効果

  • ✅ ワンコマンドでの完全なセットアップ(curl ... | bash で完結)
  • ✅ macOS/Linux 両対応
  • ✅ 既存の install/ 構造を活用(保守性向上)
  • ✅ CI/CD パイプラインでの自動テスト対応
  • ✅ プライベート設定の分離管理
  • ✅ より良いユーザー体験
  • ✅ デバッグしやすい構造

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions