# バッチ設計書 12-test:ci

## 概要

本ドキュメントは、Decap CMSプロジェクトにおけるCI環境向けテスト実行バッチ `test:ci` の設計仕様を定義する。本バッチはCI環境に最適化されたリント（quietモード）、型チェック、ユニットテストを順次実行する。

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

本バッチは、CI（Continuous Integration）環境でのビルドパイプラインにおいて、コード品質を自動検証するためのテストスクリプトである。No.11 test と同等の検証を行うが、lintの出力をquietモードにすることでCI環境でのログ出力を簡潔にしている。

**業務上の目的・背景**：GitHub Actions上でmain/masterブランチへのpushやPR時に自動実行され、コードベースの品質ゲートとして機能する。CI環境ではログの冗長さを抑える必要があるため、lintをquietモードで実行する専用バッチが用意されている。Node CI ワークフロー（.github/workflows/nodejs.yml）のbuild-unitジョブから呼び出される。

**バッチの実行タイミング**：main/masterブランチへのpush時、またはPR（opened/synchronize/reopened）時にGitHub Actionsから自動実行される。複数OS（Ubuntu/macOS/Windows）とNode.jsバージョン（22.x/24.x）のマトリクスで並列実行される。

**主要な処理内容**：
1. `npm run lint-quiet` - CSSリントとJS/TSリントをquietモード（--quiet オプション付き）で並列実行
2. `npm run type-check` - TypeScriptの型チェック（tsc --noEmit）を実行
3. `npm run test:unit` - Jestによるユニットテストを実行（cross-env NODE_ENV=test jest --no-cache）

**前後の処理との関連**：GitHub Actionsワークフローではchangesジョブでパス変更検出後、本バッチがbuild-unitジョブとして実行される。E2Eテスト（No.14 test:e2e:ci）は別ジョブとして並列実行される。CIでのCypressバイナリのインストールはスキップされる（CYPRESS_INSTALL_BINARY=0）。

**影響範囲**：プロジェクト全体のソースコードが検証対象。CI環境でのテスト失敗はPRのマージをブロックする品質ゲートとして機能する。

## バッチ種別

テスト実行（CI環境向けリント・型チェック・ユニットテスト統合実行）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | イベント駆動 |
| 実行時刻 | イベント発生時 |
| 実行曜日 | なし |
| 実行日 | なし |
| トリガー | main/masterブランチへのpush、PRのopened/synchronize/reopened |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js | Node.js 22.x または 24.x がインストールされていること |
| 依存パッケージ | `npm ci` で依存関係がインストール済みであること（CYPRESS_INSTALL_BINARY=0） |
| パス変更検出 | dorny/paths-filter で website 以外のファイル変更が検出されていること |

### 実行可否判定

GitHub Actionsのchangesジョブにおいて、`dorny/paths-filter` により `!website/**` パターンに一致するファイル変更が検出された場合のみ実行される（`needs.changes.outputs.cms == 'true'`）。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| NODE_ENV | 環境変数 | No | test（test:unit実行時に自動設定） | テスト実行環境を指定 |
| CYPRESS_INSTALL_BINARY | 環境変数 | No | 0（CIワークフローで設定） | Cypressバイナリのインストールをスキップ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| packages/*/src/**/*.{js,jsx,ts,tsx} | ソースコード | リント・型チェック・テスト対象のソースファイル |
| packages/**/*.{css,scss} | スタイルシート | CSSリント対象のスタイルファイル |
| packages/**/__tests__/**/*.{js,jsx,ts,tsx} | テストコード | Jestユニットテストファイル |
| jest.config.js | 設定ファイル | Jestテスト設定 |
| tsconfig.json | 設定ファイル | TypeScript型チェック設定 |
| .eslintrc.js | 設定ファイル | ESLint設定 |
| .stylelintrc | 設定ファイル | Stylelint設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | リント結果（quietモード）、型チェック結果、テスト結果 |
| 標準エラー出力 | テキスト | エラー詳細のみ出力（quietモード） |
| プロセス終了コード | 数値 | 0: 成功、1以上: 失敗 |
| GitHub Actions ステータス | ステータス | ジョブの成功/失敗がPRステータスに反映 |

