# バッチ設計書 20-scripts/cache.js

## 概要

本ドキュメントは、Decap CMSプロジェクトにおけるCypressバイナリキャッシュ管理スクリプト `scripts/cache.js` の設計仕様を定義する。本スクリプトはcache-me-outsideライブラリを使用して、Cypressバイナリのキャッシュを管理する。

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

本スクリプトは、Netlifyビルドキャッシュ環境でCypressバイナリのキャッシュを効率的に管理するためのユーティリティである。cache-me-outsideライブラリを使用して、ホームディレクトリ配下のCypressキャッシュ（`~/.cache/Cypress`）をNetlifyのビルドキャッシュディレクトリ（`/opt/build/cache/fast-cache`）に永続化する。

**業務上の目的・背景**：Cypressバイナリはサイズが大きく、毎回のビルドでダウンロードすると時間がかかる。Netlifyのビルド環境ではビルド間でファイルシステムがリセットされるため、`/opt/build/cache/` 配下のキャッシュディレクトリを利用してCypressバイナリを永続化する。これにより、後続のビルドでCypressバイナリのダウンロードをスキップし、ビルド時間を短縮できる。

**バッチの実行タイミング**：Netlifyビルドプロセスの一部として実行される。ビルドのキャッシュ管理フェーズで呼び出される。

**主要な処理内容**：
1. cache-me-outsideライブラリの初期化（キャッシュフォルダ: `/opt/build/cache/fast-cache`）
2. `~/.cache/Cypress` ディレクトリのキャッシュ状態を確認
3. キャッシュが有効な場合: キャッシュからCypressバイナリを復元（"No operation needed -- cache intact"）
4. キャッシュが無効な場合（スクリプト自体が変更された場合）: キャッシュを無効化し再ダウンロードを促す

**前後の処理との関連**：Netlifyビルドのキャッシュ管理フェーズで使用される。キャッシュの有効/無効判定は `invalidateOn: __filename` により、scripts/cache.js ファイル自体の変更を契機に行われる。E2Eテスト（No.13, No.14）の前提としてCypressバイナリが必要。

**影響範囲**：`/opt/build/cache/fast-cache` ディレクトリと `~/.cache/Cypress` ディレクトリに影響する。Netlifyビルド環境でのみ意味を持つ。

## バッチ種別

ユーティリティ（キャッシュ管理 - ビルドキャッシュの永続化）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | ビルド時 |
| 実行時刻 | ビルドプロセス中 |
| 実行曜日 | なし |
| 実行日 | なし |
| トリガー | Netlifyビルドプロセス |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js | Node.js がインストールされていること |
| cache-me-outside | cache-me-outside ^0.0.10 がインストール済みであること |
| Netlify環境 | /opt/build/cache/ ディレクトリが利用可能なこと（Netlifyビルド環境） |

### 実行可否判定

Netlifyビルド環境外で実行した場合、`/opt/build/cache/fast-cache` ディレクトリが存在しない可能性があるが、cache-me-outsideが適宜ディレクトリを作成する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | 本スクリプトは入力パラメータを取らない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ~/.cache/Cypress | ディレクトリ | Cypressバイナリのキャッシュ |
| /opt/build/cache/fast-cache | ディレクトリ | Netlifyビルドキャッシュ |
| scripts/cache.js（__filename） | JavaScript | キャッシュ無効化判定の基準ファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| /opt/build/cache/fast-cache | ディレクトリ | キャッシュされたCypressバイナリ |
| 標準出力 | テキスト | キャッシュ操作のログ |
| プロセス終了コード | 数値 | 0: 成功 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | Cypressバイナリキャッシュ |
| 出力先 | /opt/build/cache/fast-cache |
| 文字コード | N/A（バイナリファイル） |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. cache-me-outside初期化
   └─ cacheFolder: /opt/build/cache/fast-cache
2. キャッシュ対象の定義
   ├─ path: ~/.cache/Cypress（Cypressバイナリ）
   ├─ invalidateOn: __filename（scripts/cache.js自体の変更でキャッシュ無効化）
   └─ command: echo "No operation needed — cache intact"（キャッシュヒット時のコマンド）
3. キャッシュ状態の判定
   ├─ キャッシュ有効: コマンドを実行（No operation needed）
   └─ キャッシュ無効: Cypressバイナリの再ダウンロードを要求
4. ignoreIfFolderExists: false
   └─ フォルダが存在してもキャッシュチェックを実行
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト開始: node scripts/cache.js] --> B[cache-me-outside初期化]
    B --> C[キャッシュフォルダ確認: /opt/build/cache/fast-cache]
    C --> D{scripts/cache.js変更あり?}
    D -->|変更あり| E[キャッシュ無効化]
    E --> F[Cypressバイナリ再キャッシュ]
    D -->|変更なし| G{~/.cache/Cypressキャッシュあり?}
    G -->|あり| H[キャッシュから復元]
    H --> I[No operation needed - cache intact]
    G -->|なし| F
    F --> J[スクリプト正常終了]
    I --> J
```

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

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

本スクリプトはデータベースへのアクセスを行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | ディレクトリアクセスエラー | /opt/build/cache/ にアクセスできない | Netlifyビルド環境の設定を確認 |
| 1 | Cypressキャッシュ破損 | キャッシュファイルが破損している | キャッシュをクリアして再実行 |

### リトライ仕様

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

### 障害時対応

キャッシュ関連のエラーはビルド全体の失敗に直結しないことが多い。キャッシュが利用できない場合、Cypressバイナリは通常のインストールプロセスで再ダウンロードされる。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1件（Cypressバイナリキャッシュ） |
| 目標処理時間 | 数秒（キャッシュヒット時）、数分（キャッシュミス時のダウンロード） |
| メモリ使用量上限 | Node.jsデフォルトヒープサイズ |

## 排他制御

Netlifyビルドは1つずつ順次実行されるため、キャッシュの排他制御は不要。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| キャッシュログ | キャッシュヒット時 | "No operation needed -- cache intact" |
| キャッシュログ | キャッシュミス時 | キャッシュ復元・ダウンロード情報 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | なし | なし |
| エラー件数 | なし | なし |

## 備考

- 本スクリプトは `node scripts/cache.js` で実行される
- cache-me-outsideバージョン: ^0.0.10
- キャッシュフォルダ: `/opt/build/cache/fast-cache`（Netlify固有のパス）
- キャッシュ対象: `~/.cache/Cypress`（ホームディレクトリ配下）
- キャッシュ無効化条件: scripts/cache.js ファイル自体が変更された場合（`invalidateOn: __filename`）
- `ignoreIfFolderExists: false` により、フォルダが存在してもキャッシュチェックが常に実行される
- Netlifyビルド環境でのみ意味を持つスクリプトであり、ローカル開発環境での使用は想定されていない
- GitHub Actions環境では actions/cache を使用するため（No.14参照）、本スクリプトは使用されない
