# インフラ設計書

## 概要

本ドキュメントは、Avaloniaプロジェクトの開発・ビルド・テスト環境のインフラ構成を記載したものである。Avaloniaはクロスプラットフォームの.NET UIフレームワークであり、Windows、macOS、Linux、iOS、Android、WebAssemblyなど複数のプラットフォームをサポートしている。本プロジェクトはライブラリ/フレームワークプロジェクトであり、サーバーサイドのインフラは持たず、CI/CDパイプラインによるビルド・テスト・パッケージ配布を主要なインフラとしている。

## システム構成

### 全体構成

Avaloniaプロジェクトのインフラは以下の要素で構成される：

1. **CI/CDパイプライン（Azure DevOps Pipelines）**: ビルド、テスト、NuGetパッケージ生成を自動化
2. **GitHub Actions**: CLA（Contributor License Agreement）ボットの実行
3. **NuGetパッケージリポジトリ**: ライブラリの配布
4. **ソースコード管理（GitHub）**: バージョン管理とコラボレーション

### サーバー構成

| サーバー種別 | 役割 | スペック | 台数 |
| --- | --- | --- | --- |
| Azure Pipelines - Ubuntu 24.04 VM | Linuxビルド・テスト | Azure Hosted Agent (標準) | 1 |
| Azure Pipelines - macOS 15 VM | macOSビルド・テスト・ネイティブコンパイル | Azure Hosted Agent (標準) | 1 |
| Azure Pipelines - Windows 2025 VM | Windowsビルド・テスト | Azure Hosted Agent (標準) | 1 |
| Azure Pipelines - AvaloniaMacPool | 統合テスト専用Mac | カスタムプール（セルフホスト） | 可変 |
| GitHub Actions - ubuntu-latest | CLAボット実行 | GitHub Hosted Runner | 1 |

### ネットワーク構成

- **外部通信先**:
  - `api.nuget.org` - NuGetパッケージの取得・公開
  - `pkgs.dev.azure.com/dnceng/public/_packaging/dotnet10-transport` - .NET 10プレビューパッケージの取得
  - `github.com` - ソースコード管理、CLAボット
  - `dev.azure.com/AvaloniaUI` - Azure DevOps Pipelinesサービス

- **ネットワーク構成の特徴**:
  - すべてのビルドエージェントはインターネット経由で外部リポジトリにアクセス
  - プライベートネットワークは使用していない（すべてクラウドホスト）

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| .NET SDK | 10.0.101 | ビルド・テスト・パッケージング |
| .NET Runtime | 8.0.x | レガシーターゲットフレームワークのテスト実行 |
| Nuke Build | 9.0.4 | ビルドオーケストレーション |
| Xcode | 26.0 / 15.2 | macOS/iOSネイティブコンポーネントのビルド |
| WinAppDriver | 最新 | Windows UIオートメーションテスト |
| Appium | 最新 | クロスプラットフォーム統合テスト |
| Microsoft.Build.Traversal | 4.1.0 | MSBuild SDK拡張 |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| Azure DevOps Pipelines | CI/CDパイプライン | Azure DevOps統合 |
| GitHub | ソースコード管理、CLA管理 | Git/REST API |
| NuGet.org | パッケージ配布 | NuGet API v3 |
| Azure DevOps Artifacts | .NET 10プレビューパッケージ | NuGet API v3 |
| Open Collective | 寄付・スポンサー管理 | 外部リンク |

## スケーリング設計

### CI/CD実行のスケーリング

- **Azure Pipelines**: Microsoft-hostedエージェントを使用しており、並列実行数はAzure DevOps組織のライセンスに依存
- **ジョブの並列実行**: Linux、macOS、Windowsのビルドジョブは互いに独立しており、並列実行される
- **GetPRNumber ジョブ**: バージョン情報出力用の軽量ジョブとして最初に実行

### ビルドパフォーマンス最適化

- **ハードリンク使用**: `CreateHardLinksForCopyAdditionalFilesIfPossible`等の設定によりビルド時間を短縮
- **ノード再利用の無効化**: CI環境では`/nodeReuse:false`でビルドの再現性を確保

## 可用性設計

### CI/CD可用性

- **Azure Pipelines**: Microsoftが提供するSLAに準拠（99.9%可用性）
- **GitHub Actions**: GitHubが提供するSLAに準拠
- **セルフホストエージェント（AvaloniaMacPool）**: 統合テスト用のカスタムMacプール、可用性はプール管理に依存

### フェイルオーバー

- CI/CDジョブの失敗時は手動での再実行が必要
- テスト結果の公開は`condition: not(canceled())`で失敗時も実行される

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| ソースコード | Gitリポジトリ（GitHub） | コミット毎 | 無期限 |
| ビルド成果物 | Azure Pipelines Artifacts | ビルド毎 | Azure DevOps設定に依存 |
| NuGetパッケージ | NuGet.org | リリース毎 | 無期限 |
| パイプライン設定 | YAMLファイル（リポジトリ内） | コミット毎 | 無期限 |

## 監視設計

### Azure DevOps Pipelines監視

- **ビルドステータス**: Azure DevOpsダッシュボードで確認可能
- **テスト結果**: PublishTestResultsタスクによりAzure DevOpsに統合
- **ビルドバッジ**: READMEにビルドステータスバッジを表示

### 外部監視

- **NuGetダウンロード数**: NuGet.orgで公開
- **GitHubスポンサー/バッカー数**: Open Collectiveで追跡

## ビルド環境詳細

### ターゲットフレームワーク

| ターゲット | フレームワーク識別子 |
| --- | --- |
| 現行バージョン | net10.0 |
| レガシーバージョン | net8.0 |
| Windows | net10.0-windows |
| macOS | net10.0-macos |
| Android | net10.0-android36.0 |
| Mac Catalyst | net10.0-maccatalyst26.0 |
| iOS | net10.0-ios26.0 |
| tvOS | net10.0-tvos26.0 |
| Browser (WebAssembly) | net10.0-browser |

### ワークロード要件

| プラットフォーム | 必要なワークロード |
| --- | --- |
| Linux | android, macos, wasm-tools |
| macOS | android, ios, maccatalyst, macos, wasm-tools |
| Windows | android, maccatalyst, ios, tvos, wasm-tools |

## 備考

- 本プロジェクトはフレームワーク/ライブラリプロジェクトであり、サーバーサイドインフラ（Web/AP/DBサーバー等）は持たない
- Docker/Kubernetes、Terraform等のIaC設定は存在しない
- すべてのCI/CDはAzure Pipelines YAMLおよびGitHub Actions YAMLで定義されている
- ビルドオーケストレーションにはNuke Buildを使用しており、nukebuild/Build.csで定義されている
