# バッチ設計書 5-run.js

## 概要

本ドキュメントは、Prettierのリリースステップを順次実行するスクリプト `scripts/release/run.js` の設計仕様を記載したものです。

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

本バッチは、Prettierの新バージョンリリースに必要な全てのステップを定義し、順番に実行します。バージョン選択からnpm公開、ブログ記事のマージまで、リリースプロセス全体を自動化します。

**業務上の目的・背景**：Prettierのリリースは多くの手順を正確に実行する必要があり、手動では漏れやミスが発生しやすいプロセスです。本バッチは、リリースに必要な全ステップを一元管理し、条件分岐やスキップロジックを含む自動化されたワークフローを提供することで、一貫性のある高品質なリリースを実現します。

**バッチの実行タイミング**：release.jsから呼び出され、リリースプロセスの本体として実行されます。手動リリースと自動リリース（ボットリリース）の両方に対応しています。

**主要な処理内容**：
1. 前バージョンの取得と検証
2. 新バージョンの選択または検証
3. gitステータスの確認
4. 依存パッケージのインストール（手動リリース時）
5. バージョン番号の更新
6. バンドルの生成（ビルド）
7. changelogの更新
8. git commit/push
9. npm公開（手動）またはボットリリースの待機
10. リリース後の指示表示
11. ブログ記事PRのマージ
12. 依存パッケージ数の更新
13. changelogのクリーンアップ
14. Prettierバージョンのバンプ
15. 公開後のステップ実行

**前後の処理との関連**：release.jsから呼び出されます。各ステップは steps/index.js からインポートされた個別の処理モジュールで構成されています。

**影響範囲**：package.json（バージョン更新）、CHANGELOG.md、gitリポジトリ（コミット・プッシュ）、npmレジストリ（パッケージ公開）、GitHubリリース、ブログ記事。

## バッチ種別

リリース処理 / ワークフロー自動化

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（リリース時） |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | release.jsからの呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| release.js完了 | git fetch --tagsとyarn installが完了していること |
| 前バージョン | node_modules/prettierに有効なバージョンが存在すること |
| Git権限 | リモートリポジトリへのpush権限があること |
| npm権限 | npmレジストリへの公開権限があること（手動リリース時） |

### 実行可否判定

前バージョンがsemverで解析できない場合はエラーとなります。--dryオプションで実際の変更を行わないドライラン実行が可能です。

## 入力仕様

### 入力パラメータ

parseArguments()で解析されるコマンドライン引数：

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --version | string | No | - | リリースするバージョンを指定 |
| --dry | boolean | No | false | ドライランモード（実際の変更を行わない） |
| --manual | boolean | No | false | 手動リリースモード |
| --next | boolean | No | false | nextリリースモード |
| --skip-dependencies-install | boolean | No | false | 依存パッケージインストールをスキップ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| prettier/package.json | JSON | 前バージョン番号の取得元 |
| package.json | JSON | 現在のバージョン番号の取得元 |
| steps/index.js | JavaScript | リリースステップの定義 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| package.json | JSON | 更新されたバージョン番号 |
| CHANGELOG.md | Markdown | 更新されたchangelog |
| Git | コミット・タグ | リリースコミットとタグ |
| npm | パッケージ | 公開されたnpmパッケージ |

### 出力ファイル仕様

各ステップで生成・更新されるファイルの詳細は、個別のステップモジュールを参照してください。

## 処理フロー

### 処理シーケンス

```
1. パラメータ解析
   └─ parseArguments()でCLI引数を解析
2. 前バージョン取得
   └─ prettier/package.jsonからバージョンを取得
   └─ semverで検証
3. リリースステップの順次実行
   └─ 各ステップをforループで実行
   └─ skip条件に応じてスキップ
   └─ name付きステップはlogPromiseでラップ
4. 手動/自動モードの分岐
   └─ manual: publishToNpm
   └─ 自動: waitForBotRelease
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[パラメータ解析]
    B --> C[前バージョン取得]
    C --> D{semver有効?}
    D -->|No| E[エラースロー]
    D -->|Yes| F[chooseVersion]
    F --> G[validateNewVersion]
    G --> H{--dry?}
    H -->|Yes| I[checkGitStatusスキップ]
    H -->|No| J[checkGitStatus]
    I --> K[installDependencies]
    J --> K
    K --> L[updateVersion]
    L --> M[generateBundles]
    M --> N[updateChangelog]
    N --> O[pushToGit]
    O --> P{--manual?}
    P -->|Yes| Q[publishToNpm]
    P -->|No| R[waitForBotRelease]
    Q --> S[showInstructionsAfterNpmPublish]
    R --> S
    S --> T[mergeBlogPost]
    T --> U[updateDependentsCount]
    U --> V[cleanChangelog]
    V --> W[bumpPrettier]
    W --> X[postPublishSteps]
    X --> Y[バッチ終了]
```

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

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

本バッチはデータベースを使用しません。

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

N/A

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Unexpected previousVersion | semverで解析できないバージョン | package.jsonのバージョンを確認 |
| - | Step failure | 各ステップでのエラー | エラーメッセージに基づき対処 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（ステップ単位での再実行が必要） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

各ステップはlogPromise()でラップされており、エラー時にはステップ名とエラー内容が表示されます。--dryオプションでドライランを行い、問題を事前に検出することが推奨されます。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | ステップ単位 |
| コミットタイミング | 各ステップ完了時 |
| ロールバック条件 | 自動ロールバックなし（手動で対処が必要） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回のリリース処理 |
| 目標処理時間 | 全ステップで数分〜数十分 |
| メモリ使用量上限 | Node.jsデフォルト制限に依存 |

## 排他制御

同時実行は禁止です。リリースプロセスは一度に一つのみ実行すべきです。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| ステップ開始ログ | 各ステップ開始時 | ステップ名（logPromise経由） |
| ステップ完了ログ | 各ステップ完了時 | 成功/失敗ステータス |
| エラーログ | エラー発生時 | エラー詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ステップ失敗 | 1件以上 | コンソール出力 |

## 備考

- 15のリリースステップが順番に定義されている
- 各ステップはオブジェクト形式（{name, process, skip}）または関数形式で定義可能
- skip条件により、モードに応じてステップをスキップ
- logPromise()でステップの進捗を視覚的に表示
- semverパッケージでバージョンの検証を実行
- previousVersionOnDefaultBranchで現在のブランチのバージョンも取得
