# バッチ設計書 15-cibuild.sh

## 概要

本ドキュメントは、Arcade共通CIビルドスクリプト（eng/common/cibuild.sh）の設計仕様を記述したものである。

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

cibuild.shは、Linux/macOS環境でのCI（継続的インテグレーション）ビルドを実行するためのシェルスクリプトである。このスクリプトはbuild.shを呼び出し、リストア、ビルド、テスト、パッケージング、公開のビルドステップを一括で実行する。

**業務上の目的・背景**：クロスプラットフォーム対応のCI/CDパイプラインでは、Windows環境のCIBuild.cmdと同等の機能をLinux/macOS環境で提供する必要がある。cibuild.shは、Azure DevOps、GitHub Actions等のCIシステムのLinux/macOSエージェントから呼び出され、完全なビルドパイプラインを実行する。

**バッチの実行タイミング**：CI/CDパイプラインによる自動実行。Linux/macOSビルドジョブでのプルリクエスト検証、リリースビルド等。

**主要な処理内容**：
1. スクリプトパスの解決（シンボリックリンク対応）
2. build.shの呼び出し
3. 以下のオプションをすべて有効化：
   - `--restore`: 依存関係のリストア
   - `--build`: ソリューションのビルド
   - `--test`: ユニットテストの実行
   - `--pack`: NuGetパッケージの作成
   - `--publish`: 成果物の公開
   - `--ci`: CI環境モードの有効化

**前後の処理との関連**：CIパイプラインのビルドステップとして実行される。Windows版CIBuild.cmdと比較して、`--sign`オプションが含まれていない点が異なる（Linux/macOSでの署名は通常別処理）。

**影響範囲**：リポジトリ全体のビルド、テスト実行、パッケージ生成、公開処理に影響。

## バッチ種別

CI/CD / フルビルド

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | イベント駆動 |
| 実行時刻 | CI/CDパイプライン設定に依存 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | CI/CDシステム |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Linux/macOS | Unix系OS環境（CI Agentホスト） |
| Bash | Bash 4.0以上推奨 |
| curl または wget | dotnet-install.shのダウンロードに必要 |
| ネットワーク接続 | NuGetフィード、SDKダウンロード用 |

### 実行可否判定

特段の実行可否判定は行わない。CI環境から呼び出されることを前提とする。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| $@ | string | No | なし | 追加のコマンドライン引数 |

固定で有効化されるオプション：
- --restore
- --build
- --test
- --pack
- --publish
- --ci

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| global.json | JSON | SDKバージョン、ツールセット定義 |
| *.sln | MSBuild | ソリューションファイル |
| NuGet.config | XML | パッケージソース設定 |
| CI環境変数 | 環境変数 | SYSTEM_TEAMPROJECT等 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| artifacts/bin/ | ディレクトリ | ビルド成果物 |
| artifacts/packages/ | ディレクトリ | NuGetパッケージ |
| artifacts/log/ | ディレクトリ | ビルドログ、バイナリログ |
| artifacts/TestResults/ | ディレクトリ | テスト結果 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | Build.binlog（CI時自動有効化） |
| 出力先 | artifacts/log/{Configuration}/ |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. スクリプト起動
   └─ #!/usr/bin/env bash
2. シンボリックリンク解決
   └─ sourceのパス解決ループ
3. scriptrootの確定
   └─ cd -P でディレクトリパス取得
4. build.sh呼び出し
   ├─ --restore: 依存関係リストア
   ├─ --build: ソリューションビルド
   ├─ --test: ユニットテスト実行
   ├─ --pack: パッケージ作成
   ├─ --publish: 成果物公開
   └─ --ci: CI環境設定
5. 追加引数の転送
   └─ $@ で透過的に転送
```

### フローチャート

```mermaid
flowchart TD
    A[cibuild.sh開始] --> B[シンボリックリンク解決]
    B --> C[scriptroot確定]
    C --> D[build.sh呼び出し]
    D --> E[Restore]
    E --> F[Build]
    F --> G[Test]
    G --> H{テスト成功?}
    H -->|Yes| I[Pack]
    H -->|No| X[エラー終了]
    I --> J[Publish]
    J --> K[正常終了]
    K --> Z[終了]
    X --> Z
```

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

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | なし | なし | データベース操作なし |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非ゼロ | ビルドエラー | コンパイル失敗 | ログ確認、コード修正 |
| 非ゼロ | テストエラー | テスト失敗 | テスト結果確認 |
| 非ゼロ | パッケージエラー | パッケージ作成失敗 | 設定確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（CI側で制御） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

1. Build.binlogをダウンロードして分析
2. CIログから失敗ステップを特定
3. ローカルLinux/macOS環境で再現テスト
4. verbosityを上げて再実行

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | プロジェクト全体 |
| 目標処理時間 | CI SLA依存 |
| メモリ使用量上限 | CI Agent依存 |

## 排他制御

- `--ci`オプションにより自動的にノード再利用が無効化される
- 同一Agentでの並列ビルドはCI設定で制御

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | ビルド開始時 | ビルド設定情報 |
| 進捗ログ | 各ステップ | MSBuild出力、テスト結果 |
| 終了ログ | ビルド終了時 | 結果サマリー |
| バイナリログ | 自動 | Build.binlog |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ビルド時間 | CI SLA | チーム通知 |
| テスト失敗 | 1件以上 | PR作成者、チーム |
| ビルド失敗 | 1件以上 | PR作成者、チーム |

## 備考

- Windows版CIBuild.cmdと異なり、`--sign`オプションは含まれていない
- Linux/macOSでの署名処理は通常、別のステップで行われる
- シンボリックリンク解決により、どこからスクリプトが呼び出されても正しく動作
- `--ci`オプションにより、バイナリログ有効化とノード再利用無効化が自動適用
