# バッチ設計書 2-release.bat

## 概要

本ドキュメントは、serve-dプロジェクトにおけるWindows向けリリースビルドスクリプト `release.bat` のバッチ設計書である。

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

本バッチは、serve-dのWindows向けリリースバイナリをビルドし、必要なDLLと共にZIP形式で配布用アーカイブを生成するためのスクリプトである。

**業務上の目的・背景**：serve-dはD言語のLanguage Server Protocol実装であり、Windows環境のユーザーに配布するためにはリリースビルドされたバイナリと依存DLLを一体化したパッケージが必要である。本バッチは、Windows 8以上の環境（仮想マシンを含む）でリリースビルドを作成するために使用される。ビルド作業をシステムドライブの専用ディレクトリで行うことで、パスの問題を回避している。

**バッチの実行タイミング**：リリース作成時に手動で実行される。Linux向けの `release.sh`（No.1）で生成される `version.txt` が存在することが前提条件となる。

**主要な処理内容**：
1. version.txtの存在チェック（存在しない場合はエラー終了）
2. robocopyによるプロジェクトディレクトリの同期（システムドライブの `\buildsd` ディレクトリへ）
3. ldc2コンパイラを使用してx86アーキテクチャ向けビルドを実行
4. windowsディレクトリの作成と成果物（serve-d.exe + 依存DLL）のコピー
5. PowerShellのZipFile APIを使用してZIPアーカイブを生成
6. 生成されたZIPファイルをバージョン付きファイル名にリネームして元のディレクトリに移動

**前後の処理との関連**：本バッチはLinux向けの `release.sh`（No.1）で生成される `version.txt` に依存する。CI環境では `ci/build.bat`（No.4）が同等の機能を提供する。

**影響範囲**：システムドライブの `\buildsd` ディレクトリにビルド環境が作成され、元のディレクトリに `serve-d_{VERSION}-windows.zip` が生成される。robocopyにより既存のbuildsdディレクトリは上書き同期される。

## バッチ種別

リリースビルド

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（リリース時） |
| 実行時刻 | 指定なし |
| 実行曜日 | 指定なし |
| 実行日 | 指定なし |
| トリガー | 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| version.txt | release.shで生成されたversion.txtがカレントディレクトリに存在すること |
| ldc2コンパイラ | ldc2がPATH上にインストールされていること |
| dubパッケージマネージャ | dubがPATH上にインストールされていること |
| 依存DLL | libcurl.dll、libeay32.dll、ssleay32.dllがカレントディレクトリに存在すること |
| プラットフォーム | Windows 8以上の環境であること |
| PowerShell | System.IO.Compression.FileSystemが利用可能であること |

### 実行可否判定

version.txtが存在しない場合、エラーメッセージを表示してスクリプトを終了する。version.txtが存在する場合のみビルド処理が実行される。

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| version.txt | テキスト | バージョン番号が記載されたファイル（release.shで生成） |
| serve-dプロジェクトソースコード | D言語ソース | dubによるビルド対象のソースコード一式 |
| libcurl.dll | DLL | HTTP通信用ライブラリ |
| libeay32.dll | DLL | OpenSSL暗号ライブラリ |
| ssleay32.dll | DLL | OpenSSL SSLライブラリ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| serve-d_{VERSION}-windows.zip | ZIP | serve-d.exeと依存DLLを含むZIPアーカイブ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | serve-d_{VERSION}-windows.zip |
| 出力先 | スクリプトのあるディレクトリ |
| 文字コード | バイナリ |
| アーカイブ内容 | serve-d.exe, libcurl.dll, libeay32.dll, ssleay32.dll |

## 処理フロー

### 処理シーケンス

```
1. カレントディレクトリをスクリプトのディレクトリに変更
   └─ pushd %~dp0 でスクリプトのあるディレクトリに移動
2. version.txt存在チェック
   └─ 存在しない場合、エラーメッセージを表示してpause後に終了
3. robocopyによるディレクトリ同期
   └─ プロジェクトディレクトリを %SystemDrive%\buildsd にミラーリング
   └─ 隠しファイル・ディレクトリ、.zipファイルを除外
4. バージョン番号の読み込み
   └─ version.txtからバージョン番号をVersion変数に格納
5. dub build（リリースビルド）
   └─ --compiler=ldc2 --arch=x86 オプションでビルド実行
6. windowsディレクトリの準備
   └─ 既存のwindowsディレクトリがあれば削除して再作成
7. 成果物のコピー
   └─ serve-d.exe、libcurl.dll、libeay32.dll、ssleay32.dllをwindowsディレクトリにコピー
8. ZIPアーカイブの生成
   └─ PowerShellのZipFile::CreateFromDirectoryでwindowsディレクトリをwindows.zipに圧縮
9. ZIPファイルの移動とリネーム
   └─ buildsdのwindows.zipを元のディレクトリにバージョン付きファイル名で移動
10. 一時停止（pause）
    └─ ユーザーの確認待ち
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[pushd スクリプトディレクトリ]
    B --> C{version.txt 存在チェック}
    C -->|存在しない| D[エラーメッセージ表示 → pause → 終了]
    C -->|存在する| E[robocopy でディレクトリ同期]
    E --> F[version.txt からバージョン読み込み]
    F --> G[dub build --compiler=ldc2 --arch=x86]
    G --> H[windowsディレクトリ準備]
    H --> I[serve-d.exe + DLLをコピー]
    I --> J[PowerShellでZIPアーカイブ生成]
    J --> K[ZIPファイルを移動・リネーム]
    K --> L[pause → バッチ終了]
```

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

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

本バッチはデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル不在 | version.txtが存在しない場合 | release.shを先に実行してversion.txtを生成する |
| - | ビルドエラー | dub buildが失敗した場合 | コンパイルエラーの原因を確認する |
| - | DLL不在 | 依存DLLがカレントディレクトリにない場合 | 必要なDLLを配置する |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（自動リトライ機能なし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

version.txt不在時はエラーメッセージを表示しpauseで一時停止する。ビルド失敗時はエラーメッセージがコンソールに表示される。手動で原因を調査し、再実行する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（ファイルシステム操作のみ） |
| コミットタイミング | - |
| ロールバック条件 | なし（中間ファイルは %SystemDrive%\buildsd に残る） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回のビルド |
| 目標処理時間 | 環境依存（通常数分程度） |
| メモリ使用量上限 | 環境依存（ldc2コンパイラとrobocopyの使用量に依存） |

## 排他制御

同一環境での同時実行は想定されていない。robocopyによるミラーリングが競合する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| ビルドログ | dub build実行時 | dubおよびldc2のビルド進捗・エラー情報（標準出力） |
| robocopyログ | ディレクトリ同期時 | ファイルコピーの進捗情報 |
| エラーメッセージ | version.txt不在時 | "Error: version.txt is missing :/" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| なし | - | 手動実行のため監視対象外 |

## 備考

- x86（32ビット）アーキテクチャ向けのビルドを行う（release.shのx86_64とは異なる）
- robocopyの `/MIR` オプションにより、ビルドディレクトリはソースディレクトリと完全に同期される
- `/XA:SH` で隠し・システム属性ファイルを、`/XD .*` `/XF .*` で隠しディレクトリ・ファイルを、`/XF *.zip` でZIPファイルを除外
- 最後にpauseコマンドがあるため、対話的な実行を前提としている
- Windows仮想マシン上での実行を想定（ソースコード冒頭のコメントより）
