# バッチ設計書 33-azure-pipelines.yml

## 概要

本ドキュメントは、Avaloniaフレームワークのメイン継続的インテグレーション（CI）パイプラインを定義するAzure Pipelines設定ファイル「azure-pipelines.yml」の設計仕様を記載するものです。

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

このパイプラインは、Avaloniaフレームワークのコードがリポジトリにプッシュされた際に自動的に実行され、Linux、macOS、Windowsの3つのプラットフォームで並列にビルド・テストを実行し、NuGetパッケージや成果物を生成するCI/CDパイプラインです。

**業務上の目的・背景**：Avaloniaはクロスプラットフォームの.NET UIフレームワークであり、複数のOS（Windows、macOS、Linux）で動作することを保証する必要があります。すべての変更が各プラットフォームで正しく動作することを検証するため、プッシュごとに自動的にビルドとテストを実行することで、品質を維持し、早期に問題を検出します。また、パッケージ生成を自動化することで、リリースプロセスの効率化と一貫性を実現します。

**バッチの実行タイミング**：GitHubリポジトリへのプッシュ時、またはプルリクエスト作成・更新時にAzure Pipelinesによって自動的にトリガーされます。

**主要な処理内容**：
1. GetPRNumber: PR番号とバージョン情報の出力（Linux環境）
2. Linux: Linuxでのビルドとテスト実行（ubuntu-24.04）
3. macOS: macOSでのネイティブビルドとパッケージ生成（macos-15）
4. Windows: Windowsでのビルド、テスト、パッケージ生成（windows-2025）

**前後の処理との関連**：本パイプラインはNukeビルドシステムの各ターゲット（CiAzureLinux、CiAzureOSX、CiAzureWindows）を呼び出します。ビルド成果物は後続のリリースプロセスで使用されます。

**影響範囲**：Avaloniaフレームワーク全体のビルド・テスト・パッケージ生成に影響を与えます。成果物として、NuGetパッケージ、ネイティブライブラリ、サンプルZIPが生成されます。

## バッチ種別

CI/CD パイプライン（ビルド・テスト・パッケージ生成）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | イベント駆動（プッシュ/PR時） |
| 実行時刻 | 任意（イベント発生時） |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | Git push / Pull Request |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Azure DevOps接続 | Azure Pipelinesサービス接続が設定されていること |
| ビルドエージェント | 各OS用のホステッドエージェントが利用可能であること |
| .NET SDK | .NET 10.0 SDKが利用可能であること |
| Xcode | macOSでXcode 26.0が利用可能であること |

### 実行可否判定

