# インフラ設計書

## 概要

本ドキュメントは、F# コンパイラ、コアライブラリ、およびエディタツールのリポジトリ (dotnet/fsharp) におけるCI/CDインフラストラクチャの設計を記載する。本プロジェクトはオープンソースプロジェクトであり、Azure DevOps (Azure Pipelines) とGitHub Actionsを組み合わせたビルド・テスト・リリースパイプラインで構成される。

## システム構成

### 全体構成

本プロジェクトのインフラは以下の主要コンポーネントで構成される：

1. **CI/CDプラットフォーム**: Azure DevOps (Azure Pipelines) をメインとし、GitHub Actionsを補完的に使用
2. **ビルドエージェントプール**: Microsoft 1ES (One Engineering System) プールを使用
3. **成果物管理**: Azure DevOps Artifacts、VSTS Drop、Visual Studio Drop Service
4. **パッケージ配布**: NuGet (Azure DevOps Artifacts フィード)
5. **Visual Studio統合**: VS Insertion パイプラインによる自動統合

### サーバー構成

| サーバー種別 | 役割 | スペック | 台数 |
| --- | --- | --- | --- |
| Azure DevOps Agent (Windows) | ビルド/テスト実行 | NetCore1ESPool-Internal / NetCore1ESPool-Svc-Internal (windows.vs2026preview.scout.amd64) | 動的スケーリング |
| Azure DevOps Agent (Linux) | ビルド/テスト実行 | DncEngPublicBuildPool (build.azurelinux.3.amd64.open) | 動的スケーリング |
| Azure DevOps Agent (macOS) | ビルド/テスト実行 | VMイメージ (macos-latest) | 動的スケーリング |
| GitHub Actions Runner | ワークフロー実行 | ubuntu-latest | 動的スケーリング |
| NuGet Feed Server | パッケージ配布 | Azure DevOps Artifacts | マネージドサービス |

### ネットワーク構成

- **パブリックビルド**: `dnceng-public` プロジェクト配下で実行
- **内部ビルド**: `dnceng` プロジェクト配下のプライベートプールで実行
- **アーティファクト配信**:
  - Azure DevOps Artifacts (`pkgs.dev.azure.com/dnceng/public/_packaging/*`)
  - Visual Studio Drop Service (`vsdrop.corp.microsoft.com`)
  - DevDiv Artifacts (`devdiv.artifacts.visualstudio.com`)

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| .NET SDK | 10.0.101 | ビルド・テスト実行環境 |
| Visual Studio | 18.0 (VS 2026 Preview) | 統合開発環境・ビルドツール |
| Microsoft.DotNet.Arcade.Sdk | 10.0.0-beta.26110.1 | 共通ビルドインフラストラクチャ |
| Microsoft.DotNet.Helix.Sdk | 8.0.0-beta.23255.2 | 分散テスト実行 |
| MicroBuild | 最新 | 署名・パッケージング |
| xcopy-msbuild | 18.0.0 | MSBuildポータブル配布 |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| Azure DevOps Artifacts | NuGetパッケージフィード | NuGet プロトコル (HTTPS) |
| Visual Studio Drop Service | VSビルド成果物管理 | REST API |
| DevDiv Artifacts | VS Insertionアーティファクト | REST API |
| GitHub | ソースコード管理・ワークフロー | Git/HTTPS |
| Helix | 分散テスト実行 | Azure DevOps統合 |
| OneLocBuild | ローカライゼーション | Azure Pipeline タスク |
| TSA (Trust Services Automation) | セキュリティ分析 | Azure Pipeline タスク |

## スケーリング設計

### ビルドエージェントのスケーリング

- **動的スケーリング**: Azure DevOps エージェントプールは需要に応じて自動スケーリング
- **並列ビルド**: テストジョブは最大4並列で実行 (`strategy.parallel: 4`)
- **マトリックスビルド**: 複数構成の同時ビルドをサポート（Release/Debug、CoreCLR/Desktop等）

### プール分離戦略

```
メインブランチ (main):     NetCore1ESPool-Internal
リリースブランチ (release/*): NetCore1ESPool-Svc-Internal
パブリックビルド:           DncEngPublicBuildPool
```

