オファー

Mac mini GitHub Actions セルフホスト Runner 本番ガイド(launchd + CI分離|2026)

CI Mac mini · セルフホスト Runner
2026-06-06 約15分

Mac mini GitHub Actions セルフホスト Runner クラスタのハブ:定義・三層アーキテクチャ・インストール・セキュリティ・検収。Macレンタルで日次検証→月額Runnerへ。

Mac mini 上の GitHub Actions セルフホスト Runner とは?

Mac mini GitHub Actions セルフホスト Runner は Apple Silicon 上でビルドを実行する自前 CI 環境です。GitHub ホステッド macOS Runner の代わりに、キャッシュ永続化・高速 iOS ビルド・Xcode 完全制御が可能——Macレンタルやクラウド Mac mini に最適です。

Mac mini で GitHub Actions Runner を構築するには?

  1. macOS に専用 ci ユーザーを作成
  2. GitHub Actions Runner パッケージをインストール
  3. 登録トークンで Runner を設定
  4. launchd サービスで起動時自動起動
  5. ラベルで workflow ルーティング
  6. 空 Job で検証

検索意図(5 類型)

  1. とは — Mac mini セルフホスト Runner の定義
  2. なぜ — iOS CI に Mac mini が必要(GitHub ホステッド比較)
  3. 手順 — 本番インストール(4 ステップ + launchd)
  4. セキュリティ — ci ユーザー分離 + fork PR 対策
  5. 性能 — キャッシュ最適化で 30%–60% 短縮
Mac mini GitHub Actions セルフホスト Runner:launchd 常駐と CI ユーザー分離
本稿は Mac mini GitHub Actions Runner クラスタのハブ記事で、Flutter iOS CI 三平面アーキテクチャ と連携します。

GitHub Actions セルフホスト Runner とは(Mac mini 版)

Mac mini GitHub Actions セルフホスト Runner は、ローカルまたはクラウド Mac mini で workflow Job を実行する自前 CI 環境です。

Mac mini で Runner を動かす 5 つの利点:

  • ✔ ビルドキャッシュ永続(DerivedData / CocoaPods / SPM)
  • ✔ Xcode 版固定(Golden Image)
  • ✔ CI コスト固定(分課金なし)
  • ✔ iOS ビルド大幅短縮(ホット 5–6 分帯)
  • ✔ 企業級分離(専用 ci ユーザー + Keychain 分離)

iOS CI に Mac mini セルフホスト Runner が必須な理由

GitHub ホステッド Runner の 3 つのボトルネック

課題 GitHub ホステッド macOS Mac mini セルフホスト
ビルドキャッシュ毎回リセット(ステートレス)永続(Pods / DerivedData on SSD)
Xcode 版GitHub 更新に追従完全固定(Golden Image)
CI コスト分課金固定(月額 Macレンタル / 自前)
ビルド速度コールド 8–12 分ホット 5–6 分

結論

GitHub ホステッド = ステートレス
Mac mini Runner = 記憶ある CI

iOS CI 性能差の本質です。関連:Flutter iOS CI 最適化:28 分→9 分.

Mac mini CI Runner 本番三層アーキテクチャ

全体モデル

┌──────────────────────────────┐
│ Layer 1: launchd daemon      │  ← reliability (auto-restart / crash recovery)
├──────────────────────────────┤
│ Layer 2: ci user isolation   │  ← security (Keychain / permission boundary)
├──────────────────────────────┤
│ Layer 3: label routing       │  ← maintainability (workflow → Runner)
└──────────────────────────────┘

第 1 層 — launchd 常駐(安定性の核)

launchd = macOS の systemd。自動再起動・再起動後復帰・クラッシュ復帰・デーモン級実行。

必須 plist 3 項目:

  • RunAtLoad = true — ログイン後自動起動
  • KeepAlive = true — クラッシュ後自動再起動
  • WorkingDirectory必須(オフライン最多原因)

LaunchAgents を使用(LaunchDaemons 不可)— iOS CI はコード署名にユーザー Keychain が必要。macOS 自動ログインで ci セッション復帰。

方式 再起動復帰 クラッシュ復帰 本番信頼性
nohup / screen不適
launchd本番級

第 2 層 — CI ユーザー分離(セキュリティの核)

管理者アカウントはなぜダメ?

  • sudo 可能 → 攻撃面無限
  • Keychain 読取 → 証明書漏洩
  • fork PR 悪意スクリプト → 全機侵害

