# バッチ設計書 70-CopySignFiles.cmd

## 概要

本ドキュメントは、ColorToolのバイナリを署名用ディレクトリにコピー/署名後にコピーバックするバッチスクリプト `CopySignFiles.cmd` のバッチ設計書である。コード署名プロセスの前後で必要なファイルコピー操作を自動化する。

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

本スクリプトは、ColorToolプロジェクトのコード署名ワークフローにおいて、署名前のバイナリを署名用ディレクトリにコピーする「sign」モードと、署名済みバイナリをビルド出力ディレクトリにコピーバックする「afterSign」モードの2つの操作を提供する。

**業務上の目的・背景**：ソフトウェアのリリースプロセスにおいて、バイナリファイルへのコード署名は必須のセキュリティ要件である。署名ツールは特定のディレクトリ構造を期待するため、ビルド出力から署名用ディレクトリへのコピーと、署名後のバイナリのコピーバックが必要になる。本スクリプトはこの前後のファイル操作を自動化し、署名プロセスのエラーを防止する。

**バッチの実行タイミング**：リリースビルドのコード署名プロセスの一環として実行される。「sign」はビルド後・署名前に、「afterSign」は署名完了後に実行される。

**主要な処理内容**：
1. signモード: ビルド出力のColorTool.exeを `tosign\` ディレクトリにコピーする
2. afterSignモード: 署名済みColorTool.exeをビルド出力ディレクトリにコピーバックする
3. 各コピー操作はcheckedCopyサブルーチンで実行され、コピー失敗時はexit 1でエラー終了する

**前後の処理との関連**：build.bat（No.7）によりColorToolがビルドされた後に実行される。署名プロセス自体は外部の署名ツール/サービスにより行われる。署名前（sign）と署名後（afterSign）で2回呼び出される。

**影響範囲**：ファイルシステムへのコピー操作のみ。ビルド出力ディレクトリ（`b\Release\anycpu\`）とtosign/signedディレクトリに影響する。

## バッチ種別

ファイル操作 / リリースエンジニアリング

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（リリースビルド時） |
| 実行時刻 | 署名プロセスに依存 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | リリースプロセスでの手動/自動呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| ColorToolビルド済み | `{root}\b\Release\anycpu\ColorTool.exe` が存在すること |
| 署名ディレクトリ | signモード: tosignディレクトリを作成可能であること |
| 署名済みバイナリ | afterSignモード: `signed\ColorTool.exe` が存在すること |

### 実行可否判定

第1引数（sign/afterSign）と第2引数（リポジトリルート）が指定されていること。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| %1 | string | Yes | なし | 操作モード: "sign"（署名前コピー）または "afterSign"（署名後コピーバック） |
| %2 | string | Yes | なし | リポジトリのルートパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ColorTool.exe | 実行ファイル | ビルド出力の署名対象バイナリ（signモード時） |
| signed\ColorTool.exe | 実行ファイル | 署名済みバイナリ（afterSignモード時） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| tosign\ColorTool.exe | 実行ファイル | 署名用にコピーされたバイナリ（signモード時） |
| ..\b\Release\anycpu\ColorTool.exe | 実行ファイル | 署名済みバイナリのコピーバック（afterSignモード時） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | ColorTool.exe |
| 出力先 | signモード: {root}\tosign\、afterSignモード: {root}\..\b\Release\anycpu\ |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. 引数チェック
   └─ %2が空の場合、usageを表示して終了
2. モード判定
   └─ %1が"sign"の場合: signラベルへ分岐
   └─ %1が"afterSign"の場合: afterSignラベルへ分岐
   └─ それ以外: usageを表示して終了
3a. signモード:
   └─ pushd "%2" でリポジトリルートに移動
   └─ mkdir tosign で署名用ディレクトリ作成
   └─ checkedCopy: ..\b\Release\anycpu\ColorTool.exe → tosign\ColorTool.exe
   └─ popd
3b. afterSignモード:
   └─ pushd "%2" でリポジトリルートに移動
   └─ checkedCopy: signed\ColorTool.exe → ..\b\Release\anycpu\ColorTool.exe
   └─ popd
4. checkedCopyサブルーチン:
   └─ copyコマンド実行
   └─ errorlevel != 0 の場合、popd + exit 1
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{%2が空?}
    B -->|Yes| C[usage表示]
    B -->|No| D{%1の値}
    D -->|sign| E[pushd %2]
    D -->|afterSign| F[pushd %2]
    D -->|その他| C
    E --> G[mkdir tosign]
    G --> H[checkedCopy: ColorTool.exe → tosign/]
    H --> I{コピー成功?}
    I -->|Yes| J[popd]
    I -->|No| K[popd + exit 1]
    F --> L[checkedCopy: signed/ColorTool.exe → Release/]
    L --> M{コピー成功?}
    M -->|Yes| N[popd]
    M -->|No| O[popd + exit 1]
    J --> P[バッチ終了]
    N --> P
```

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

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

データベース操作は行わない。

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

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| Exit 1 | コピー失敗 | copyコマンドがエラーを返した場合 | ソースファイルの存在と出力先パスのアクセス権を確認する |
| - | 引数不足 | %2が空の場合 | 正しい引数（sign/afterSign + ルートパス）で再実行する |
| - | 不正な操作モード | %1がsign/afterSign以外の場合 | signまたはafterSignを指定する |

### リトライ仕様

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

### 障害時対応

コピー元ファイルの存在を確認し、出力先ディレクトリのアクセス権を検証する。signモードの場合はColorToolのビルドが正常に完了しているか確認する。afterSignモードの場合は署名プロセスが正常に完了しているか確認する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（個別ファイルコピー） |
| コミットタイミング | 該当なし |
| ロールバック条件 | コピー失敗時にexit 1で中断（ロールバックなし） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1ファイルのコピー |
| 目標処理時間 | 即座 |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

排他制御は不要。ファイルコピー操作のみ。ただし、署名プロセスの実行中にafterSignを実行しないよう注意が必要。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 使用法表示 | 引数エラー時 | `Usage: CopySignFiles <sign|afterSign> <root of the repo>` |
| 使用法表示 | 引数エラー時 | `Will copy the binary release from <root>\Release to be sent to signed` |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | exit 1 | リリースプロセス |

## 備考

- checkedCopyサブルーチンでコピーのエラーチェックを共通化している
- pushd/popdでカレントディレクトリを管理し、呼び出し元の環境を汚染しない
- signモードではtosignディレクトリを作成（mkdir）する。既存の場合はmkdirのエラーが発生するが、処理は続行される
- afterSignモードでは署名済みファイルが `signed\` サブディレクトリにあることを前提としている
- ビルド出力のパス `b\Release\anycpu\` はColorToolプロジェクト固有のディレクトリ構造を前提としている
- REM @echo offが行頭にあるが、REMでコメントアウトされているためコマンドエコーは有効のまま
- ソースファイル: `src/tools/ColorTool/signing/CopySignFiles.cmd`