リポジトリへのプッシュまたはプルリクエストイベントでトリガーされます。特定のブランチやパスのフィルタリングは本YAMLでは定義されていません。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| Build.SourcesDirectory | string | Yes | (自動設定) | ソースコードのチェックアウトディレクトリ |
| Build.ArtifactStagingDirectory | string | Yes | (自動設定) | 成果物のステージングディレクトリ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| GitHubリポジトリ | Git | Avaloniaソースコードリポジトリ |
| global.json | JSON | .NET SDKバージョン指定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| PRNumber | テキストファイル | PR番号とバージョン情報 |
| NuGet | NuGetパッケージ | Windows/macOSでビルドされたNuGetパッケージ |
| NuGetOSX | NuGetパッケージ | macOSでビルドされたNuGetパッケージ |
| Avalonia.Native.OSX | バイナリ | macOSネイティブライブラリ |
| Samples | ZIPファイル | サンプルアプリケーションのアーカイブ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| NuGetパッケージ | artifacts/nuget ディレクトリに生成 |
| ネイティブライブラリ | Build/Products/Release ディレクトリに生成 |
| サンプルZIP | artifacts/zip ディレクトリに生成 |
| テスト結果 | artifacts/test-results/*.trx |

## 処理フロー

### 処理シーケンス

```
1. GetPRNumber ジョブ（Linux）
   └─ .NET 10.0 SDKセットアップ
   └─ build.sh --target OutputVersion 実行
   └─ PRNumber成果物を公開

2. Linux ジョブ（並列実行）
   └─ .NET 8.0 Runtime / 10.0 SDKセットアップ
   └─ Android/macOS/WASM ワークロードインストール
   └─ build.sh --target CiAzureLinux 実行
   └─ テスト結果を公開

3. macOS ジョブ（並列実行）
   └─ .NET 8.0 Runtime / 10.0 SDKセットアップ
   └─ iOS/Android/macOS/WASM ワークロードインストール
   └─ C++ヘッダー生成
   └─ Xcodeでネイティブビルド
   └─ build.sh --target CiAzureOSX 実行
   └─ ネイティブライブラリとNuGetを公開

4. Windows ジョブ（並列実行）
   └─ .NET 8.0 Runtime / 10.0 SDKセットアップ
   └─ Android/iOS/tvOS/WASM ワークロードインストール
   └─ Nuke グローバルツールインストール
   └─ nuke --target CiAzureWindows 実行
   └─ NuGetパッケージとサンプルを公開
```

### フローチャート

```mermaid
flowchart TD
    A[パイプライン開始] --> B[GetPRNumber]
    A --> C[Linux ビルド]
    A --> D[macOS ビルド]
    A --> E[Windows ビルド]

    B --> B1[.NET SDK セットアップ]
    B1 --> B2[OutputVersion 実行]
    B2 --> B3[PRNumber 成果物公開]

    C --> C1[.NET セットアップ]
    C1 --> C2[ワークロードインストール]
    C2 --> C3[CiAzureLinux 実行]
    C3 --> C4[テスト結果公開]

    D --> D1[.NET セットアップ]
    D1 --> D2[ワークロードインストール]
    D2 --> D3[C++ヘッダー生成]
    D3 --> D4[Xcode ビルド]
    D4 --> D5[CiAzureOSX 実行]
    D5 --> D6[成果物公開]

    E --> E1[.NET セットアップ]
    E1 --> E2[ワークロードインストール]
    E2 --> E3[Nuke インストール]
    E3 --> E4[CiAzureWindows 実行]
    E4 --> E5[成果物公開]

    B3 --> F[パイプライン終了]
    C4 --> F
    D6 --> F
    E5 --> F
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ビルドエラー | コンパイルエラー | ソースコードを修正 |
| - | テストエラー | テスト失敗 | テストまたはコードを修正 |
| - | SDKエラー | .NET SDKのインストール失敗 | global.jsonを確認 |
| - | Xcodeエラー | ネイティブビルド失敗 | Xcodeプロジェクトを確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | Azure Pipelinesのデフォルト設定に依存 |
| リトライ間隔 | - |
| リトライ対象エラー | 一時的なネットワークエラーなど |

### 障害時対応

パイプライン失敗時は、Azure DevOpsのビルドログを確認し、失敗したステップを特定してください。テスト結果は公開されているため、失敗したテストの詳細を確認できます。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（CI/CDプロセス） |
| コミットタイミング | - |
| ロールバック条件 | 失敗時は成果物が公開されない |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1パイプライン実行 |
| 目標処理時間 | 30-60分程度（全ジョブ完了） |
| メモリ使用量上限 | ホステッドエージェントの制限に依存 |

## 排他制御

Azure Pipelinesの同時実行制御に依存します。デフォルトでは複数のパイプラインが並列実行される可能性があります。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| ビルドログ | 各ステップ実行時 | コマンド出力、エラーメッセージ |
| テスト結果 | テスト完了時 | TRXフォーマットのテスト結果 |
| 成果物 | ジョブ完了時 | ビルド成果物の情報 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ビルド失敗 | 1回 | Azure DevOps通知設定に依存 |
| テスト失敗 | 1件以上 | Azure DevOps通知設定に依存 |

## 備考

- 本パイプラインは4つのジョブ（GetPRNumber、Linux、macOS、Windows）で構成されます
- Linux/macOS/Windowsの3ジョブは並列実行されます
- macOSジョブではXcode 26.0を使用してネイティブライブラリをビルドします
- テスト結果は `not(canceled())` 条件で、キャンセル以外の場合に公開されます
- 成果物は `succeeded()` 条件で、成功時のみ公開されます
- .NET 10.0 SDKと.NET 8.0 Runtimeの両方がセットアップされます
