# バッチ設計書 5-Label PR

## 概要

本ドキュメントは、Decap CMSプロジェクトにおけるLabel PRワークフローのバッチ設計書である。GitHub Actionsで定義されたCI/CDパイプラインのうち、Pull Requestのタイトルプレフィックスに基づいて自動的にラベルを付与する処理について記述する。

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

本バッチは、Pull Requestのタイトルに含まれるプレフィックス（fix/chore/feat/security）に基づいて、対応するラベルを自動的に付与するCI/CDバッチである。PRのオープン・編集時に自動トリガーされ、タイトルの先頭文字列を判定してラベルを設定する。

**業務上の目的・背景**：Decap CMSプロジェクトではConventional Commitsに準拠したPRタイトルが使用されている。PRに適切なラベルを付与することで、リリースノート生成やPR分類が容易になる。手動でのラベル付与は漏れやミスが発生しやすいため、タイトルに基づく自動ラベル付与により、一貫性のあるPR管理を実現する。

**バッチの実行タイミング**：Pull Requestのオープン時（opened）および編集時（edited）にイベント駆動で自動実行される。

**主要な処理内容**：
1. PRイベントの検出とフィルタリング（Fork PRとdependabotは除外）
2. PRタイトルのプレフィックス判定（fix/chore/feat/security）
3. 対応するラベルの付与（type: bug / type: chore / type: feature / type: security）

**前後の処理との関連**：本バッチは独立して動作し、他のバッチとの依存関係はない。付与されたラベルはリリースノート生成やPRフィルタリングに使用される可能性がある。

**影響範囲**：Pull Requestのラベルが自動的に設定される。ラベルに基づくフィルタリングやリリースノート生成に影響する。

## バッチ種別

CI/CD（自動化 - PR管理）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | イベント駆動（随時） |
| 実行時刻 | 該当なし（PRイベント発生時） |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | Pull Requestのopened/edited |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| PRイベントの発生 | Pull Requestがオープンまたは編集されること |
| ForkからのPRでないこと | github.event.pull_request.head.repo.fork == falseであること |
| dependabotでないこと | github.actor != 'dependabot[bot]'であること |
| GITHUB_TOKENシークレット | ラベル付与に必要なトークンが利用可能であること |

### 実行可否判定

以下の条件が全てtrueの場合にジョブが実行される：
- `github.event_name == 'pull_request'`
- `github.event.pull_request.head.repo.fork == false`
- `github.actor != 'dependabot[bot]'`

ForkからのPRはセキュリティ上の理由（GITHUB_TOKENの権限制限）から除外される。dependabotのPRは自動管理されるため除外される。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| github.event.pull_request.title | 文字列 | Yes | - | PRのタイトル（プレフィックス判定に使用） |
| GITHUB_TOKEN | シークレット | Yes | secrets.GITHUB_TOKEN | GitHub API認証トークン |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Pull Requestイベントペイロード | JSON | PRのタイトル、リポジトリ情報、アクター情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| Pull Requestラベル | GitHub API | PRに付与されるラベル |
| GitHub Actionsログ | テキスト | ラベル付与の実行ログ |

### 出力ファイル仕様

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

| 項目 | 内容 |
|-----|------|
| ファイル名 | 該当なし |
| 出力先 | GitHub Pull Requestラベル |
| 文字コード | 該当なし |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. ワークフロートリガー
   └─ Pull Requestのopened/editedイベントを検出
2. 実行条件チェック
   └─ ForkからのPRでなく、dependabotでないことを確認
3. ラベル付与判定・実行（各条件は独立して評価）
   ├─ タイトルが'fix'で始まる場合 → 'type: bug'ラベルを付与
   ├─ タイトルが'chore'で始まる場合 → 'type: chore'ラベルを付与
   ├─ タイトルが'feat'で始まる場合 → 'type: feature'ラベルを付与
   └─ タイトルが'security'で始まる場合 → 'type: security'ラベルを付与
```

### フローチャート

```mermaid
flowchart TD
    A[PRイベント: opened/edited] --> B{Fork PRまたはdependabot?}
    B -->|はい| C[スキップ]
    B -->|いいえ| D{タイトルが'fix'で始まる?}
    D -->|はい| E[ラベル 'type: bug' 付与]
    D -->|いいえ| F{タイトルが'chore'で始まる?}
    F -->|はい| G[ラベル 'type: chore' 付与]
    F -->|いいえ| H{タイトルが'feat'で始まる?}
    H -->|はい| I[ラベル 'type: feature' 付与]
    H -->|いいえ| J{タイトルが'security'で始まる?}
    J -->|はい| K[ラベル 'type: security' 付与]
    J -->|いいえ| L[ラベルなし]
    C --> M[ワークフロー終了]
    E --> M
    G --> M
    I --> M
    K --> M
    L --> M
```

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

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | 該当なし | 該当なし | 該当なし |

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ラベル付与失敗 | GITHUB_TOKENの権限不足の場合 | リポジトリの権限設定を確認する |
| - | ラベル未定義 | 対象ラベルがリポジトリに存在しない場合 | リポジトリのラベル設定で対象ラベルを作成する |

### リトライ仕様

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

### 障害時対応

バッチ（ワークフロー）失敗時は以下の手順で対応する：
1. GitHub Actionsのログでエラー内容を確認する
2. ラベルが存在しない場合はリポジトリにラベルを作成する
3. 必要に応じてPRに手動でラベルを付与する

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（GitHub API単一操作） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1件（1 PRに対するラベル付与） |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 最小（GitHub API呼び出しのみ） |

## 排他制御

明示的な排他制御は設定されていない。PR編集イベントが連続して発生した場合、ラベル付与は冪等（同じラベルの重複付与は問題なし）であるため、排他制御は不要である。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | ジョブ開始時 | GitHub Actionsにより自動的にジョブ開始が記録される |
| ラベル付与ログ | ラベル付与時 | netlify/pr-labeler-actionの実行結果 |
| 終了ログ | ジョブ終了時 | GitHub Actionsにより自動的にジョブ完了ステータスが記録される |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ジョブ成功/失敗 | 失敗時 | GitHub Actionsログ |

## 備考

- netlify/pr-labeler-action@v1.0.0を使用してラベルを付与する
- 4つのプレフィックス（fix/chore/feat/security）のみに対応しており、その他のプレフィックス（docs/refactor/test等）にはラベルが付与されない
- 各ラベル付与ステップは独立したstepとして定義されており、条件に合致するステップのみが実行される
- ForkからのPRが除外されるのは、セキュリティ上の理由（GITHUB_TOKENの権限制限）による
- PRタイトルの大文字・小文字はstartsWith関数のデフォルト動作に依存する
