# インフラ設計書

## 概要

本ドキュメントは、Nimプログラミング言語コンパイラプロジェクトのインフラストラクチャ設計を記載する。本プロジェクトはオープンソースのコンパイラ開発プロジェクトであり、CI/CD（継続的インテグレーション/継続的デリバリー）を中心としたクラウドベースのインフラストラクチャを採用している。

## システム構成

### 全体構成

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

1. **ソースコードリポジトリ**: GitHub（nim-lang/Nim）
2. **CI/CDプラットフォーム**: Azure Pipelines + GitHub Actions
3. **ドキュメントホスティング**: GitHub Pages
4. **パッケージ配布**: nim-lang.org（公式サイト）

### サーバー構成

| サーバー種別 | 役割 | スペック | 台数 |
| --- | --- | --- | --- |
| GitHub Actions Runner（Linux） | CI/CD実行、テスト、ドキュメントビルド | ubuntu-22.04 / ubuntu-24.04 / ubuntu-latest | 動的スケーリング |
| GitHub Actions Runner（macOS） | CI/CD実行、macOS向けビルド | macos-14 / macos-15 (Apple Silicon) | 動的スケーリング |
| GitHub Actions Runner（Windows） | CI/CD実行、Windows向けビルド | windows-latest / windows-2025 | 動的スケーリング |
| Azure Pipelines Agent（Linux） | メインCI/CD実行 | ubuntu-24.04 (amd64) | 動的スケーリング |
| Azure Pipelines Agent（macOS） | macOS向けビルド | macos-15 (arm64) | 動的スケーリング |
| Azure Pipelines Agent（Windows） | Windows向けビルド（バッチ分割） | windows-2025 (amd64) | 3（バッチ0_3, 1_3, 2_3） |
| GitHub Pages | ドキュメントホスティング | 静的ホスティング | 1 |

### ネットワーク構成

本プロジェクトはクラウドベースのSaaS型CI/CDサービスを利用しているため、専用のネットワークインフラは存在しない。以下の外部接続が必要：

- **GitHub.com**: ソースコード管理、Issue/PR管理、GitHub Actions
- **dev.azure.com**: Azure Pipelines CI/CD
- **nim-lang.org**: 依存ファイル（MinGW等）のダウンロード
- **各種パッケージリポジトリ**: apt（Ubuntu）、brew（macOS）、choco（Windows）

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| GCC | 14.x（Linux）、各OS標準 | Cコンパイラ（Nimのバックエンド） |
| G++ | 14.x（Linux）、各OS標準 | C++コンパイラ（C++バックエンド用） |
| MinGW | 64bit版 | Windows向けGCCツールチェーン |
| Node.js | 20.x | JavaScript関連テスト、CI補助ツール |
| Make / GMake | システム標準 | csourcesビルド |
| Git | システム標準 | ソースコード管理 |
| Valgrind | システム標準 | メモリリーク検出（Linux） |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| GitHub | ソースコード管理、Issue/PR管理 | HTTPS/Git |
| Azure Pipelines | メインCI/CDパイプライン | Azure DevOps統合 |
| GitHub Actions | 補助CI/CD、ドキュメントビルド | GitHub統合 |
| GitHub Pages | ドキュメント公開 | GitHub統合（自動デプロイ） |
| nim-lang.org | 依存ファイル配布 | HTTPS |
| Open Collective | 寄付管理 | Web API |

## スケーリング設計

### CI/CD実行環境

- **水平スケーリング**: GitHub Actions、Azure Pipelinesともにジョブ単位で自動スケーリング
- **並列実行**: マトリックスビルドにより複数OS/アーキテクチャで並列テスト実行
  - Azure Pipelines: 最大7並列（Linux amd64, macOS arm64, macOS arm64 C++, Windows amd64 x3バッチ）
  - GitHub Actions: OS x バッチの組み合わせで並列実行
- **バッチ分割**: Windowsテストは3バッチ（0_3, 1_3, 2_3）に分割して並列実行
- **タイムアウト設定**: 60〜90分のジョブタイムアウトを設定

### ビルドキャッシュ

- **csources キャッシュ**: ブートストラップ用Cソースコードは事前ビルドされたバイナリをキャッシュ
- **依存関係キャッシュ**: 各CIプラットフォームのキャッシュ機能を活用

