# バッチ設計書 10-CI

## 概要

本ドキュメントは、Tailwind CSSプロジェクトにおけるCI/CDワークフロー `CI` のバッチ設計書である。push/PR時にWindows・Linux・macOSでビルド・Lint・テスト・Playwrightテストを実行するGitHub Actionsワークフローの仕様を定義する。

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

本バッチは、GitHub ActionsのCIワークフローとして、コードの品質保証を行うための自動テスト・ビルド・リントを3つのOSプラットフォームで実行する。

**業務上の目的・背景**：Tailwind CSSはクロスプラットフォーム対応のツールであり、Windows・Linux・macOSでの動作保証が必要である。コードの品質を維持するため、全てのpushとPRに対して自動的にビルド・テスト・リントを実行し、問題を早期に検出する。mainブランチでのテスト失敗時にはDiscord通知により開発チームに即座にアラートが送られる。

**バッチの実行タイミング**：mainブランチへのpush時と、全てのPull Request時に自動実行される。

**主要な処理内容**：
1. ソースコードのチェックアウト
2. pnpmとNode.jsのセットアップ（キャッシュ有効）
3. Cargoとoxideビルドのキャッシュ復元
4. WASMターゲットのセットアップ
5. 依存パッケージのインストール
6. 全パッケージのビルド（Rustネイティブモジュールを含む）
7. Lint実行（Linux環境のみ）
8. テスト実行（Vitest + Cargo test）
9. Playwrightブラウザテスト実行
10. mainブランチでのテスト失敗時にDiscord通知

**前後の処理との関連**：PRのマージ可否判定の基準となる。mainブランチへのpushが成功すると、後続のrelease-insidersワークフローが実行される可能性がある。

**影響範囲**：CI環境でのみ実行されるため、ソースコードやプロダクション環境には影響しない。PRのステータスチェックに影響する。

## バッチ種別

CI/CD / 自動テスト・ビルド

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | イベント駆動（push/PR時） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | mainブランチへのpush / Pull Request |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| GitHub Actionsの有効化 | リポジトリでGitHub Actionsが有効であること |
| シークレットの設定 | DISCORD_WEBHOOK_URL がリポジトリシークレットに設定されていること（通知用） |
| ランナーの利用可能性 | windows-latest, namespace-profile-default, macos-14 のランナーが利用可能であること |

### 実行可否判定

- mainブランチへのpush: 全プラットフォーム（Windows/Linux/macOS）で実行
- Pull Request: デフォルトではLinuxのみ実行。以下の条件で全プラットフォーム実行：
  - PRのbodyに `[ci-all]` が含まれる場合
  - PRの作成者が `depfu[bot]` の場合
- 同じワークフローの並行実行はキャンセルされる（concurrency設定）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | トリガーイベントに基づいて自動実行される |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| リポジトリソースコード | Git | テスト・ビルド対象のコードベース |
| Cargo.lock | TOML | Rustのキャッシュキーに使用 |
| pnpm-lock.yaml | YAML | Node.jsパッケージのキャッシュに使用 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| GitHub Actions ステータス | CI結果 | テスト結果（成功/失敗）がPRのステータスチェックに反映 |
| Discord通知（失敗時のみ） | メッセージ | mainブランチでテスト失敗時にDiscord Webhookで通知 |

### 出力ファイル仕様

CI環境内で生成されるビルド成果物はワークフロー内で消費される。永続的なファイル出力はない。

## 処理フロー

### 処理シーケンス

