# バッチ設計書 21-prod-cli

## 概要

本ドキュメントは、clojure-lspプロジェクトにおける本番用CLIスクリプト生成バッチ（prod-cli）の設計を記載したものである。

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

本バッチは、clojure-lspを本番環境で利用するための実行可能スクリプト（clojure-lsp または clojure-lsp.bat）を生成する処理である。JARファイルをラップした起動スクリプトを作成し、ユーザーが簡単にclojure-lspを実行できるようにする。

**業務上の目的・背景**：clojure-lspをエンドユーザーが利用する際、JARファイルを直接java -jarコマンドで実行するのは煩雑である。本バッチは、単一の実行可能スクリプトを提供することで、ユーザーエクスペリエンスを向上させ、インストールと実行を簡素化する。ネイティブイメージほどの起動速度は得られないが、JVMベースの安定した動作を提供する。

**バッチの実行タイミング**：開発者がリリース用のCLIスクリプトを作成する際に手動で実行される。または、CI/CDパイプラインでリリースビルドの一環として自動実行される。

**主要な処理内容**：
1. `standalone-aot-jar`関数によるAOT（Ahead-of-Time）コンパイル済みスタンドアロンJARの生成
2. `deps-bin`ライブラリを使用した実行可能スクリプト（clojure-lsp[.bat]）の生成
3. 生成されたスクリプトをcliディレクトリからプロジェクトルートへ移動

**前後の処理との関連**：本バッチの成果物は、エンドユーザーへの配布やintegration-testバッチでの統合テストに使用される。cli-prod-jarバッチと共通のJAR生成ロジックを使用している。

**影響範囲**：プロジェクトルートディレクトリにclojure-lsp（Unix）またはclojure-lsp.bat（Windows）ファイルが生成される。既存ファイルは上書きされる。

## バッチ種別

ビルド処理 / 成果物生成

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 指定なし |
| 実行曜日 | 指定なし |
| 実行日 | 指定なし |
| トリガー | 手動（bb prod-cli）またはCI/CD |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| JDK | Java Development Kit がインストールされていること |
| Babashka | bb コマンドが利用可能であること |
| Clojure CLI | clojure コマンドが利用可能であること |
| 依存関係 | deps.edn に定義された依存関係が解決可能であること |

### 実行可否判定

特別な実行可否判定は行わない。前提条件が満たされていれば実行可能である。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | コマンドラインパラメータは不要 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| cli/src | Clojureソース | CLIモジュールのソースコード |
| lib/src | Clojureソース | ライブラリモジュールのソースコード |
| cli/resources | リソース | CLIモジュールのリソースファイル |
| lib/resources | リソース | ライブラリモジュールのリソースファイル |
| cli/deps.edn | EDN | CLIモジュールの依存関係定義 |
| lib/deps.edn | EDN | ライブラリモジュールの依存関係定義 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| clojure-lsp | 実行可能スクリプト | Unix用起動スクリプト |
| clojure-lsp.bat | バッチファイル | Windows用起動スクリプト（Windows環境のみ） |
| cli/target/clojure-lsp-standalone.jar | JAR | 中間生成物（スクリプトに埋め込まれる） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | clojure-lsp（Unix）/ clojure-lsp.bat（Windows） |
| 出力先 | プロジェクトルートディレクトリ |
| 文字コード | UTF-8 |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. clean処理
   └─ cli/targetディレクトリを削除して前回のビルド成果物をクリア

2. standalone-aot-jar生成
   └─ AOTコンパイルを行いuberjarを生成

3. ソースコピー
   └─ src、resourcesディレクトリをtarget/classesにコピー

4. Clojureコンパイル
   └─ clojure.tools.build.apiでAOTコンパイル実行
   └─ JVMオプション: -Xmx2g -server

5. uberjar生成
   └─ 全ての依存関係を含むスタンドアロンJARを生成
   └─ メインクラス: clojure-lsp.main

6. 実行可能スクリプト生成（bin関数）
   └─ deps-bin.impl.bin/build-binでスクリプトを生成
   └─ JVMオプション: -Xmx3g -server

7. ファイル移動
   └─ cli/clojure-lsp[.bat]をプロジェクトルートに移動
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[cli/target削除]
    B --> C[ソースコード/リソースコピー]
    C --> D[AOTコンパイル実行]
    D --> E{コンパイル成功?}
    E -->|Yes| F[uberjar生成]
    E -->|No| G[エラー終了]
    F --> H[実行可能スクリプト生成]
    H --> I[スクリプトをルートに移動]
    I --> J[バッチ終了]
```

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

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | N/A |

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | コンパイルエラー | ソースコードに構文エラーがある | ソースコードを修正 |
| - | 依存関係解決エラー | 必要なライブラリが見つからない | deps.edn を確認し依存関係を解決 |
| - | メモリ不足 | JVMヒープが不足 | JAVA_OPTS で -Xmx を増加 |

### リトライ仕様

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

### 障害時対応

1. エラーログを確認し、失敗原因を特定
2. 依存関係の問題であれば `clojure -P` で依存関係を事前にダウンロード
3. cleanタスクを実行してから再度ビルドを試行
4. メモリ不足の場合は環境変数でヒープサイズを調整

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイルシステム操作のみ） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行で1セットの成果物を生成 |
| 目標処理時間 | 5分以内 |
| メモリ使用量上限 | 2GB（コンパイル時） |

## 排他制御

同一プロジェクトディレクトリでの同時実行は想定されていない。複数のビルドプロセスが同時に実行された場合、ファイル競合が発生する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | バッチ開始時 | "Generating bin..." |
| 進捗ログ | JAR生成時 | "Building uberjar..." |
| 終了ログ | バッチ終了時 | 正常終了時は出力なし |
| エラーログ | エラー発生時 | スタックトレース |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | 10分 | CI/CDシステム |
| 終了コード | 0以外 | CI/CDシステム |

## 備考

- 生成されるスクリプトは内部にJARファイルを埋め込む形式となる
- デバッグ機能（cider-nrepl等）が不要な本番向けビルドである
- debug-cliとの違いは、デバッグ用依存関係が含まれず、JVMオプションが本番向けに最適化されている点
