# バッチ設計書 16-setup

## 概要

本ドキュメントは、Wikipedia iOSアプリの開発環境セットアップを一括実行するシェルスクリプト「setup」のバッチ設計書です。

### 本バッチの処理概要

このバッチはWikipedia iOSアプリの開発環境を構築するための初期セットアップを自動化します。Homebrewのインストール、必要なツール（clang-format、swiftlint）の導入、Gitフックの設定、Bundle IDの設定を一括で行い、新規開発者が迅速に開発を開始できる環境を整えます。

**業務上の目的・背景**：オープンソースプロジェクトであるWikipedia iOSアプリには、世界中から多くの開発者が参加しています。各開発者の環境が異なる中で、一貫したコード品質を維持するためには、統一された開発ツールとフックの設定が必要です。このセットアップスクリプトは、開発環境の構築手順を自動化することで、新規参加者のオンボーディング時間を短縮し、環境構築の手順ミスを防止します。また、Gitのpre-commitフックを設定することで、コードフォーマットの一貫性を自動的に保証します。

**バッチの実行タイミング**：新規開発者がリポジトリをクローンした後、手動で1回実行します。

**主要な処理内容**：
1. Homebrewのインストール（未インストールの場合）
2. 開発ツール（clang-format、swiftlint）のインストール
3. Git pre-commitフックの設定（clang-format、strip_header）
4. Bundle IDの設定（開発者のTeam IDに基づく）
5. Xcodeコマンドラインツールのインストール確認

**前後の処理との関連**：このスクリプトはリポジトリクローン後の最初のステップとして実行されます。セットアップ完了後、開発者はXcodeでプロジェクトを開いてビルド・実行が可能になります。

**影響範囲**：.git/hooks/pre-commit、Configurations/OpenSourceDebug.xcconfig、およびシステムのHomebrew環境に影響します。

## バッチ種別

開発ツール / 環境セットアップ

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（初回セットアップ時） |
| 実行時刻 | 不定 |
| 実行曜日 | 不定 |
| 実行日 | 不定 |
| トリガー | 手動実行（新規開発者のオンボーディング時） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| macOS環境 | macOSで実行されること |
| インターネット接続 | Homebrewおよびツールのダウンロードに必要 |
| Git初期化済み | .gitディレクトリが存在すること |
| Bash/Zsh | シェルスクリプト実行環境 |

### 実行可否判定

- 特になし（各サブスクリプトで個別に判定）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| $@ | 文字列 | No | なし | setup_bundle_idに渡される引数（Team ID等） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Xcodeの設定 | plist | IDEProvisioningTeams/IDEProvisioningTeamByIdentifier |
| ユーザー入力 | 対話的入力 | Team IDの選択（setup_bundle_id内） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| .git/hooks/pre-commit | シェルスクリプト | Gitのpre-commitフック |
| Configurations/OpenSourceDebug.xcconfig | テキスト | Team ID設定ファイル |
| システムHomebrew | バイナリ | インストールされたツール |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | pre-commit |
| 出力先 | .git/hooks/ |
| 文字コード | UTF-8 |
| 区切り文字 | なし |

## 処理フロー

### 処理シーケンス

```
1. Homebrewインストール（brew_install）
   └─ setup_homebrew: Homebrewの存在確認、未インストール時はインストール
   └─ clang-formatとswiftlintのインストール
2. Gitフック設定（setup_git_hooks）
   └─ 既存のpre-commitフックを削除
   └─ clang_format_git_diffをpre-commitとしてコピー
   └─ strip_headerを追記
3. Bundle ID設定（setup_bundle_id）
   └─ デフォルトTeam IDを設定
   └─ 対話的にカスタムTeam IDを設定（オプション）
4. Xcodeコマンドラインツール確認
   └─ xcode-select -pで確認
   └─ 未インストール時はxcode-select --installを実行
```

### フローチャート

```mermaid
flowchart TD
    A[setup開始] --> B[scripts/brew_install実行]
    B --> C[setup_homebrew呼び出し]
    C --> D{Homebrew存在?}
    D -->|No| E[Homebrewインストール]
    D -->|Yes| F[スキップ]
    E --> G[clang-format/swiftlintインストール]
    F --> G
    G --> H[scripts/setup_git_hooks実行]
    H --> I[既存pre-commit削除]
    I --> J[clang_format_git_diffコピー]
    J --> K[strip_header追記]
    K --> L[scripts/setup_bundle_id実行]
    L --> M[OpenSourceDebug.xcconfig生成]
    M --> N{xcode-select -p成功?}
    N -->|No| O[xcode-select --install実行]
    N -->|Yes| P[setup完了]
    O --> P
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | - | - | データベース操作なし |

### テーブル別操作詳細

データベース操作は行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非0 | ネットワークエラー | Homebrewインストール失敗 | インターネット接続を確認 |
| 非0 | 権限エラー | ツールインストール失敗 | sudo権限を確認 |
| 1 | 入力エラー | Team ID未入力 | 有効なTeam IDを入力 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

各サブスクリプトを個別に実行し、問題のある箇所を特定してください。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（ファイル操作のみ） |
| コミットタイミング | - |
| ロールバック条件 | - |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回（初期セットアップ） |
| 目標処理時間 | 数分（ネットワーク状況に依存） |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

手動実行のセットアップスクリプトのため、排他制御は不要です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 情報ログ | Homebrew確認時 | "Homebrew already installed!" |
| 情報ログ | Team ID設定時 | "Setting team ID to [TEAM_ID]" |
| 情報ログ | 設定完了時 | "Successfully generated configuration at..." |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| なし | - | - |

## 備考

- 本スクリプトは冪等性があり、複数回実行しても安全です
- Homebrewが既にインストールされている場合はスキップされます
- デフォルトのTeam ID（AKK7J2GV64）はWikimedia Foundationのものです
- 個人開発者は対話プロンプトで自分のTeam IDを設定できます
- pre-commitフックにより、コミット時に自動的にコードフォーマットが適用されます
- インストールされるツール：
  - clang-format: C/Objective-Cコードのフォーマット
  - swiftlint: Swiftコードの静的解析

### サブスクリプト一覧

| スクリプト | 説明 |
|-----------|------|
| scripts/brew_install | Homebrew環境とツールのセットアップ |
| scripts/setup_homebrew | Homebrewのインストール |
| scripts/setup_git_hooks | Gitフックの設定 |
| scripts/setup_bundle_id | Bundle IDの設定 |
| scripts/clang_format_git_diff | pre-commitフック（コードフォーマット） |
| scripts/strip_header | pre-commitフック（ヘッダー処理） |