## 可用性設計

### CI/CD冗長性

- **マルチプラットフォームCI**: Azure PipelinesとGitHub Actionsの併用により、単一サービス障害時も部分的なCI継続が可能
- **フェイルファスト無効化**: `fail-fast: false`設定により、一部テスト失敗時も他プラットフォームのテストを継続

### 自動リトライ

- **Git checkout**: `fetch-depth: 2`による浅いクローンで高速化
- **依存関係インストール**: パッケージマネージャのアップデート失敗時の継続処理

### コンカレンシー制御

- **重複実行防止**: `concurrency`設定によりPR単位で重複ワークフローをキャンセル
  ```yaml
  concurrency:
    group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
    cancel-in-progress: true
  ```

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| ソースコード | Git分散リポジトリ | コミット単位（リアルタイム） | 永続（Gitヒストリ） |
| csources（ブートストラップ） | 別リポジトリ（csources_v3） | Nimバージョンアップ時 | 永続 |
| ドキュメント | GitHub Pages（develブランチからビルド） | develブランチへのプッシュ時 | 最新版のみ |
| CIアーティファクト | Azure Pipelines/GitHub Actions標準 | ビルド単位 | サービス標準（30-90日） |

## 監視設計

### CI/CDステータス監視

- **Azure Pipelines**: ビルドステータスバッジ、パイプライン通知
- **GitHub Actions**: ワークフローステータス、PR checks
- **Stale PR監視**: 365日以上非アクティブなPRを自動で警告、395日で自動クローズ

### パフォーマンス監視

- **メモリ使用量追跡**: `ci_publish.yml`によるORCブート時のコンパイラメモリ使用量追跡
- **テスト結果レポート**: `ci_testresults.nim`によるテスト結果の集計

### 通知設定

- **PRコメント自動投稿**: テスト結果、メモリ使用量をPRコメントとして自動投稿
- **GitHub Issue自動管理**: Stale Actionによる古いPRの自動管理

## 環境構成

### ブランチ戦略

| ブランチ | 用途 | CI設定 |
| --- | --- | --- |
| devel | 開発ブランチ | フルCI実行、ドキュメント自動公開 |
| version-* | リリースブランチ | フルCI実行 |
| PR | プルリクエスト | フルCI実行 |

### 環境変数

| 変数名 | 用途 | 設定場所 |
| --- | --- | --- |
| NIM_TEST_PACKAGES | パッケージテスト有効化 | CI設定 |
| NIM_TESTAMENT_BATCH | テストバッチ番号 | CI設定 |
| NIM_COMPILE_TO_CPP | C++バックエンド有効化 | CI設定 |
| SYSTEM_ACCESSTOKEN | Azure Pipelinesアクセストークン | CI設定（シークレット） |
| GITHUB_TOKEN | GitHub APIアクセストークン | CI設定（自動） |

## 依存関係

### ブートストラップ依存

- **csources_v3**: Nimコンパイラのブートストラップ用Cソースコード
  - リポジトリ: `https://github.com/nim-lang/csources_v3.git`
  - ブランチ: `master`
  - コミットハッシュ: `eeab3ac46e93f10efda8e58c4db02b9438319d71`

### OS別依存パッケージ

#### Linux (Ubuntu)
- gcc-14, g++-14
- libpcre3, liblapack-dev
- libcurl4-openssl-dev, libgc-dev
- libsdl1.2-dev, libsfml-dev
- valgrind, libc6-dbg
- xorg-dev, libblas-dev

#### macOS
- boehmgc, make, sfml, gtk+3（brew経由）

#### Windows
- MinGW64（nim-lang.org配布）
- DLLs（nim-lang.org配布）
- OpenSSL（choco経由、一部ワークフロー）

## 備考

- 本プロジェクトはコンパイラ開発プロジェクトであり、Webアプリケーション等のサーバーインフラは存在しない
- インフラストラクチャは主にCI/CDパイプラインで構成され、すべてクラウドサービス（SaaS）上で動作する
- ローカル開発環境はユーザー個別に構築（ドキュメント参照: readme.md）
- サポート対象プラットフォーム: Windows (x86/x86_64), Linux (x86/x86_64/ppc64/armv6l), macOS (x86/x86_64/ppc64/ARM64)
