# バッチ設計書 49-docker-compose（docker-compose.yml）

## 概要

本ドキュメントは、docker-compose.ymlのバッチ設計書である。Docker Composeを使用してmrubyのテスト環境をコンテナ上で構築し、deep_clean後にテストを逐次実行する構成について記載する。

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

本docker-compose.ymlは、Dockerfile（No.48）でビルドされたコンテナイメージを使用して、GCC環境でmrubyのdeep_clean（全成果物削除）後にテストを逐次実行するサービスを定義する。

**業務上の目的・背景**：mrubyのテスト実行環境を統一し、クリーンな状態からのフルテストをDockerコンテナ上で再現可能にするため、docker-composeを使用してテスト実行環境を定義している。deep_cleanにより前回のビルド成果物を完全に削除した上でテストを実行することで、ビルドキャッシュに起因する偽陽性を排除し、信頼性の高いテスト結果を得る。GCC/G++コンパイラとci/gcc-clangビルド設定を使用することで、GNU系コンパイラでの互換性を検証する。

**バッチの実行タイミング**：`docker-compose -p mruby run test`コマンドの実行時、または`rake composetest`（No.31）の実行時に起動される。

**主要な処理内容**：
1. Dockerfileからテスト環境コンテナイメージをビルドする
2. コンテナ内で`rake deep_clean`を実行して全ビルド成果物を削除する
3. `rake -m test:run:serial`でマルチタスクを有効化しつつテストを逐次実行する

**前後の処理との関連**：本docker-compose.ymlはDockerfile（No.48）で定義されたイメージをビルドに使用する。`rake composetest`（No.31）はこのdocker-compose.ymlを起動するRakeタスクである。テスト実行はrake test:run:serial（No.13と同等）を使用する。deep_cleanはrake deep_clean（No.26）と同等の処理を行う。

**影響範囲**：Dockerコンテナ環境でのmrubyフルテスト実行。GCC/G++コンパイラでのビルドとテスト結果。

## バッチ種別

テスト実行 / コンテナオーケストレーション

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動実行またはRakeタスク経由） |
| 実行時刻 | 該当なし |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | docker-compose runコマンド / rake composetest |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Docker環境 | Docker EngineおよびDocker Composeがインストールされ動作可能であること |
| Dockerfile | プロジェクトルートにDockerfileが存在すること |
| ネットワーク接続 | 初回ビルド時にベースイメージとパッケージのダウンロードが必要 |

### 実行可否判定

`docker-compose run`コマンドの実行により開始される。DockerデーモンおよびDocker Composeが稼働していることが前提条件。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| MRUBY_CONFIG | string | Yes | ci/gcc-clang | mrubyビルド設定ファイルのパス |
| CC | string | Yes | gcc | Cコンパイラ |
| CXX | string | Yes | g++ | C++コンパイラ |
| LD | string | Yes | gcc | リンカ |
| SKIP | string | No | check-executables-have-shebangs | スキップするpre-commitフック |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Dockerfile | Dockerファイル | テスト環境のコンテナイメージ定義 |
| プロジェクトソースコード | ファイルシステム | mrubyソースコード（ビルドコンテキスト） |
| ci/gcc-clang | 設定ファイル | GCC/Clang向けmrubyビルド設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | テスト実行結果 |
| コンテナ終了コード | integer | テスト成功時0、失敗時非0 |

### 出力ファイル仕様

本docker-compose.ymlはコンテナ内でビルドとテストを実行するが、ファイル出力はコンテナ内に限定される。

| 項目 | 内容 |
|-----|------|
| ファイル名 | 該当なし（コンテナ内に限定） |
| 出力先 | コンテナ内の/app |
| 文字コード | 該当なし |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. コンテナイメージビルド
   └─ Dockerfileを使用してテスト環境イメージをビルド（初回またはキャッシュ無効時）
