# バッチ設計書 7-ci.yml

## 概要

本ドキュメントは、GitHub Actions CI設定ファイル `.github/workflows/ci.yml` の設計仕様を記載する。

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

このCI設定ファイルは、GitHub Actionsを使用してspace-vimプロジェクトの継続的インテグレーション（CI）パイプラインを定義する。コードのプッシュやプルリクエスト時に自動的にVim scriptの静的解析とインストールスクリプトのテストを実行し、コード品質を維持する。

**業務上の目的・背景**：space-vimプロジェクトの品質を自動的に検証し、問題のあるコードがメインブランチにマージされることを防止する。GitHub Actionsを使用することで、プルリクエストのレビュー時に自動テスト結果を確認でき、レビュアーの負担を軽減する。また、PRコメントとして直接lint結果をフィードバックすることで、開発者が迅速に問題を修正できる。

**バッチの実行タイミング**：GitHubリポジトリへのpushイベントまたはpull_requestイベント発生時に自動実行される。

**主要な処理内容**：
1. vintジョブ - Vim scriptの静的解析とPRへのレビューコメント投稿
2. install-scriptジョブ - shellcheckによるシェルスクリプト検証とinstall.shの動作テスト

**前後の処理との関連**：GitHubのイベントフックにより自動的にトリガーされる。CIの結果はGitHubのPRページやコミットステータスに反映される。

**影響範囲**：GitHub Actions実行環境のみ。ソースコードや設定ファイルの変更は行わない。

## バッチ種別

CI/CD / GitHub Actions ワークフロー

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | push/pull_request イベント発生時 |
| 実行時刻 | イベント発生時即座 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | GitHub push/pull_request イベント |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| GitHubリポジトリ | GitHubでホストされていること |
| Actions有効化 | GitHub Actionsが有効であること |
| GITHUB_TOKEN | シークレットにGITHUB_TOKENが設定されていること |

### 実行可否判定

on: [push, pull_request] により、pushまたはpull_requestイベント時に自動実行される。fail-fast: false により、一方のジョブが失敗しても他方は継続実行される。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | イベントトリガーのため明示的なパラメータなし |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ソースコード | Git | GitHubリポジトリのコード |
| secrets.github_token | トークン | PRコメント投稿用のGitHubトークン |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| GitHub PR レビュー | コメント | vintによる指摘事項（PRレビューコメント形式） |
| GitHub Actions ログ | テキスト | 各ステップの実行ログ |
| コミットステータス | ステータス | CI成功/失敗の表示 |

### 出力ファイル仕様

本ワークフローはファイル出力を行わない。

## 処理フロー

### 処理シーケンス

#### vintジョブ
```
1. リポジトリのチェックアウト
   └─ uses: actions/checkout@master
2. vint実行とPRレビュー投稿
   └─ uses: reviewdog/action-vint@v1
   └─ github_token: ${{ secrets.github_token }}
   └─ reporter: github-pr-review
```

#### install-scriptジョブ
```
1. リポジトリのチェックアウト
   └─ uses: actions/checkout@master
2. 依存ツールのインストールとテスト実行
   └─ apt-get install shellcheck python3.6 -y
   └─ shellcheck *.sh
   └─ ./install.sh
```

### フローチャート

```mermaid
flowchart TD
    A[push/pull_request イベント] --> B[GitHub Actions 起動]
    B --> C[vintジョブ]
    B --> D[install-scriptジョブ]

    C --> C1[リポジトリチェックアウト]
    C1 --> C2[reviewdog/action-vint実行]
    C2 --> C3{vint成功?}
    C3 -->|Yes| C4[PRレビューコメント投稿]
    C3 -->|No| C5[エラー報告]
    C4 --> C6[ジョブ完了]
    C5 --> C6

    D --> D1[リポジトリチェックアウト]
    D1 --> D2[shellcheck/python3.6インストール]
    D2 --> D3[shellcheck *.sh 実行]
    D3 --> D4{shellcheck成功?}
    D4 -->|Yes| D5[./install.sh 実行]
    D4 -->|No| D6[ジョブ失敗]
    D5 --> D7{install.sh成功?}
    D7 -->|Yes| D8[ジョブ完了]
    D7 -->|No| D6
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | 本ワークフローはデータベースを使用しない |

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

N/A - データベース操作なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Lint エラー | vintがVim scriptでエラーを検出 | PRレビューコメントを確認し修正 |
| - | Lint エラー | shellcheckがシェルスクリプトでエラーを検出 | Actionsログを確認し修正 |
| - | テストエラー | install.shが失敗 | Actionsログでエラー内容を確認し修正 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 手動リラン可能（GitHub Actions UI から） |
| リトライ間隔 | N/A |
| リトライ対象エラー | 全エラー |

### 障害時対応

- CIジョブ失敗時はGitHub Actionsのログを確認
- PRの場合、vintの指摘はPRレビューコメントとして表示される
- 修正後、コードをプッシュすると自動的にCIが再実行される

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回/イベント |
| 目標処理時間 | 2-5分 |
| メモリ使用量上限 | GitHub Actions ランナーの上限に依存 |

## 排他制御

各CIジョブは独立したランナー上で実行されるため、排他制御は不要。同一PRに対する複数のpushがあった場合、最新のワークフロー実行が優先される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| ステップログ | 各ステップ実行時 | コマンドの出力 |
| lint結果 | vint/shellcheck実行後 | 検出された警告/エラー |
| PRレビュー | vint完了後 | PRへのレビューコメント |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| CI ジョブ失敗 | 1回 | GitHub通知（PR作成者、リポジトリウォッチャー） |

## 備考

- `name: ci` によりワークフロー名は "ci" として表示される
- `on: [push, pull_request]` によりpushとpull_request両方でトリガー
- `fail-fast: false` により、一方のジョブが失敗しても他方は継続実行
- `runs-on: ubuntu-latest` により最新のUbuntuランナーで実行
- `actions/checkout@master` でリポジトリをチェックアウト
- `reviewdog/action-vint@v1` はvintの結果をPRレビューコメントとして投稿するアクション
- `reporter: github-pr-review` によりPRの差分に対して直接コメントが付く
- install-scriptジョブではci/before_install.shではなく、直接apt-getでパッケージをインストールしている
- GitHub Actionsのsecrets.github_tokenは自動的に提供される
