# バッチ設計書 46-internal-feed-operations.sh

## 概要

本ドキュメントは、内部NuGetフィード操作スクリプト（internal-feed-operations.sh）の設計仕様を記載したものです。このスクリプトは、.NET内部ビルドで使用される内部NuGetフィードへの認証設定とArcade SDKのリストアを行います。

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

このバッチは、Microsoftの内部ビルドエージェント上で内部NuGetフィードにアクセスするための認証設定を行います。NuGet Credential Providerのインストールと、VSS_NUGET_EXTERNAL_FEED_ENDPOINTS環境変数の設定を自動化します。

**業務上の目的・背景**：.NETの公式ビルドプロセスでは、公開されていない内部パッケージフィードからの依存関係の取得が必要な場合があります。これらの内部フィードへのアクセスには認証が必要であり、CI/CDパイプライン上で自動的に認証を設定する必要があります。このスクリプトにより、ビルドエージェントは内部フィードから安全にパッケージを取得できます。

**バッチの実行タイミング**：内部ビルド（Microsoft社内のCI/CDパイプライン）の初期段階で実行されます。公開ビルドでは使用されません。

**主要な処理内容**：
1. `setup`オペレーション：
   - NuGet Credential Providerのインストール
   - NuGet.configからdarc-int-*フィードを検出
   - VSS_NUGET_EXTERNAL_FEED_ENDPOINTS環境変数を設定
2. `install-restore`オペレーション：
   - .NET SDKのインストール
   - Arcade SDKのリストア

**前後の処理との関連**：tools.shに依存しています。このスクリプトで設定された認証情報は、後続のdotnet restoreやMSBuildで使用されます。

**影響範囲**：Azure DevOpsの環境変数、NuGet認証設定に影響を与えます。

## バッチ種別

認証設定 / フィード操作 / 内部ビルド専用

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 内部ビルド時のみ |
| 実行時刻 | CI/CDパイプラインの初期段階 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | CI/CDパイプラインのステップとして実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| curl または wget | Credential Providerスクリプトダウンロード用 |
| 認証トークン | --authtokenパラメータで渡される内部フィード用トークン |
| NuGet.configの存在 | リポジトリルートにNuGet.configが存在すること |
| tools.sh | 同一ディレクトリにtools.shが存在すること |

### 実行可否判定

- --operationパラメータが指定されていない場合は何も実行しない
- 不明なオペレーションが指定された場合はエラーメッセージを出力

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --operation | string | Yes | なし | 実行するオペレーション（setup / install-restore） |
| --authtoken | string | No | なし | 内部フィード認証用トークン |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| NuGet.config | XML | 内部フィードURL定義 |
| installcredprovider.sh | シェルスクリプト | GitHub artifacts-credproviderから取得 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| $HOME/.nuget/plugins | ディレクトリ | Credential Providerプラグイン |
| VSS_NUGET_EXTERNAL_FEED_ENDPOINTS | 環境変数 | フィード認証情報（JSON形式） |
| 標準出力 | テキスト | Azure DevOps変数設定コマンド |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | installcredprovider.sh（一時ファイル、実行後削除） |
| 出力先 | カレントディレクトリ |
| 文字コード | UTF-8 |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
[setupオペレーション]
1. installcredprovider.shのダウンロード
   └─ artifacts-credproviderのGitHubから取得
2. Credential Providerのインストール
   └─ スクリプトを実行してプラグインをインストール
3. インストール結果の確認
   └─ $HOME/.nuget/pluginsの存在確認
4. NuGet.configの解析
   └─ darc-int-*フィードを検出
5. 環境変数の設定
   └─ VSS_NUGET_EXTERNAL_FEED_ENDPOINTSを設定
   └─ NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLEDをFalseに設定

[install-restoreオペレーション]
1. .NET SDKのインストール
   └─ バージョン2.1.507をインストール
2. restore.projの作成
   └─ Arcade SDK参照プロジェクトを作成
3. dotnet restoreの実行
   └─ Arcade SDKをリストア
4. クリーンアップ
   └─ 一時ファイルとSDKディレクトリを削除
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[引数解析]
    B --> C{operation?}
    C -->|setup| D[installcredprovider.sh取得]
    C -->|install-restore| E[.NET SDK 2.1.507インストール]
    C -->|その他| F[エラー: Unknown operation]
    D --> G[Credential Providerインストール]
    G --> H{インストール成功?}
    H -->|Yes| I[NuGet.config解析]
    H -->|No| J[エラー終了]
    I --> K[darc-int-*フィード検出]
    K --> L{フィードあり?}
    L -->|Yes| M[環境変数設定]
    L -->|No| N[メッセージ出力]
    M --> O[正常終了]
    N --> O
    E --> P[restore.proj作成]
    P --> Q[dotnet restore実行]
    Q --> R[クリーンアップ]
    R --> O
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | - | - | このバッチはデータベース操作を行いません |

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | Credential Provider install failed | プラグインディレクトリが作成されない | ネットワーク接続を確認、手動でインストール |
| 1 | NuGet.config not found | リポジトリルートにNuGet.configがない | NuGet.configを作成 |
| - | Unknown operation | 不明なオペレーション指定 | setup または install-restore を指定 |

### リトライ仕様

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

### 障害時対応

1. エラーメッセージを確認
2. ネットワーク接続を確認（GitHubへのアクセス）
3. 認証トークンの有効性を確認
4. NuGet.configの内容を確認

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回/ビルド |
| 目標処理時間 | 数秒〜数十秒 |
| メモリ使用量上限 | 特になし |

## 排他制御

特になし。CI/CDパイプラインの同一ジョブ内で1回のみ実行されることを想定。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 情報ログ | Credential Providerセットアップ時 | 各ステップの進捗メッセージ |
| 情報ログ | フィード検出時 | 検出されたフィード情報 |
| Azure DevOpsコマンド | 環境変数設定時 | ##vso[task.setvariable ...] |
| エラーログ | 失敗時 | Write-PipelineTelemetryErrorによるエラー |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDパイプラインの失敗通知 |

## 備考

- このスクリプトは内部ビルド専用であり、公開リポジトリのビルドでは使用されません
- VSS_NUGET_EXTERNAL_FEED_ENDPOINTS環境変数の形式：
  ```json
  {"endpointCredentials": [{"endpoint": "URL", "password": "TOKEN"}, ...]}
  ```
- darc-int-*フィードはMaestro（依存関係管理ツール）によって自動生成されるフィードです
- install-restoreオペレーションはMSBuildの問題（#4430）のワークアラウンドとして使用されます
- Credential ProviderはMicrosoftのartifacts-credproviderプロジェクトから取得されます
