# バッチ設計書 30-rake composecheck

## 概要

本ドキュメントは、mrubyプロジェクトにおける `rake composecheck` タスクのバッチ設計書である。docker-compose環境を使用して、全ファイルに対して全pre-commitフックを実行する品質管理処理を定義する。

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

`rake composecheck` は、docker-compose経由でprek（pre-commitツール）を実行し、コンテナ内でリポジトリの全ファイルに対してpre-commitフックを実行するRakeタスクである。ローカル環境にprekがインストールされていなくても、Docker環境でコード品質チェックを行うことができる。

**業務上の目的・背景**：開発者のローカル環境にprekやその依存ツールがインストールされていない場合でも、Docker環境を使用してコード品質チェックを実行できるようにする。CI環境との一貫性を保ちつつ、ローカルでの品質検証を可能にする。また、環境差異による検証結果の違いを排除する目的もある。

**バッチの実行タイミング**：手動実行。Docker環境でのコード品質チェックが必要な場合に随時実行する。

**主要な処理内容**：
1. `docker-compose -p mruby run test prek run --all-files` コマンドを実行
2. mrubyプロジェクト名でdocker-composeサービス `test` を起動
3. コンテナ内で `prek run --all-files` を実行し、全pre-commitフックを全ファイルに対して実行

**前後の処理との関連**：Dockerfileに基づくコンテナイメージのビルドが前提（未ビルドの場合は自動ビルド）。`rake check` はDocker不要のローカル版。`rake composetest` は同様のDocker環境でテストを実行するバリアント。

**影響範囲**：コンテナ内でのファイル検証のみで、ホストのファイルシステムに直接的な影響はない（ただしボリュームマウントの設定に依存）。

## バッチ種別

品質管理（Docker環境での静的解析・フォーマットチェック）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動（`rake composecheck` コマンド実行） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Docker インストール済み | `docker` および `docker-compose` コマンドが実行可能であること |
| Docker デーモン起動中 | Docker デーモンが起動していること |
| Dockerfile | プロジェクトルートに `Dockerfile` が存在すること |
| docker-compose.yml | プロジェクトルートに `docker-compose.yml` が存在すること |
| Ruby環境 | Rakeが実行可能なRuby環境がセットアップされていること |

### 実行可否判定

Docker環境が利用可能で、docker-compose.ymlが存在する場合に実行可能。初回実行時はコンテナイメージのビルドが行われるため、追加の時間がかかる。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| N/A | N/A | N/A | N/A | コマンドライン引数は受け取らない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Dockerfile | Dockerfile | コンテナイメージのビルド定義 |
| docker-compose.yml | YAML | Docker Compose サービス定義 |
| .pre-commit-config.yaml | YAML | pre-commitフック設定ファイル |
| リポジトリ全ファイル | 各種 | チェック対象のソースファイル群 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | 各フックの実行結果（Passed/Failed） |
| 標準エラー出力 | テキスト | エラーメッセージ |

### 出力ファイル仕様

直接的なファイル出力はない。

## 処理フロー

### 処理シーケンス

```
1. rake composecheck タスク開始
2. sh "docker-compose -p mruby run test prek run --all-files" を実行
   └─ docker-compose がプロジェクト名 "mruby" でサービス "test" を起動
   └─ コンテナ内で prek run --all-files が実行される
   └─ docker-compose.yml の環境変数が適用される
      - MRUBY_CONFIG=ci/gcc-clang
      - CC=gcc, CXX=g++, LD=gcc
      - SKIP=check-executables-have-shebangs
   └─ コンテナの作業ディレクトリは /app
3. 全フックの結果がコンソールに出力される
4. rake composecheck タスク完了
```

### フローチャート

```mermaid
flowchart TD
    A[rake composecheck 開始] --> B{コンテナイメージ存在?}
    B -->|No| C[docker-compose build]
    B -->|Yes| D[docker-compose run test]
    C --> D
    D --> E[コンテナ内で prek run --all-files 実行]
    E --> F{全フック成功?}
    F -->|Yes| G[正常終了]
    F -->|No| H[異常終了]
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | Docker未起動 | Docker デーモンが起動していない | Docker を起動してから再実行 |
| N/A | イメージビルド失敗 | Dockerfile のビルドに失敗 | Dockerfile のエラーを修正 |
| N/A | フック失敗 | いずれかのpre-commitフックが失敗 | エラーメッセージを確認して該当ファイルを修正 |
| N/A | ディスク容量不足 | Docker イメージやコンテナのディスク容量が不足 | 不要なイメージ・コンテナを削除 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（手動で再実行） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

コンテナ内でのフック失敗時は、出力されるエラーメッセージに従って該当ファイルを修正し、再実行する。Dockerの問題の場合は `docker-compose down` でコンテナをクリーンアップしてから再実行。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | リポジトリ内の全ファイル |
| 目標処理時間 | 初回はイメージビルド含め数分、2回目以降は数分程度 |
| メモリ使用量上限 | Docker コンテナのメモリ制限に依存 |

## 排他制御

同一プロジェクト名（mruby）での同時実行は docker-compose により制御される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 各フック実行時 | フック名と結果（Passed/Failed/Skipped） |
| Docker ログ | コンテナ起動時 | docker-compose の起動ログ |
| エラーログ | フック失敗時 | 失敗したフックの詳細とエラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | N/A（手動実行タスクのため監視対象外） |

## 備考

- docker-compose.yml で定義されたコンテナは `ruby:3.2.2-bullseye` ベースのイメージを使用
- コンテナ内の環境変数 `SKIP=check-executables-have-shebangs` により、一部のチェックがスキップされる
- `-p mruby` でプロジェクト名を指定し、他のdocker-composeプロジェクトとの名前衝突を回避
- `rake check` とは異なり、Docker環境内で実行されるため、ホスト環境のツールインストール状況に依存しない
- `sh` メソッドを使用しているため、コマンドが非0で終了した場合はRakeタスクも失敗する
- Makefile にも `make composecheck` として同等のターゲットが定義されている
