# バッチ設計書 17-dotnet-install.sh

## 概要

本ドキュメントは、.NET SDKインストールスクリプト（eng/common/dotnet-install.sh）の設計仕様を記述したものである。

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

dotnet-install.shは、Linux/macOS環境で.NET SDK/ランタイムをインストールするためのシェルスクリプトである。このスクリプトはtools.shの共通関数を利用し、指定されたバージョンの.NET SDKまたはランタイムをローカル環境にインストールする。CPUアーキテクチャの自動検出機能を持ち、arm64、x64、arm、x86、riscv64、loongarch64等の多様なプラットフォームに対応する。

**業務上の目的・背景**：クロスプラットフォーム開発では、Linux/macOS環境でも適切なバージョンの.NET SDKが必要である。dotnet-install.shは、開発者のマシンやCI/CDエージェントに必要なSDK/ランタイムを自動的にインストールし、ビルド環境の一貫性を確保する。ARM64やRISC-Vなど、新しいアーキテクチャへの対応も組み込まれている。

**バッチの実行タイミング**：手動実行（開発環境セットアップ時）またはビルドスクリプトからの自動呼び出し。build.shやtools.shから間接的に呼び出されることもある。

**主要な処理内容**：
1. シンボリックリンクの解決とスクリプトルートの特定
2. tools.shの読み込み
3. CPUアーキテクチャの自動検出（uname -m）
4. コマンドライン引数の解析
5. InstallDotNet関数によるSDK/ランタイムのインストール

**前後の処理との関連**：ビルドスクリプト（build.sh）の前提処理として実行される。インストールされたSDKは後続のビルド処理で使用される。

**影響範囲**：.dotnet/ディレクトリにSDK/ランタイムがインストールされる。異なるアーキテクチャ指定時は.dotnet/{architecture}/に分離される。

## バッチ種別

インストール / 環境構築

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 指定なし |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動 / ビルドスクリプト |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Linux/macOS | Unix系OS環境 |
| Bash | Bash 4.0以上推奨 |
| curl または wget | SDKダウンロードに必要 |
| ネットワーク接続 | Microsoft SDKダウンロードサーバーへのアクセス |

### 実行可否判定

無効な引数が指定された場合はエラーメッセージを出力して終了する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| -version (-v) | string | No | Latest | SDKバージョン |
| -architecture (-a) | string | No | 自動検出 | アーキテクチャ |
| -runtime (-r) | string | No | dotnet | ランタイム種別 |
| -runtimesourcefeed | string | No | なし | 代替フィードURL |
| -runtimesourcefeedkey | string | No | なし | フィード認証キー |

### サポートアーキテクチャ

| CPU名（uname -m） | 変換後アーキテクチャ |
|------------------|-------------------|
| arm64, aarch64 | arm64 |
| amd64, x86_64 | x64 |
| armv*l | arm |
| i[3-6]86 | x86 |
| riscv64 | riscv64 |
| loongarch64 | loongarch64 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| コマンドライン引数 | パラメータ | バージョン、アーキテクチャ等 |
| uname -m | コマンド出力 | CPU情報 |
| getconf LONG_BIT | コマンド出力 | OSビット数（32/64ビット判定） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| .dotnet/ | ディレクトリ | インストールされたSDK/ランタイム |
| .dotnet/{architecture}/ | ディレクトリ | クロスアーキテクチャ用SDK |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | dotnet、各種DLL |
| 出力先 | リポジトリルート/.dotnet/ |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. スクリプト起動
   └─ #!/usr/bin/env bash
2. シンボリックリンク解決
   └─ while [[ -h "$source" ]] ループ
3. scriptroot確定
   └─ cd -P でディレクトリパス取得
4. tools.sh読み込み
   └─ . "$scriptroot/tools.sh"
5. デフォルト値設定
   ├─ version='Latest'
   ├─ architecture=''
   └─ runtime='dotnet'
6. コマンドライン引数解析
   └─ while/case構文
7. CPUアーキテクチャ検出
   └─ uname -m による検出
8. 32ビットOS on 64ビットCPU判定
   └─ getconf LONG_BIT による判定
9. dotnetRoot決定
   └─ クロスアーキテクチャ時はサブディレクトリ
10. InstallDotNet呼び出し
    └─ SDK/ランタイムのインストール
11. 終了処理
    └─ ExitWithExitCode
```

### フローチャート

```mermaid
flowchart TD
    A[dotnet-install.sh開始] --> B[シンボリックリンク解決]
    B --> C[tools.sh読み込み]
    C --> D[引数解析]
    D --> E[uname -mでCPU検出]
    E --> F{CPU種別}
    F -->|arm64/aarch64| G[buildarch=arm64]
    F -->|amd64/x86_64| H[buildarch=x64]
    F -->|armv*l| I[buildarch=arm]
    F -->|i386-686| J[buildarch=x86]
    F -->|riscv64| K[buildarch=riscv64]
    F -->|その他| L[buildarch=x64]
    G --> M{64ビットOS?}
    M -->|No| N[buildarch=arm]
    M -->|Yes| O[dotnetRoot決定]
    H --> O
    I --> O
    J --> O
    K --> O
    L --> O
    N --> O
    O --> P{クロスアーキテクチャ?}
    P -->|Yes| Q[dotnetRoot/.dotnet/arch]
    P -->|No| R[dotnetRoot/.dotnet]
    Q --> S[InstallDotNet呼び出し]
    R --> S
    S --> T{インストール成功?}
    T -->|Yes| U[ExitWithExitCode 0]
    T -->|No| V[エラー出力]
    V --> W[ExitWithExitCode 非ゼロ]
    U --> Z[終了]
    W --> Z
```

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

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

本バッチはデータベース操作を行わない。

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | なし | なし | データベース操作なし |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 無効な引数 | 未知のオプション指定 | 正しいオプションを使用 |
| 非ゼロ | ダウンロードエラー | ネットワーク障害 | ネットワーク確認 |
| 非ゼロ | インストールエラー | 権限不足 | 権限確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | InstallDotNet内で複数フィード試行 |
| リトライ間隔 | フィードごとに即座に切り替え |
| リトライ対象エラー | ダウンロードエラー |

### 障害時対応

1. ネットワーク接続を確認
2. 代替フィード（-runtimesourcefeed）を使用
3. 手動でSDKをダウンロード・展開
4. DOTNET_INSTALL_DIRを確認

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1 SDK/ランタイム |
| 目標処理時間 | ネットワーク速度依存（1-5分） |
| メモリ使用量上限 | 指定なし |

## 排他制御

同一ディレクトリへの同時インストールは推奨されない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | インストール開始時 | バージョン、アーキテクチャ |
| 進捗ログ | ダウンロード中 | 試行中のフィード情報 |
| エラーログ | エラー発生時 | Write-PipelineTelemetryError |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | 10分 | CI/CDパイプライン |
| エラー件数 | 1件 | 開発者 |

## 備考

- ARM64環境で32ビットOS（Raspberry Pi OS等）を検出する特殊ロジックを含む
- 複数のダウンロードフィード（public、dotnetbuilds、private_feed）を順次試行
- 未知のCPUはx64として扱われる
- LTTNG_HOMEを$HOMEに設定してCore CLRの警告を抑制
