# バッチ設計書 35-release-github-release

## 概要

本ドキュメントは、リリースプロセスにおいてGitHubリリースドラフトを作成するバッチ「release-github-release」の設計仕様を定義するものである。

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

本バッチは、Babelのリリースプロセスにおいて、CHANGELOGを自動生成し、GitHubリリースドラフトを作成する処理を実行する。

**業務上の目的・背景**：GitHubリリースは、プロジェクトのリリース履歴を管理し、ユーザーに変更内容を伝える重要なコミュニケーションチャネルである。本バッチは、lerna-changelogを使用してPull RequestラベルからCHANGELOGを自動生成し、一貫性のあるリリースノートを作成する。

**バッチの実行タイミング**：git-version（存在する場合）およびensure-npm-packages-existジョブの完了後に実行される。npm-releaseジョブとは並行して実行可能。

**主要な処理内容**：
1. リポジトリをチェックアウト（fetch-depth: 0）
2. mainブランチからのリリースかどうかを判定
3. git-versionジョブが成功した場合、一時ブランチをチェックアウト
4. 前回と今回のリリースタグを取得（v8プレフィックス）
5. Babel 8用のPRラベル設定に切り替え
6. lerna-changelogでCHANGELOGを生成
7. GitHubリリースドラフトを作成

**前後の処理との関連**：git-versionおよびensure-npm-packages-existの完了後に実行。outputs（is-main、changelog、version）は後続のgithub-pushジョブで使用される。

**影響範囲**：GitHubリリースページにドラフトが作成される。CHANGELOGはgithub-pushジョブでCHANGELOG.mdに反映される。

## バッチ種別

リリース処理 / ドキュメント生成

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | イベント駆動 |
| 実行時刻 | 該当なし（イベント発生時） |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | push（tags: v*）/ workflow_dispatch |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| git-version完了（またはスキップ） | 前提ジョブが完了していること |
| ensure-npm-packages-exist成功 | 前提ジョブが正常完了していること |
| GITHUB_TOKEN | CHANGELOGのPR情報取得に必要 |
| BOT_TOKEN | GitHubリリース作成に必要 |

### 実行可否判定

needs.git-versionおよびneeds.ensure-npm-packages-existの完了後に自動的に実行される。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| branch（内部） | string | No | なし | git-versionジョブからの一時ブランチ名 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Git履歴 | Git | 全コミット履歴とタグ |
| package.json | JSON | changelogラベル設定 |
| Pull Request情報 | GitHub API | マージされたPRのラベルと説明 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| GitHubリリース | ドラフト | リリースノート付きドラフト |
| outputs.is-main | boolean | mainブランチからのリリースか |
| outputs.changelog | string | 生成されたCHANGELOG |
| outputs.version | string | リリースバージョン（タグ） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | なし（GitHubリリースとして作成） |
| 出力先 | GitHubリリースページ |
| 文字コード | UTF-8 |
| 区切り文字 | Markdown形式 |

## 処理フロー

### 処理シーケンス

```
1. リポジトリチェックアウト
   └─ actions/checkout@v4 (fetch-depth: 0)
2. mainブランチ判定
   └─ babel/actions/ref-matches-branch@v2
3. 一時ブランチチェックアウト（git-version成功時）
   └─ git checkout $branch
4. リリースタグ取得
   └─ babel/actions/get-release-tags@v2 (prefix: v8)
5. PRラベル設定変更
   └─ package.json の changelog.labels を labels_breaking に置換
6. CHANGELOG生成
   └─ babel/actions/generate-lerna-changelog@v2
7. GitHubリリースドラフト作成
   └─ babel/actions/publish-github-release@v2
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[リポジトリチェックアウト]
    B --> C[mainブランチ判定]
    C --> D{git-version成功?}
    D -->|Yes| E[一時ブランチチェックアウト]
    D -->|No| F[現在のブランチ使用]
    E --> G[リリースタグ取得]
    F --> G
    G --> H[PRラベル設定変更]
    H --> I[CHANGELOG生成]
    I --> J[GitHubリリースドラフト作成]
    J --> K[outputs出力]
    K --> L[バッチ終了]
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | タグ取得失敗 | 前回リリースタグが見つからない | タグ履歴を確認 |
| 1 | CHANGELOG生成失敗 | GitHub API エラー | GITHUB_TOKENを確認 |
| 1 | リリース作成失敗 | BOT_TOKEN権限不足 | トークン権限を確認 |

### リトライ仕様

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

### 障害時対応

1. GitHub Actionsログでエラー内容を確認
2. CHANGELOG生成失敗の場合：GitHub APIレート制限を確認
3. リリース作成失敗の場合：手動でGitHubリリースを作成
4. 必要に応じてワークフローを再実行

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 手動でリリースドラフトを削除 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1リリース |
| 目標処理時間 | 5分以内 |
| メモリ使用量上限 | 該当なし（CI環境依存） |

## 排他制御

- needs設定により、依存ジョブの完了を待機
- npm-releaseジョブとは並行して実行可能

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | チェックアウト時 | リポジトリ・ブランチ情報 |
| 進捗ログ | 各ステップ実行時 | タグ情報、CHANGELOG内容 |
| 終了ログ | バッチ終了時 | 作成されたリリースURL |
| エラーログ | エラー発生時 | エラー詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ジョブ失敗 | 1回 | GitHub Actions UI |
| 実行時間 | 10分 | GitHub Actions UI |

## 備考

- prefix: v8 設定により、v8プレフィックスのタグのみを対象とする（Babel 8リリース用）
- package.jsonのchangelog.labels_breakingは、Babel 8用のPRラベル設定
- BOT_TOKENはリポジトリオーナー権限を持つPersonal Access Token
- Babel 8が安定版になった際は、PRラベル設定の切り替えロジックを削除する予定
- generate-lerna-changelogは、マージされたPRのラベルに基づいてCHANGELOGを自動分類する
