# バッチ設計書 10-build:browser:full

## 概要

本ドキュメントは、Cakefileに定義された `build:browser:full` タスクの設計仕様を記述したものです。ブラウザ用CoffeeScriptコンパイラをビルドし、ブラウザテストを実行します。

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

`cake build:browser:full` コマンドは、`build:browser` タスクを実行してブラウザ用コンパイラをビルドした後、`test:browser` タスクを実行してヘッドレスブラウザでのテストを行う統合タスクです。

**業務上の目的・背景**：ブラウザ用にバンドルされたCoffeeScriptコンパイラが正しく動作することを検証するため、ビルドとテストを一連の流れで実行する必要があります。このタスクは、ブラウザ版コンパイラの品質を保証するために、ビルド後に自動的にブラウザテストを実行します。リリース前やブラウザ関連の変更後に使用することで、ブラウザ環境での動作を確認できます。

**バッチの実行タイミング**：随時（手動実行）。ブラウザ版コンパイラの変更後、またはリリース前に実行します。

**主要な処理内容**：
1. build:browserタスクの呼び出し（invoke）
   - レガシー版とモダン版のブラウザコンパイラを生成
2. 完了メッセージの出力
3. test:browserタスクの呼び出し（invoke）
   - Puppeteerを使用したヘッドレスブラウザテスト

**前後の処理との関連**：`build:browser` と `test:browser` タスクを順次実行します。`release` タスクの一部としても呼び出されます。

**影響範囲**：
- ブラウザ用コンパイラファイルの生成（build:browserと同じ）
- テスト結果はプロセスのexit codeに反映

## バッチ種別

ビルド処理 / テスト実行

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | なし（手動実行） |
| 実行曜日 | なし |
| 実行日 | なし |
| トリガー | 手動 / releaseタスク |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js 6以上 | ビルド・テスト実行に必要なランタイム |
| Babelモジュール | トランスパイルに必要（devDependencies） |
| Puppeteerモジュール | ヘッドレスブラウザテストに必要（devDependencies） |
| ビルド済みコンパイラ | lib/coffeescript/配下のJSファイル |
| テストファイル | test/配下のテストスクリプト |
| ドキュメントテストページ | docs/vX/test.html |

### 実行可否判定

1. Node.jsランタイムの存在確認
2. Babelモジュールのインストール確認
3. Puppeteerモジュールのインストール確認
4. lib/coffeescript/配下のファイル存在確認

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | cake build:browser:fullは引数を受け付けません |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| lib/coffeescript/*.js | JavaScript | コンパイラモジュール |
| package.json | JSON | バージョン情報等 |
| test/*.coffee | CoffeeScript | テストスクリプト |
| documentation/site/test.html | HTML | テストページテンプレート |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| docs/vX/browser-compiler-legacy/coffeescript.js | JavaScript | レガシーブラウザ向け |
| docs/vX/browser-compiler-modern/coffeescript.js | JavaScript | モダンブラウザ向け |
| lib/coffeescript-browser-compiler-legacy/coffeescript.js | JavaScript | レガシーブラウザ向け（npm配布用） |
| lib/coffeescript-browser-compiler-modern/coffeescript.js | JavaScript | モダンブラウザ向け（npm配布用） |
| 標準出力 | テキスト | ビルド完了メッセージ、テスト結果 |
| プロセスexit code | 数値 | 0=成功、1=失敗 |

### 出力ファイル仕様

build:browserタスクと同じです。詳細は9-build_browser.mdを参照してください。

## 処理フロー

### 処理シーケンス

```
1. cake build:browser:fullコマンド実行
   └─ Cakefileのbuild:browser:fullタスクを呼び出し
2. invoke('build:browser')
   └─ ブラウザ用コンパイラのビルド
   └─ レガシー版・モダン版の生成
3. コンソールログ出力
   └─ "built ... running browser tests:"
4. invoke('test:browser')
   └─ HTTPサーバー起動（ポート8080）
   └─ Puppeteerでヘッドレスブラウザ起動
   └─ test.htmlを開いてテスト実行
   └─ 結果を取得して表示
5. テスト結果判定
   └─ 成功：正常終了
   └─ 失敗：process.exit(1)
```

### フローチャート

```mermaid
flowchart TD
    A[cake build:browser:full] --> B[invoke build:browser]
    B --> C[ブラウザコンパイラ生成]
    C --> D[レガシー版生成]
    D --> E[モダン版生成]
    E --> F[console.log: built ... running browser tests]
    F --> G[invoke test:browser]
    G --> H[HTTPサーバー起動: port 8080]
    H --> I[Puppeteer: ブラウザ起動]
    I --> J[test.htmlを開く]
    J --> K[テスト実行]
    K --> L[#result要素を待機]
    L --> M[結果テキスト取得]
    M --> N{テスト結果}
    N -->|成功| O[緑色で結果表示]
    N -->|失敗| P[赤色で結果表示]
    P --> Q[process.exit 1]
    O --> R[正常終了]
```

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

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

本バッチはデータベース操作を行いません。

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | ビルドエラー | build:browserが失敗 | build:browserのエラーを確認 |
| 1 | テスト失敗 | ブラウザテストが失敗 | テスト結果を確認して修正 |
| 1 | Puppeteerエラー | ヘッドレスブラウザの起動に失敗 | Puppeteerのインストールを確認 |
| 1 | タイムアウト | テスト結果の待機がタイムアウト（60秒） | テストの実行時間を確認 |

### リトライ仕様

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

### 障害時対応

- ビルドエラー発生時：build:browserタスクのエラーを確認
- テスト失敗時：テスト結果の詳細を確認して修正
- Puppeteerエラー：`npm install puppeteer` でインストール確認

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし |
| コミットタイミング | なし |
| ロールバック条件 | なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 4ファイル出力 + テスト実行 |
| 目標処理時間 | 30秒〜1分 |
| メモリ使用量上限 | Node.jsデフォルト制限 + ブラウザメモリ |

## 排他制御

- 同時実行は推奨されない
  - 出力ファイルの競合の可能性
  - ポート8080の競合の可能性

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| ビルド完了ログ | ビルド後 | "built ... running browser tests:" |
| テスト結果ログ | テスト完了後 | "passed X tests in Y seconds" または失敗詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| exit code | 0以外 | CI/CDシステム |
| テスト実行時間 | 60秒（タイムアウト） | 標準エラー出力 |

## 備考

- このタスクは `invoke()` を使用して他のタスクを呼び出します
- invoke()はCakefile内で定義されたタスクを同期的に呼び出す関数です
- test:browserタスクでは以下の処理が行われます：
  - httpモジュールで簡易Webサーバーを起動（ポート8080）
  - docs/vX/test.htmlを配信
  - browser-compiler-modern/coffeescript.jsをES moduleとして配信
  - Puppeteerでヘッドレスブラウザを起動
  - test.htmlにアクセスしてテストを実行
  - #result要素の出現を待機（最大60秒）
  - 結果テキストを取得して成功/失敗を判定
- テスト結果に"failed"が含まれる場合はテスト失敗と判定
- Puppeteerのlaunch()は設定なしでデフォルトのヘッドレスモードで起動
- テスト完了後、ブラウザとHTTPサーバーは適切にクローズされます
- `release` タスクでは build:browser:full は直接呼び出されず、build:browser と test:browser が個別に呼び出されます
