# バッチ設計書 37-update-compat-data

## 概要

本ドキュメントは、compat-tableデータを定期的に更新するバッチ「update-compat-data」の設計仕様を定義するものである。

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

本バッチは、kangax/compat-tableリポジトリから最新の互換性データを取得し、Babelのcompat-dataパッケージを更新するための自動化処理を実行する。

**業務上の目的・背景**：Babelの@babel/preset-envは、ターゲットブラウザ/環境に基づいて必要な変換を決定する。この判断にはcompat-tableの互換性データが使用される。kangax/compat-tableは継続的に更新されるため、Babelも定期的にこのデータを取り込む必要がある。本バッチはこの更新プロセスを自動化し、手作業を削減する。

**バッチの実行タイミング**：毎週金曜日の午前0時（UTC）にスケジュール実行される。また、workflow_dispatchによる手動実行も可能。

**主要な処理内容**：
1. BabelリポジトリとkangaxのCompat-tableリポジトリをチェックアウト
2. compat-tableの最新コミットSHAを取得
3. download-compat-table.shのCOMPAT_TABLE_COMMITを更新
4. 変更がある場合、bootstrapを実行して依存関係をインストール
5. make build-compat-dataでcompat-dataをビルド
6. Jestテストを更新モード(-u)で実行してフィクスチャを更新
7. Babel 8環境でもテストフィクスチャを更新
8. 変更をコミットしてupdate-compat-dataブランチにプッシュ
9. Pull Requestを自動作成

**前後の処理との関連**：独立した定期実行バッチであり、他のジョブとの依存関係はない。作成されたPull Requestは人間によるレビュー後にマージされる。

**影響範囲**：packages/babel-compat-dataパッケージの互換性データが更新される。これはpreset-envの動作に影響する。

## バッチ種別

データ連携 / 定期更新

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 週次 |
| 実行時刻 | 00:00 UTC |
| 実行曜日 | 金曜日 |
| 実行日 | 該当なし |
| トリガー | cron (0 0 * * 5) / workflow_dispatch |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| kangax/compat-tableアクセス | 外部リポジトリへのアクセスが可能であること |
| contents: write権限 | ブランチ作成・プッシュに必要な権限 |
| BOT_TOKEN | Pull Request作成に必要なトークン |

### 実行可否判定

スケジュールまたは手動トリガーで自動的に実行される。compat-tableに更新がない場合は処理をスキップする。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | スケジュール実行のため入力パラメータなし |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| kangax/compat-table | Git | 外部リポジトリ（互換性テーブルデータ） |
| download-compat-table.sh | Shell | 現在のCOMPAT_TABLE_COMMIT設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| update-compat-dataブランチ | Git | 更新されたcompat-dataコード |
| Pull Request | GitHub | レビュー用のPull Request |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | packages/babel-compat-data/data/*.json |
| 出力先 | packages/babel-compat-data/ |
| 文字コード | UTF-8 |
| 区切り文字 | JSON形式 |

## 処理フロー

### 処理シーケンス

```
1. Babelリポジトリチェックアウト
   └─ actions/checkout@v4
2. compat-tableリポジトリチェックアウト
   └─ kangax/compat-table を packages/babel-compat-data/build/compat-table にクローン
3. Node.js最新版セットアップ
   └─ actions/setup-node@v4 (node-version: "*")
4. 最新コミットSHA取得
   └─ get-last-commit.sh を実行
5. COMPAT_TABLE_COMMIT更新
   └─ bump-compat-table-commit.sh を実行
6. 更新有無チェック
   └─ git status -s で変更を確認
7. Bootstrap実行（更新ありの場合）
   └─ make bootstrap
8. compat-dataビルド
   └─ make build-compat-data
9. テストフィクスチャ更新
   └─ yarn jest -u (OVERWRITE=true)
10. Babel 8テストフィクスチャ更新
    └─ yarn jest -u (BABEL_8_BREAKING=true, OVERWRITE=true)
11. 変更をコミット
    └─ git commit -am "chore: update compat data to $sha1"
12. ブランチにプッシュ
    └─ git push --force origin update-compat-data
13. Pull Request作成
    └─ babel/actions/create-pull-request@v2
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[リポジトリチェックアウト]
    B --> C[compat-tableクローン]
    C --> D[Node.jsセットアップ]
    D --> E[最新コミットSHA取得]
    E --> F[COMPAT_TABLE_COMMIT更新]
    F --> G{変更あり?}
    G -->|No| H[バッチ終了]
    G -->|Yes| I[make bootstrap]
    I --> J[make build-compat-data]
    J --> K[yarn jest -u]
    K --> L[yarn jest -u with BABEL_8_BREAKING]
    L --> M[変更をコミット]
    M --> N[ブランチにプッシュ]
    N --> O[Pull Request作成]
    O --> H
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | compat-tableクローン失敗 | ネットワークエラー | ネットワーク接続を確認 |
| 1 | ビルド失敗 | make build-compat-dataエラー | ビルドスクリプトを確認 |
| 1 | テスト失敗 | jest実行エラー | テストコードを確認 |
| 1 | PR作成失敗 | BOT_TOKEN権限不足 | トークン権限を確認 |

### リトライ仕様

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

### 障害時対応

1. GitHub Actionsログでエラー内容を確認
2. compat-tableリポジトリへのアクセスを確認
3. 必要に応じて手動でcompat-dataを更新
4. ワークフローを再実行

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | Git操作全体 |
| コミットタイミング | git push実行時 |
| ロールバック条件 | プッシュ前にエラーが発生した場合 |

## パフォーマンス要件

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

## 排他制御

- 週次スケジュール実行のため、通常は競合なし
- --force プッシュにより、既存のupdate-compat-dataブランチを上書き

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | チェックアウト時 | リポジトリ情報 |
| 進捗ログ | 各ステップ実行時 | コミットSHA、ビルド結果 |
| テストログ | jest実行時 | テスト結果、更新されたスナップショット |
| 終了ログ | バッチ終了時 | 作成されたPR URL |
| エラーログ | エラー発生時 | エラー詳細 |

## 監視・アラート

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

## 備考

- YARN_ENABLE_SCRIPTS: false 環境変数により、post-installスクリプトを無効化してインストールを高速化
- continue-on-error: true により、テストフィクスチャ更新ステップでの失敗は処理を継続
- Babel 8環境でのテスト更新は、BABEL_8_BREAKING=true 環境変数で実行
- Pull Requestには「area: compat-table」および「repo automation :robot:」ラベルが付与される
- 更新がない場合（compat-tableに変更なし）は、PRは作成されない