推奨:専用 ci ユーザー

  • ❌ sudo なし・管理者グループ外
  • ✅ 独立 Keychain(/Users/ci/Library/Keychains/
  • _developer グループ(xcodebuild / simctl)
sudo dscl . -create /Users/ci UserShell /bin/zsh
sudo dscl . -create /Users/ci RealName "CI Runner"
sudo dscl . -create /Users/ci UniqueID 505
sudo dscl . -create /Users/ci PrimaryGroupID 20
sudo dscl . -create /Users/ci NFSHomeDirectory /Users/ci
sudo createhomedir -c -u ci
sudo passwd ci
sudo dscl . -append /Groups/_developer GroupMembership ci

第 3 層 — Runner ラベルルーティング

ラベル体系 = CI スケジューラ。三層構造推奨:

runs-on: [self-hosted, macOS, ARM64, flutter-ios, xcode-16, m4]
           ┌──────────────┐  ┌───────────────────┐  ┌──────────────┐
           │ Platform     │  │ Workload          │  │ Hardware     │
           │ self-hosted  │  │ flutter-ios       │  │ m4, 16gb     │
           │ macOS, ARM64 │  │ xcode-16          │  │ region:tokyo │
           └──────────────┘  └───────────────────┘  └──────────────┘

ラベルはAND 一致;workflow は完全一致;同一ラベル複数機 = 自動負荷分散。

Mac mini Runner 本番インストール手順

ステップ 1 — Runner インストール

# Run as ci user
mkdir -p ~/actions-runner && cd ~/actions-runner
curl -fsSL -O https://github.com/actions/runner/releases/download/v2.316.1/actions-runner-osx-arm64-2.316.1.tar.gz
tar xzf actions-runner-osx-arm64-2.316.1.tar.gz

ステップ 2 — 登録

./config.sh \
  --url https://github.com/your-org/your-repo \
  --token YOUR_REGISTRATION_TOKEN \
  --name "$(hostname -s)" \
  --labels "self-hosted,macOS,ARM64,flutter-ios,xcode-16,m4,16gb" \
  --work _work \
  --replace \
  --unattended

ステップ 3 — launchd 設定(重要)

~/Library/LaunchAgents/com.kvmboot.github-runner.plist に保存:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0"><dict>
  <key>Label</key><string>com.kvmboot.github-runner</string>
  <key>ProgramArguments</key>
  <array><string>/Users/ci/actions-runner/run.sh</string></array>
  <key>WorkingDirectory</key><string>/Users/ci/actions-runner</string>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key>
    <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
  </dict>
  <key>StandardOutPath</key><string>/Users/ci/Library/Logs/github-runner.log</string>
  <key>StandardErrorPath</key><string>/Users/ci/Library/Logs/github-runner.err</string>
</dict></plist>
WorkingDirectory は省略不可
launchd の既定 cwd は /WorkingDirectory なしでは .credentials が見つからず静かに終了——GitHub はオフライン、launchctl list は loaded。

ステップ 4 — 起動

launchctl load ~/Library/LaunchAgents/com.kvmboot.github-runner.plist
launchctl list | grep github-runner
tail -f ~/Library/Logs/github-runner.log   # expect: Listening for Jobs

ネットワーク・プロキシ(出口許可)

Runner は *.github.comapi.github.com*.actions.githubusercontent.comobjects.githubusercontent.com へ到達必須。プロキシは plist EnvironmentVariables に注入。IP 一覧:api.github.com/meta.

本番セキュリティ強化

最大リスクは公開リポの fork PR。三道の防衛:

1. リポジトリ級 Runner(組織級禁止)

リポジトリ級で登録し組織横断権限拡散を防ぐ——1 リポ侵害で全 Keychain / Secrets 露出。

2. Fork PR 保護

GitHub リポ → Settings → Actions → General で有効化:

外部協力者の fork PR ワークフローに承認を要求

fork PR がセルフホスト Runner で自動実行されないこと。詳細:クラウド Mac CI セキュリティ分離(fork PR 攻撃面).

3. Secrets 分離

  • .p12 / .env を ci ホームに置かない
  • ❌ workflow に API Key 直書きしない
  • ✅ GitHub Secrets + 実行時注入;証明書は Fastlane match + Keychain
concurrency:
  group: flutter-ios-${{ github.ref }}
  cancel-in-progress: true

CI 性能最適化(iOS / Flutter)

Mac mini セルフホスト Runner はローカルキャッシュ永続で iOS CI 最適化 を増幅:

キャッシュ三層

  • CocoaPods(~/.cocoapods + ios/Pods
  • DerivedData(固定 -derivedDataPath
  • SPM / Flutter pub
最適化 典型短縮 備考
Pods キャッシュ約 40% 短縮コールド 28 分→19 分帯
DerivedData約 30% 短縮ホット 12 分→6 分帯
Xcode 固定安定性向上破壊的変更の排除

完全戦略:iOS CI キャッシュ設計(DerivedData / CocoaPods / SPM).

ワンクリック Runner 再構築(DR)

macOS メジャーアップグレード・Golden Image ドリフト・セキュリティ事象後、rebuild_runner.sh で約 5 分再構築:

#!/usr/bin/env zsh
set -euo pipefail
CI_USER="ci"
PLIST_DEST="/Users/$CI_USER/Library/LaunchAgents/com.kvmboot.github-runner.plist"

sudo -u "$CI_USER" launchctl unload "$PLIST_DEST" 2>/dev/null || true
sudo -u "$CI_USER" bash -c "cd /Users/$CI_USER/actions-runner && ./config.sh remove --token \$(gh api -X POST /repos/your-org/your-repo/actions/runners/remove-token --jq '.token') 2>/dev/null || true"
sudo -u "$CI_USER" zsh /Users/$CI_USER/scripts/setup_runner.sh
sudo -u "$CI_USER" launchctl load "$PLIST_DEST"
echo "[OK] Runner rebuilt."

本番就绪検証(チェックリスト)

検収前に基盤環境を確認(クラウド Mac オンボーディングチェックリスト).

レベル 1 — Runner オンライン

  • ✅ GitHub UI が Idle
  • launchctl list | grep github-runner で健全 PID
  • ✅ ログに Listening for Jobs

レベル 2 — 空 Job

runs-on: [self-hosted, macOS, flutter-ios]
  • ✅ 30 秒以内に割当(長時間キューなし)
  • ✅ Runner 名と OS 版を出力

レベル 3 — ツールチェーン

xcodebuild -version    # matches Golden Image
flutter --version
pod --version
症状 原因 対処
Runner オフラインWorkingDirectory 未設定.err 確認、plist 追記
Job キューラベル不一致runs-on と登録ラベル比較
クラッシュループPATH 欠落plist EnvironmentVariables 追加

本番ポジショニング(E-E-A-T)

本設計は本番 CI向け:iOS は Golden Image 固定、fork PR は分離必須、再起動・クラッシュに耐える信頼性。

三層モデル:macOS(launchd)・実行分離(ci サンドボックス)・ルーティング(GitHub Actions ラベル)。

kvmboot クラウド Mac で検証済みの Mac mini CI 本番実装——月額 Runner ノード・日払いリリース機に。Macレンタルで日次検証→月額へ。

FAQ(ロングテール)

Mac mini で GitHub Actions Runner は動く?

はい。iOS CI の定番本番構成の一つ。launchd で GitHub Actions セルフホスト Runner(macOS) を長期安定運用可能。

セルフホストは GitHub ホステッドよりどれくらい速い?

iOS CI で通常 30%–60% 短縮。CocoaPods / DerivedData 永続化が主因——ホステッドは毎 Job 新規環境。

launchd と brew services の違い?

launchd は macOS システムデーモン(systemd 相当);brew services はラッパーで非 Homebrew Runner 管理に不向き。本番は plist 直書き。

Runner オフラインの排查?

優先順位:

  1. launchctl list | grep github-runner
  2. plist の WorkingDirectory
  3. runs-on ラベル完全一致

1 台の Mac mini で何 Runner?

16GB → 1 推奨24GB → 1–2(軽量)。xcodebuild はメモリ逼迫——複数は concurrency 必須。

クラウド Mac mini で本 Runner 構成を展開

Mac mini GitHub Actions セルフホスト Runner の最適ホストは Apple Silicon M4:ARM64 ネイティブ Xcode、ユニファイドメモリ、待機約 4W。SIP・Gatekeeper・独立 Keychain が Runner セキュリティ分離 を強化——fork PR の爆発半径は ci ホーム内に限定。

Flutter iOS CI 移行を検討?kvmboot クラウド Mac mini M4 は日払い検証→月額 Runner ノード——プランを見る.

限定オファー プラン一覧