# バッチ設計書 5-script.sh

## 概要

本ドキュメントは、CIテスト実行スクリプト `ci/script.sh` の設計仕様を記載する。

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

このバッチは、space-vimプロジェクトのCI（継続的インテグレーション）パイプラインにおいて、コードの品質検証とインストールスクリプトのテストを実行するシェルスクリプトである。Vim scriptの静的解析（vint）、シェルスクリプトの静的解析（shellcheck）、およびinstall.shの動作確認を行う。

**業務上の目的・背景**：space-vimプロジェクトのコード品質を維持し、リグレッションを防止するために、CIパイプラインで自動テストを実行する必要がある。このスクリプトは、プルリクエストやコードプッシュ時に自動実行され、問題のあるコードがマージされることを防ぐゲートキーパーの役割を果たす。Vim scriptとシェルスクリプトの両方を検証することで、包括的な品質チェックを実現する。

**バッチの実行タイミング**：CIパイプラインのscriptステージで自動実行される。before_install.shで環境がセットアップされた後に呼び出される。

**主要な処理内容**：
1. プロジェクト内の全.vimファイルをvintで静的解析
2. プロジェクト内の全.shファイルをshellcheckで検証
3. install.shスクリプトの実行テスト

**前後の処理との関連**：ci/before_install.shで必要なツール（vint、shellcheck）がインストールされた後に実行される。このスクリプトの成功/失敗がCIジョブの最終結果となる。

**影響範囲**：CI実行環境のみ。ソースコードや設定ファイルの変更は行わない（テスト目的のinstall.sh実行によるファイル作成を除く）。

## バッチ種別

CI/CD / テスト実行

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | CIパイプライン実行時 |
| 実行時刻 | コードプッシュ/PR時 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | CI/CDプラットフォームによる自動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| vint | vim-vintがインストールされていること |
| shellcheck | shellcheckがインストールされていること |
| git | リポジトリがクローンされていること |
| vim/nvim | install.shテスト用にvimまたはnvimが利用可能であること |

### 実行可否判定

スクリプトは `set -e` オプションにより、いずれかのコマンドが失敗した時点で即座に終了する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | 本スクリプトはコマンドライン引数を受け付けない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| *.vim ファイル | Vim script | プロジェクト内の全Vim scriptファイル |
| *.sh ファイル | Shell script | プロジェクトルートの全シェルスクリプト |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | vint/shellcheckの検証結果 |
| 標準エラー | テキスト | エラーメッセージ |
| 終了コード | 数値 | 0: 成功、非0: 失敗 |

### 出力ファイル仕様

本バッチは検証結果を標準出力に出力し、ファイル出力は行わない。

## 処理フロー

### 処理シーケンス

```
1. エラー時即座終了の設定
   └─ set -e
2. Vim scriptの静的解析
   └─ find . -name "*.vim" -type f でファイル検索
   └─ cache.vimを除外（grep -v "cache.vim"）
   └─ 各ファイルに対してvint -eを実行
3. シェルスクリプトの静的解析
   └─ shellcheck *.sh
4. インストールスクリプトのテスト
   └─ ./install.sh を実行
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[set -e 設定]
    B --> C[*.vimファイルを検索]
    C --> D[cache.vimを除外]
    D --> E{ファイルあり?}
    E -->|Yes| F[各ファイルにvint -e実行]
    F --> G{vint成功?}
    G -->|No| H[エラー終了]
    G -->|Yes| I[shellcheck *.sh実行]
    E -->|No| I
    I --> J{shellcheck成功?}
    J -->|No| H
    J -->|Yes| K[./install.sh実行]
    K --> L{install.sh成功?}
    L -->|No| H
    L -->|Yes| M[バッチ終了（成功）]
```

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

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

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非0 | Lint エラー | vintがVim scriptでエラーを検出 | 報告されたエラーを修正 |
| 非0 | Lint エラー | shellcheckがシェルスクリプトでエラーを検出 | 報告されたエラーを修正 |
| 非0 | インストールエラー | install.shが失敗 | install.shのエラーを調査・修正 |

### リトライ仕様

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

### 障害時対応

- lintエラー発生時: エラーメッセージを確認し、該当コードを修正
- install.shエラー発生時: install.shの実行ログを確認し、原因を調査

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | プロジェクト内の全.vim/.shファイル |
| 目標処理時間 | 1-5分 |
| メモリ使用量上限 | vint/shellcheckの実行時メモリ |

## 排他制御

CI環境では各ジョブが独立したコンテナ/VM上で実行されるため、排他制御は不要。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 検証結果 | vint/shellcheck実行時 | 警告/エラーメッセージ |
| 進捗ログ | 各処理実行時 | コマンド実行の標準出力 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| CI ジョブ失敗 | 1回 | GitHub通知（PR作成者） |

## 備考

- `set -e` により、いずれかのコマンドが非0の終了コードを返すと即座にスクリプトが終了する
- vint -e オプションはエラーレベルのメッセージのみを報告する
- cache.vimはvintの検証対象から除外される（自動生成ファイルのため）
- shellcheckはプロジェクトルートの.shファイルのみを検証（サブディレクトリは対象外）
- install.shの実行はCI環境でspace-vimが正常にインストールできることを確認するためのもの