2. 環境変数設定
   ├─ MRUBY_CONFIG=ci/gcc-clang
   ├─ CC=gcc, CXX=g++, LD=gcc
   └─ SKIP=check-executables-have-shebangs
3. deep_clean実行
   └─ rake deep_cleanで全ビルド成果物・gem clone・bin・buildディレクトリを削除
4. テスト逐次実行
   └─ rake -m test:run:serialでマルチタスク有効化しつつテストを逐次実行
```

### フローチャート

```mermaid
flowchart TD
    A[docker-compose run test] --> B{イメージビルド済み?}
    B -->|No| C[Dockerイメージビルド<br>Dockerfile]
    B -->|Yes| D[コンテナ起動<br>working_dir: /app]
    C --> D
    D --> E[環境変数設定<br>CC=gcc, CXX=g++等]
    E --> F[rake deep_clean<br>全成果物削除]
    F --> G[rake -m test:run:serial<br>テスト逐次実行]
    G --> H{テスト結果}
    H -->|成功| I[コンテナ終了<br>exit code 0]
    H -->|失敗| J[コンテナ終了<br>exit code 非0]
```

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

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

本docker-compose.ymlはデータベース操作を行わない。

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | 該当なし | 該当なし | 該当なし |

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | イメージビルド失敗 | Dockerfileのビルドに失敗した場合 | Dockerfileおよびビルドコンテキストを確認する |
| - | コンパイルエラー | GCCでのmrubyコンパイルに失敗した場合 | コンパイルエラーの原因を修正する |
| - | テスト失敗 | テストケースが失敗した場合 | テストログから失敗原因を特定し修正する |
| - | deep_clean失敗 | ファイル削除に失敗した場合（権限問題等） | コンテナの権限設定を確認する |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 手動で再実行（docker-compose runコマンド） |
| リトライ間隔 | 該当なし（手動） |
| リトライ対象エラー | 一時的なインフラエラー |

### 障害時対応

テスト失敗時はdocker-composeの出力ログから失敗原因を特定する。コンテナ内でのデバッグが必要な場合は`docker-compose run test bash`等でインタラクティブシェルに入り調査する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（コンテナ実行） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし（コンテナは使い捨て） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | mruby全テストスイート |
| 目標処理時間 | 明示的な規定なし（deep_clean + ビルド + テストで数分〜数十分） |
| メモリ使用量上限 | Docker Engineの設定に依存 |

## 排他制御

docker-composeの`-p mruby`オプションでプロジェクト名が指定される場合（rake composetestから起動時）、同一プロジェクト名の同時実行は制御される。直接docker-compose runを実行する場合は、同時実行が可能。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | コンテナ起動時 | Docker Composeの標準ログ（コンテナ起動情報） |
| 進捗ログ | テスト実行中 | deep_clean進捗、ビルド進捗、テスト結果 |
| 終了ログ | コンテナ終了時 | テスト結果サマリー、終了コード |
| エラーログ | エラー発生時 | コンパイルエラー、テスト失敗詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| テスト失敗 | 1回 | 実行者（手動実行のため直接確認） |
| イメージビルド失敗 | 1回 | 実行者 |

## 備考

- docker-compose.yml format version 3.8を使用
- サービス名は`test`の1つのみ
- build contextはカレントディレクトリ（`.`）を指定し、ルートのDockerfileを使用
- コマンドは`sh -c 'rake deep_clean && rake -m test:run:serial'`でシェル経由実行
- MRUBY_CONFIGは`ci/gcc-clang`に設定されている（AppVeyorの`ci/msvc`とは異なる）
- コンパイラはGCC/G++が明示的に設定されている（CC=gcc, CXX=g++, LD=gcc）
- `SKIP=check-executables-have-shebangs`によりshebangチェックのpre-commitフックがスキップされる
- 作業ディレクトリは`/app`（Dockerfileと同一）
- deep_cleanを実行するため、毎回クリーンビルドとなり実行時間が長くなる
