Skip to content

[Phase 2] OS別処理の実装:既存インストールスクリプトの統合 #30

@yellow-seed

Description

@yellow-seed

Parent Issue: #28
Depends on: Phase 1 issue

目的

OS検出に基づいて適切なインストールスクリプトを自動実行し、環境のセットアップを完全自動化する。

実装内容

1. macOS 初期化処理

  • initialize_os_macos() 関数の実装
    • install/macos/common/brew.sh の呼び出し
    • install/macos/common/brewfile.sh の呼び出し
    • スクリプトの存在確認とエラーハンドリング
  • Apple Silicon/Intel の判別と PATH 設定
    if [[ $(arch) == "arm64" ]]; then
        eval "$(/opt/homebrew/bin/brew shellenv)"
    elif [[ $(arch) == "i386" ]]; then
        eval "$(/usr/local/bin/brew shellenv)"
    fi

2. Linux 初期化処理

  • initialize_os_linux() 関数の実装
    • Ubuntu用のパッケージマネージャースクリプト作成
    • install/ubuntu/common/ 配下のスクリプト実装
    • apt/snap などのセットアップ

3. CI/非TTY環境の検出

  • is_ci() 関数の実装
    • CI 環境変数のチェック
  • is_tty() / is_not_tty() 関数の実装
    • [ -t 0 ] での TTY 判定
  • is_ci_or_not_tty() 関数の実装

4. sudo 権限管理

  • keepalive_sudo_linux() 関数の実装
    sudo -v
    while true; do
        sudo -n true
        sleep 60
        kill -0 "$$" || exit
    done 2>/dev/null &
  • keepalive_sudo_macos() 関数の実装
    • Keychain を使用したパスワード管理
    • SUDO_ASKPASS の設定
  • keepalive_sudo() ラッパー関数
    • OS別の処理分岐
  • CI/非TTY環境ではスキップする処理

5. initialize_os_env() の完成

  • Phase 1 で作成した骨組みに実装を追加
  • macOS/Linux それぞれの初期化関数を呼び出し

実装後の動作フロー

setup.sh 実行
  ↓
OS検出(get_os_type)
  ↓
sudo権限管理の開始(keepalive_sudo)※CI/非TTY以外
  ↓
initialize_os_env()
  ├─ macOS の場合
  │   ├─ brew.sh 実行(Homebrew インストール)
  │   ├─ brew shellenv 評価(PATH設定)
  │   └─ brewfile.sh 実行(パッケージインストール)
  └─ Linux の場合
      └─ install/ubuntu/common/*.sh 実行
  ↓
run_chezmoi()
  ↓
完了

テスト

  • macOS での動作確認
    • Homebrew がインストールされること
    • Brewfile のパッケージがインストールされること
    • Apple Silicon/Intel 両方での PATH 設定確認
  • Linux(Ubuntu)での動作確認
  • CI環境での動作確認(sudo スキップ)
  • 非TTY環境での動作確認

Ubuntu用スクリプトの作成

install/ubuntu/common/ 配下に以下を作成:

  • apt.sh: apt の更新とベースパッケージのインストール
  • 必要に応じて他のスクリプト

完了条件

  • すべてのチェックボックスが完了
  • macOS/Linux 両方でワンコマンドセットアップが完了
  • CI環境でエラーなく実行できる
  • テストが通過
  • PRがマージされている

関連

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