```
1. トリガー検出
   └─ push（mainブランチ）またはPull Requestイベントを検出
2. マトリクス構築
   └─ Windows/Linux/macOSの3プラットフォーム（PR時はLinuxのみが基本）
3. チェックアウト
   └─ actions/checkout@v6 でソースコードを取得
4. ツールセットアップ
   └─ pnpm/action-setup@v4 でpnpmをセットアップ
   └─ actions/setup-node@v6 でNode.js 24をセットアップ（pnpmキャッシュ有効）
5. キャッシュ復元
   └─ Cargoキャッシュ（~/.cargo/bin, registry, target/）
   └─ Oxideビルドキャッシュ（.node, .wasm, .js等）
6. WASMターゲット追加
   └─ rustup target add wasm32-wasip1-threads
7. 依存インストール
   └─ pnpm install
8. ビルド
   └─ pnpm run build（CARGO_PROFILE_RELEASE_LTO=off, Windows時はlld-link指定）
9. Lint（Linuxのみ）
   └─ pnpm run lint
10. テスト
    └─ pnpm run test（cargo test + vitest）
11. Playwrightテスト
    └─ npx playwright install --with-deps
    └─ npm run test:ui
12. 通知（条件付き）
    └─ mainブランチでテスト失敗時にDiscord通知
```

### フローチャート

```mermaid
flowchart TD
    A[push/PRイベント] --> B{全プラットフォーム実行?}
    B -->|はい| C[Windows/Linux/macOS]
    B -->|いいえ| D[Linuxのみ]
    C --> E[チェックアウト]
    D --> E
    E --> F[pnpm + Node.js セットアップ]
    F --> G[Cargo/Oxideキャッシュ復元]
    G --> H[WASM ターゲット追加]
    H --> I[pnpm install]
    I --> J[pnpm run build]
    J --> K{Linuxか?}
    K -->|はい| L[pnpm run lint]
    K -->|いいえ| M[テスト実行]
    L --> M
    M --> N[Playwright テスト]
    N --> O{mainブランチ かつ 失敗?}
    O -->|はい| P[Discord通知]
    O -->|いいえ| Q[ワークフロー終了]
    P --> Q
```

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

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

本バッチではデータベース操作は行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ビルド失敗 | コンパイルエラー | エラーログを確認してコードを修正 |
| - | Lint失敗 | コードスタイル違反 | prettier等でフォーマットを修正 |
| - | テスト失敗 | テストケースの不一致 | テストまたはコードを修正 |
| - | Playwrightテスト失敗 | UIテストの不一致 | UIテストまたはコンポーネントを修正 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（GitHub Actionsの手動再実行は可能） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

テスト失敗時は、GitHub Actionsのログを確認して原因を特定する。mainブランチでの失敗はDiscord通知により開発チームに通知される。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 全テストスイート（Vitest + Cargo test + Playwright） |
| 目標処理時間 | タイムアウト30分以内 |
| メモリ使用量上限 | ランナーの標準メモリ（GitHub Actions標準） |

## 排他制御

同じワークフローの同じブランチに対する並行実行は `concurrency` 設定によりキャンセルされる（`cancel-in-progress: true`）。グループキーは `{workflow名}-{ref}` の形式。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| ビルドログ | ビルド実行時 | pnpm run build の出力 |
| テストログ | テスト実行時 | vitest / cargo test の結果 |
| Lintログ | Lint実行時 | prettier --check の結果 |
| Playwrightログ | UIテスト時 | Playwrightテストの結果 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| テスト結果 | 失敗（mainブランチのみ） | Discord Webhook |
| ジョブタイムアウト | 30分 | GitHub Actions（自動） |

## 備考

- Node.jsバージョンは24を使用（環境変数 `NODE_VERSION` で管理）
- Lint（prettier）はLinux環境でのみ実行される（改行コード `\r\n` の問題を回避するため）
- Cargoのリリースビルドでは LTO（Link Time Optimization）を無効化（`CARGO_PROFILE_RELEASE_LTO=off`）して高速化している
- Windows環境では `lld-link` リンカーを使用（`CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER=lld-link`）
- キャッシュは `Cargo.lock` のハッシュ値とCratesソースのハッシュ値をキーとして使用
- `fail-fast: false` により、1つのプラットフォームが失敗しても他のプラットフォームのテストは継続される
- PRのbodyに `[ci-all]` を含めるか、depfu[bot]のPRの場合は全プラットフォームでテストが実行される
- パーミッション設定：`contents: read` のみ（最小権限の原則）
