# バッチ設計書 38-release

## 概要

本ドキュメントは、clojure-lspプロジェクトにおけるreleaseバッチの設計仕様を定義するものです。releaseは、リリースプロセスを実行するタスクです。

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

releaseバッチは、clojure-lspの新バージョンリリースに必要な一連の処理を自動化するリリースタスクです。バージョン番号の生成、ファイル更新、コミット、タグ作成、リモートへのプッシュを行います。

**業務上の目的・背景**：リリースプロセスを自動化し、人的ミスを防止するとともに、一貫したリリース手順を確保するために必要です。タイムスタンプベースのバージョン番号を使用することで、リリースの追跡と識別が容易になります。

**バッチの実行タイミング**：新バージョンをリリースする際に手動で実行されます。通常、機能開発やバグ修正が完了し、リリース準備が整った段階で実行されます。

**主要な処理内容**：
1. 現在のUTC日時からバージョン番号を生成（YYYY.MM.DD-HH.MM.SS形式）
2. lib/resources/CLOJURE_LSP_VERSIONファイルを更新
3. lib/resources/CLOJURE_LSP_RELEASED_VERSIONファイルを更新
4. CHANGELOG.mdに新バージョンセクションを追加
5. lib-pomとcli-pomを実行してpom.xmlを更新
6. 変更をgitにコミット
7. 新バージョンのgitタグを作成
8. 変更とタグをリモートリポジトリにプッシュ

**前後の処理との関連**：releaseタスク実行後、CI/CDパイプラインでdeploy-clojars、deploy-clojars-standalone、deploy-clojars-test-helperが実行され、成果物がClojarsに公開されます。また、release-artifactタスクでGitHubリリースにバイナリがアップロードされます。

**影響範囲**：gitリポジトリのファイル（バージョンファイル、CHANGELOG.md、pom.xml）が変更され、リモートリポジトリにプッシュされます。新しいgitタグが作成されます。

## バッチ種別

リリース処理 / バージョン管理

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | リリース時 |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Babashka | Babashka (bb) がインストールされていること |
| Git | Gitがインストールされ、リモートリポジトリにプッシュ可能な状態であること |
| 作業ディレクトリ | 未コミットの変更がないクリーンな状態であること |
| ブランチ | main/masterブランチで実行すること |

### 実行可否判定

gitリポジトリがクリーンな状態で、リモートリポジトリへのプッシュ権限があることが必要です。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | bb releaseは追加パラメータを受け取らない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| システム日時 | - | バージョン番号生成に使用（UTC） |
| CHANGELOG.md | Markdown | 既存のCHANGELOGファイル |
| lib/resources/CLOJURE_LSP_VERSION | テキスト | 現在のバージョン |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| lib/resources/CLOJURE_LSP_VERSION | テキスト | 新バージョン番号 |
| lib/resources/CLOJURE_LSP_RELEASED_VERSION | テキスト | 新バージョン番号 |
| CHANGELOG.md | Markdown | 更新されたCHANGELOG |
| lib/pom.xml | XML | 更新されたpom.xml |
| cli/pom.xml | XML | 更新されたpom.xml |
| gitコミット | - | リリースコミット |
| gitタグ | - | 新バージョンタグ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| バージョン形式 | YYYY.MM.DD-HH.MM.SS（UTC） |
| コミットメッセージ | `Release: $VERSION` |
| タグ名 | バージョン番号と同じ |

## 処理フロー

### 処理シーケンス

```
1. Babashkaタスク起動
   └─ bb release コマンドを実行
2. make/release関数呼び出し
   └─ ./release シェルスクリプトを実行
3. バージョン番号生成
   └─ date -u +"%Y.%m.%d-%H.%M.%S" でUTC日時を取得
4. リモートから最新を取得
   └─ git fetch origin && git pull origin HEAD
5. バージョンファイル更新
   └─ CLOJURE_LSP_VERSIONとCLOJURE_LSP_RELEASED_VERSIONを更新
6. CHANGELOG.md更新
   └─ sedで"## Unreleased"の後に新バージョンセクションを追加
7. pom.xml更新
   └─ bb lib-pom && bb cli-pom を実行
8. gitコミット
   └─ git add && git commit -m "Release: $VERSION"
9. gitタグ作成
   └─ git tag "$VERSION"
10. リモートにプッシュ
    └─ git push origin HEAD && git push origin HEAD --tags
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[bb release 実行]
    B --> C[make/release 関数呼び出し]
    C --> D[./release スクリプト実行]
    D --> E[バージョン番号生成]
    E --> F[git fetch && pull]
    F --> G[CLOJURE_LSP_VERSION 更新]
    G --> H[CLOJURE_LSP_RELEASED_VERSION 更新]
    H --> I[CHANGELOG.md 更新]
    I --> J[bb lib-pom 実行]
    J --> K[bb cli-pom 実行]
    K --> L[git add]
    L --> M[git commit]
    M --> N[git tag]
    N --> O[git push origin HEAD]
    O --> P[git push origin HEAD --tags]
    P --> Q{全処理成功?}
    Q -->|成功| R[正常終了]
    Q -->|失敗| S[エラー終了]
    R --> T[終了コード 0]
    S --> U[終了コード 非0]
    T --> V[バッチ終了]
    U --> V
```

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

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

本バッチはデータベース操作を行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非0 | gitエラー | git操作が失敗した場合 | git statusを確認し、問題を解決 |
| 非0 | プッシュエラー | リモートへのプッシュ権限がない場合 | 認証情報を確認 |
| 非0 | コンフリクト | リモートとの競合が発生した場合 | 手動でマージを解決 |
| 非0 | スクリプトエラー | releaseスクリプトの実行エラー | スクリプトの内容を確認 |

### リトライ仕様

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

### 障害時対応

1. エラーメッセージを確認し、問題の原因を特定
2. `set -ev`により、失敗した行が特定可能
3. git操作の問題の場合は、ローカルの状態を確認
4. 部分的に成功した場合は、git reset --hardで元に戻すか、手動で残りの処理を完了
5. タグが作成されてしまった場合は、git tag -d && git push --delete origin で削除

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（各git操作は独立） |
| コミットタイミング | 各git操作完了時 |
| ロールバック条件 | 手動でのgit操作によるロールバックが必要 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1リリース |
| 目標処理時間 | 1分以内 |
| メモリ使用量上限 | 特になし（軽量な処理） |

## 排他制御

同時実行は禁止です。複数のreleaseプロセスが同時に実行されると、バージョンの競合やgitの競合が発生します。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 実行ログ | 各コマンド実行時 | `set -v`により実行コマンドが出力される |
| 結果ログ | 処理完了時 | git push結果 |
| エラーログ | エラー発生時 | `set -e`により失敗時に即座に終了 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 非0 | 開発チーム |

## 備考

- releaseスクリプトは`set -ev`で実行されるため、各コマンドが出力され、エラー時に即座に終了する
- バージョン番号はUTC日時ベースで自動生成される
- CHANGELOG.mdの"## Unreleased"セクションは新バージョンセクション追加後も維持される
- pom.xmlはlib-pomとcli-pomタスクで更新される
- リリース後はCI/CDパイプラインでデプロイタスクが自動実行されることが多い