この分離により：
- リリースビルドとPRビルドのキューイングを分離
- COGS (Cost of goods sold) の正確な追跡
- リソース競合の回避

## 可用性設計

### 冗長構成

- **マルチプラットフォームビルド**: Windows、Linux、macOSで同時ビルド・テスト実行
- **マルチリージョン**: Azure DevOps のグローバルインフラを活用
- **フォールバック**: プール障害時は代替プールへのフェイルオーバー可能

### 障害対応

- **リトライ機能**: テスト結果公開タスクで自動リトライ (`retryCountOnTaskFailure: 10`)
- **継続実行**: 一部タスク失敗時も後続処理を継続 (`continueOnError: true`)
- **ダンプ収集**: ビルド失敗時にプロセスダンプを自動収集・保存

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| ソースコード | Git (GitHub) | リアルタイム | 無期限 |
| ビルドアーティファクト | Azure Pipeline Artifacts | ビルド毎 | 90日 (VSTS Drop) |
| NuGetパッケージ | Azure DevOps Artifacts | リリース毎 | 無期限 |
| テストログ | Pipeline Artifacts | ビルド毎 | デフォルト保持 |
| シンボル情報 | Symbol Server | リリース毎 | 無期限 |

## 監視設計

### ビルド監視

- **ビルドステータス**: Azure DevOps ダッシュボードで可視化
- **バッジ表示**: READMEにビルドステータスバッジを表示
  - URL: `https://dev.azure.com/dnceng-public/public/_apis/build/status/dotnet/fsharp/fsharp-ci`
- **テスト結果**: XUnit形式でテスト結果を公開・可視化

### セキュリティ監視

- **CodeQL**: 静的コード分析 (`Codeql.Enabled: true`)
- **BinSkim**: バイナリセキュリティ分析
- **PoliCheck**: ポリシーコンプライアンスチェック
- **CredScan**: 認証情報漏洩スキャン
- **TSA統合**: セキュリティ問題の自動報告

### テレメトリ

- **テレメトリ収集**: `enableTelemetry: true` でビルドメトリクス収集
- **Helixレポート**: 分散テスト結果の集約 (`helixRepo: dotnet/fsharp`)

## パイプライン構成

### メインパイプライン (azure-pipelines.yml)

| ステージ | 目的 | 実行条件 |
| --- | --- | --- |
| build | ビルド・テスト・署名 | 常時 |
| post-build | SDL検証・公開 | ビルド成功後 |
| insert | VS Insertion | mainブランチ・ビルド成功後 |

### PRパイプライン (azure-pipelines-PR.yml)

| ジョブ | 目的 | タイムアウト |
| --- | --- | --- |
| Determinism_Debug | 決定論的ビルド検証 | 90分 |
| CheckCodeFormatting | コードフォーマット検証 | - |
| WindowsCompressedMetadata | メタデータ圧縮ビルド | 120分 |
| Linux | Linuxビルド・テスト | 120分 |
| MacOS | macOSビルド・テスト | 120分 |
| EndToEndBuildTests | E2Eビルドテスト | - |
| Benchmarks | パフォーマンステスト | - |
| Build_And_Test_AOT_Windows | トリミング・AOTテスト | - |

## 備考

### Arcade SDK統合

本プロジェクトは Microsoft.DotNet.Arcade.Sdk を使用し、.NET チーム共通のビルドインフラストラクチャを活用している。これにより：
- 共通のビルドスクリプト (`eng/common/`)
- 統一された署名プロセス
- 一貫したアーティファクト公開フロー

### Source Build対応

Linuxディストリビューション向けのソースビルドをサポート：
- コンテナ: `mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9`
- ビルド引数: `--source-build`

### 環境変数

| 変数名 | 用途 |
| --- | --- |
| `FSHARP_CACHE_OVERRIDE` | キャッシュサイズ制御 (256) |
| `FSharp_CacheEvictionImmediate` | 即時キャッシュ削除 |
| `NativeToolsOnMachine` | ネイティブツール使用フラグ |
| `DOTNET_DbgEnableMiniDump` | ダンプ収集有効化 |
| `DOTNET_DbgMiniDumpType` | ダンプタイプ (3: Triage) |
