# バッチ設計書 16-size-report.yml

## 概要

本ドキュメントは、GitHub Actionsによるサイズレポート生成ワークフロー `.github/workflows/size-report.yml` のバッチ設計書である。size-dataワークフロー完了後にサイズ比較レポートを生成し、PRコメントとして投稿する。

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

size-dataワークフローの完了をトリガーとして実行され、現在のPRのビルドサイズデータと前回のベースブランチのサイズデータを比較するMarkdownレポートを生成し、PRコメントとして投稿するワークフローである。

**業務上の目的・背景**：PRによるバンドルサイズの変化を可視化し、レビュアーがサイズへの影響を即座に把握できるようにする。サイズの増減をMarkdownテーブル形式でPRコメントに自動投稿することで、パフォーマンスへの影響を定量的に評価可能にする。コメントは1つのPRに対して1つのみ維持される（上書き方式）。

**バッチの実行タイミング**：size-dataワークフロー（`size data`）が成功完了した後に、`workflow_run` トリガーにより自動実行される。PRイベント時のsize-dataワークフロー完了のみを対象とする。

**主要な処理内容**：
1. 現在のPRのサイズデータ（size-dataアーティファクト）をダウンロード
2. PR番号とベースブランチ名をアーティファクト内のテキストファイルから読み取り
3. ベースブランチの前回サイズデータをダウンロード
4. `node scripts/size-report.js` でサイズ比較レポート（Markdown）を生成
5. `actions-cool/maintain-one-comment` でPRに1つのコメントとして投稿（既存コメントは更新）

**前後の処理との関連**：size-data.ymlワークフローの後続処理として実行される。size-data.ymlでアップロードされたアーティファクトと、ベースブランチの過去のアーティファクトを使用する。サイズレポートの生成には `scripts/size-report.js` スクリプトが使用される。

**影響範囲**：PRのコメント欄にサイズレポートが投稿・更新される。vuejs/coreリポジトリでのみ実行される。

## バッチ種別

CI/CD（レポート生成・通知）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | イベント駆動（workflow_run完了時） |
| 実行時刻 | 指定なし |
| 実行曜日 | 指定なし |
| 実行日 | 指定なし |
| トリガー | workflow_run（size dataワークフロー完了時） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| GitHub Actionsランナー | ubuntu-latestが利用可能であること |
| permissions | contents: read, pull-requests: write, issues: write |
| size-dataアーティファクト | size-dataワークフローでアーティファクトがアップロードされていること |
| GITHUB_TOKEN | PRコメント投稿に必要な権限が付与されていること |

### 実行可否判定

以下の3条件が全て満たされた場合のみ実行される：
1. `github.repository == 'vuejs/core'`（vuejs/coreリポジトリ）
2. `github.event.workflow_run.event == 'pull_request'`（PRイベントのworkflow_run）
3. `github.event.workflow_run.conclusion == 'success'`（size-dataワークフローが成功）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | workflow_runイベントから自動取得 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| size-dataアーティファクト（現在のPR） | ファイル群 | temp/size配下のサイズデータ |
| size-dataアーティファクト（ベースブランチ） | ファイル群 | temp/size-prev配下のサイズデータ |
| temp/size/number.txt | テキスト | PR番号 |
| temp/size/base.txt | テキスト | ベースブランチ名 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| PRコメント | Markdown | サイズ比較レポート（`<!-- VUE_CORE_SIZE -->` マーカー付き） |
| size-report.md | Markdown | 中間ファイルとしてのサイズレポート |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | size-report.md |
| 出力先 | ワークスペースルート |
| 文字コード | UTF-8 |
| 区切り文字 | Markdown形式 |

## 処理フロー

### 処理シーケンス

```
1. チェックアウト（actions/checkout@v6）
2. pnpm / Node.js セットアップ
3. 依存関係インストール（pnpm install）
4. 現在のPRのサイズデータダウンロード
   └─ dawidd6/action-download-artifact@v12 で size-data をダウンロード
5. PR番号読み取り（temp/size/number.txt）
6. ベースブランチ名読み取り（temp/size/base.txt）
7. 前回のサイズデータダウンロード
   └─ dawidd6/action-download-artifact@v12 でベースブランチの size-data をダウンロード
   └─ アーティファクトが存在しない場合は警告のみ（if_no_artifact_found: warn）
8. サイズレポート生成
   └─ node scripts/size-report.js > size-report.md
9. サイズレポート読み取り
10. PRコメント投稿・更新
    └─ actions-cool/maintain-one-comment@v3 でPRにコメント
    └─ <!-- VUE_CORE_SIZE --> マーカーで既存コメントを識別・更新
```

### フローチャート

```mermaid
flowchart TD
    A[size data ワークフロー完了] --> B{実行条件チェック}
    B -->|条件充足| C[チェックアウト / セットアップ]
    B -->|条件不足| Z[スキップ]
    C --> D[pnpm install]
    D --> E[現在PRのサイズデータダウンロード]
    E --> F[PR番号・ベースブランチ読み取り]
    F --> G[前回サイズデータダウンロード]
    G --> H[node scripts/size-report.js]
    H --> I[サイズレポート読み取り]
    I --> J[PRコメント投稿/更新]
    J --> K[ワークフロー完了]
    Z --> K
```

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

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

データベース操作なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | アーティファクトダウンロード失敗 | 現在PRのsize-dataが存在しない場合 | size-dataワークフローが正常に完了しているか確認する |
| - | 前回データ不在 | ベースブランチのsize-dataが存在しない場合 | 警告のみ出力し処理を継続する（if_no_artifact_found: warn） |
| - | レポート生成失敗 | size-report.jsの実行が失敗した場合 | スクリプトのエラーを調査する |
| - | コメント投稿失敗 | PRコメント投稿の権限不足等 | GITHUB_TOKENの権限を確認する |

### リトライ仕様

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

### 障害時対応

ワークフローを再実行する。前回データが存在しない場合は、初回実行として差分なしのレポートが生成される。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1ジョブ |
| 目標処理時間 | GitHub Actionsの実行時間制限内 |
| メモリ使用量上限 | GitHub Actionsランナーのデフォルトリソースに依存 |

## 排他制御

明示的な排他制御設定なし。ただし、同一PRに対するコメントは `<!-- VUE_CORE_SIZE -->` マーカーにより1つに維持される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| ダウンロード結果 | アーティファクトダウンロード時 | ダウンロードの成功/失敗/警告 |
| レポート生成結果 | size-report.js実行時 | サイズ比較レポート内容 |
| コメント投稿結果 | コメント投稿時 | 投稿の成功/失敗 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ワークフロー実行結果 | 失敗時 | GitHubリポジトリの通知設定に依存 |

## 備考

- `dawidd6/action-download-artifact@v12` はworkflow_runコンテキストから別のワークフロー実行のアーティファクトをダウンロードするために使用される
- `juliangruber/read-file-action@v1` はファイル内容をステップ出力として取得するために使用される
- `actions-cool/maintain-one-comment@v3` は `body-include` パラメータで既存コメントの識別と更新を行う
- `<!-- VUE_CORE_SIZE -->` マーカーにより、同一PRに対して常に1つのサイズレポートコメントのみが維持される
- 前回のサイズデータダウンロード時に `if_no_artifact_found: warn` を設定しているため、初回PRやベースブランチのデータがない場合でもワークフローは失敗しない