### 出力ファイル仕様

本バッチはファイル出力を行わない。

## 処理フロー

### 処理シーケンス

```
1. lint-quiet実行
   ├─ lint:css --quiet（stylelint quietモード）を並列起動
   └─ lint:js --quiet（eslint quietモード）を並列起動
   └─ 両方の完了を待機、いずれか失敗でエラー終了
2. type-check実行
   └─ tsc --noEmit でTypeScript型チェックを実行
   └─ 型エラーがあればエラー終了
3. test:unit実行
   └─ cross-env NODE_ENV=test jest --no-cache で全ユニットテストを実行
   └─ テスト失敗があればエラー終了
```

### フローチャート

```mermaid
flowchart TD
    A[GitHub Actions トリガー] --> A1{パス変更検出}
    A1 -->|website以外の変更あり| B[npm ci - CYPRESS_INSTALL_BINARY=0]
    A1 -->|変更なし| Z2[スキップ]
    B --> C[lint-quiet実行]
    C --> C1[lint:css --quiet]
    C --> C2[lint:js --quiet]
    C1 --> D{lint成功?}
    C2 --> D
    D -->|失敗| Z[エラー終了]
    D -->|成功| E[type-check実行: tsc --noEmit]
    E --> F{型チェック成功?}
    F -->|失敗| Z
    F -->|成功| G[test:unit実行: jest --no-cache]
    G --> H{テスト成功?}
    H -->|失敗| Z
    H -->|成功| I[バッチ正常終了]
```

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

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

本バッチはデータベースへのアクセスを行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | リントエラー | ESLintまたはStylelintのルール違反検出 | エラー箇所を修正してPRを更新 |
| 1 | 型チェックエラー | TypeScript型エラー検出 | 型定義を修正してPRを更新 |
| 1 | テスト失敗 | Jestテストケースの失敗 | テストまたはソースコードを修正してPRを更新 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（PR更新で再トリガー） |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

### 障害時対応

CI環境でのテスト失敗はPRステータスに反映される。開発者はGitHub Actionsのログを確認し、該当箇所を修正後にPRを更新（pushまたはforce-push）することで再実行される。concurrencyグループ設定により、同一ブランチの古い実行はキャンセルされる。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（読み取り専用処理） |
| コミットタイミング | なし |
| ロールバック条件 | なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | モノレポ内全パッケージのソースファイル |
| 目標処理時間 | CI環境で数分以内 |
| メモリ使用量上限 | Node.jsデフォルトヒープサイズ |

## 排他制御

GitHub Actionsのconcurrency設定により、同一ワークフロー・同一refの実行は前回の実行をキャンセルして最新のみ実行される（`cancel-in-progress: true`）。マトリクス実行により複数OS・Node.jsバージョンで並列実行されるが、各ジョブは独立したランナーで実行されるため競合しない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | ジョブ開始時 | Node.jsバージョン、npmバージョンの出力 |
| 進捗ログ | 処理中 | lint-quiet/type-check/test:unitの進捗（quietモードで簡潔出力） |
| 終了ログ | ジョブ終了時 | テスト結果サマリー |
| エラーログ | エラー発生時 | エラー箇所のファイルパス・行番号・エラー内容（quietモード：エラーのみ） |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ジョブ失敗 | 1回 | GitHub PRステータスチェック |
| 処理時間 | GitHub Actionsデフォルトタイムアウト（6時間） | GitHub Actions |

## 備考

- 本バッチは `npm run test:ci` コマンドで実行される
- No.11 test との違いは lint が lint-quiet（--quiet オプション付き）に変更されている点のみ
- GitHub ActionsワークフローのConcurrency設定（`ci-${{ github.workflow }}-${{ github.ref }}`）により、同一ブランチの古いCI実行は自動キャンセルされる
- build-unitジョブではCypressバイナリのインストールをスキップ（CYPRESS_INSTALL_BINARY=0）して高速化している
- マトリクス戦略: Ubuntu(22.x, 24.x), macOS(24.x), Windows(24.x) で実行、fail-fast: true
