iOS パイプラインが週に十数回 xcodebuild archive を走らせると、エンジニアリングより先に GitHub Actions macOS ホスト runner の分課金が財務を刺します。プラットフォームチームが本当に必要なのは、安定したキーチェーン・Derived Data パス・監査可能な出口 IP を持つ クラウド Mac 構築機 上の セルフホスト macOS runner です。本文はその落地だけを扱います——「xcode on windows」の選定(VM・クラウド Mac・CI の選び方)や TestFlight 専用レーン(カナダ M4 TestFlight レーン)は別記事です。
ホスト型かセルフホスト型かを決める前に、次の 3 点を押さえてください。
-
ホスト型 macOS: 分単位の支払い
まず太いパイプラインが請求額を膨らませます。公開価格は 1 分あたり数セントであることが多く、請求書で確認してください。
≈ 0.08 ドル/分
-
1 つのクラウド Mac、1 つのキューから開始
配布証明書を保管し、
match単一のライター上で、ホスト間でキーチェーンが競合することはありません。 -
24時間365日の夜間バッチ向けに構築
無人 archive と match 同期は、毎週リセットされるホスト pool より再現性が高いです。
1. ホストされている macOS ランナーを終了する時期
ホストされている GitHub アクション macOS ランナーはゼロオペレーションでキュー管理されます。隠れたコスト: ピーク時の請求、アーティファクトの保持、ログ スニペットのみの太平洋横断デバッグ。考慮する セルフホスト型 macOS ランナー に クラウドMacビルドマシン いつ:
- コールド派生データがウォールタイムを支配しており、1 つのリポジトリが macOS 分/月あたり最大 3,000 分を超えています。
- ASC API、Webhook、または企業の許可リストには、安定したホスト名/専用の IPv4 が必要です。
- 配布証明書と
matchは 単一書き込みノード に固定——共有ホスト pool のキーチェーンは不可。 - アジア太平洋地域の昼間のコミットメントと北米の夜間バッチ - カナダと同じ席 公証と自己ホスト型 Runbook のリリース.
2. ホストされた議事録とクラウド Mac 専用シート
| 比較する | GitHub でホストされる 1 分あたりのオペレーション数はゼロ | クラウド Mac セルフホスト型 固定シート・SSHデバッグ |
|---|---|---|
| 請求する | 1分あたり + キューごと | 固定月額シート + ライトオペレーション |
| 環境 | イメージがずれる可能性があります | Xcode、Ruby、Fastlane をピン留めします |
| キーホルダー | 秘密の注入;限定ロック解除 | ログインキーチェーン + launchd ウォームアップ |
| ディスク | 一時的なもの。大規模なアーカイブは制限に達します | 派生データ用に 512GB ~ 2TB |
| デバッグ | 主にログのスニペット | 同じホスト上での SSH と再実行 |
| こんな方に最適 | 軽い iOS アーティファクト、散発的なビルド | 毎週の TestFlight、並行スキーム |
概要: macOS 5,000 分/月、約 $0.08 ≈ $400/月 ホストされています (プライベート リポジトリ乗数の前)。 M4 24GB/512 クラウド Mac シートは、多くの場合、同じ帯域内にありながら、VNC の受け入れと Fastlane アップロードも提供します。これは、M4 の構造的な利点です。 クラウドMacビルドマシン CI のみの SaaS よりも。
3. ラベル、同時実行性、およびシングルライターの境界
同じキーチェーンを扱う 1 つのジョブ内でコンパイル、署名、ASC アップロードを混在させないでください。 2026 年を考慮した安全な分割:
- ラベル:
macos-m4-canada(地域)、signing(試合のみ)、build(24GB+の場合は並列2)。 - 同時実行性: ジョブに署名する
concurrency: signingグローバル1;ビルド ジョブは、派生データ分離を使用してブランチごとに 2 つ実行できます。 - 地域: リント/ユニットの APAC ランナー。カナダ クラウドMacビルドマシン のために
archive+exportArchive.
4.クラウドMacにランナーを登録(最初のホスト)
GitHub → 設定 → アクション → ランナー → 新しいセルフホストランナー → macOS。クラウド Mac に SSH で接続します。熱心な Unix ユーザーを好む runner インタラクティブな VNC 管理者とは別のものです。
mkdir -p ~/actions-runner && cd ~/actions-runner curl -o actions-runner-osx-arm64.tar.gz -L \ https://github.com/actions/runner/releases/download/v2.319.1/actions-runner-osx-arm64-2.319.1.tar.gz tar xzf actions-runner-osx-arm64.tar.gz ./config.sh --url https://github.com/YOUR_ORG/YOUR_REPO \ --token YOUR_TOKEN --labels macos-m4-canada,arm64 --unattended sudo ./svc.sh install && sudo ./svc.sh start ./run.sh --check
スモークワークフロー runs-on: [self-hosted, macos-m4-canada] 走っている sw_vers && xcodebuild -version。 Xcode をピン留めする xcode-select README にバージョンを文書化します。
5. キーチェーン、照合、無人ロック解除
トップのセルフホスト型エラー: コードデザインが ID を見つけられません。クラウド Mac の場合:
- 配布証明書をインポートする ログイン キーホルダー;のACL
codesign/security. - を捧げます
matchとの仕事concurrency: signing;他のジョブはプロビジョニング プロファイルのみを読み取ります。 - 使用
security set-key-partition-listCI ロック解除の場合 - マシンの構築のみを行い、ラップトップにはコピーしないでください。 - 明示的に設定する
KEYCHAIN_PATHワークフローでは、一時的な GHA キーチェーンが一致出力をシャドウしないようにします。
jobs:
archive:
runs-on: [self-hosted, macos-m4-canada, build]
steps:
- uses: actions/checkout@v4
- name: Build archive
run: |
xcodebuild -scheme MyApp -configuration Release \
-archivePath $RUNNER_TEMP/MyApp.xcarchive archive
6. クラウド Mac ランナーのセキュリティ強化
自己ホスト型ランナーは、リポジトリから任意のコードを実行します (構成が間違っている場合はフォークします)。治療する クラウドMacビルドマシン 趣味の VM ではなく、実稼働環境の署名要塞として。
- リポジトリのスコープ: 明示的なリポジトリ許可リストを持つ組織レベルのランナーを優先します。ブランチ保護を信頼しない場合は、フォーク PR ワークフローを無効にしてください。
- ユーザーの分離: サービスを次のように実行します
runner、管理者ではありません。そのユーザーの VNC ログインを拒否します。 - 秘密: 必要なレビュー担当者がいる GitHub 環境に一致パスワードと ASC API キーを保存します。四半期ごとにローテーションします。
- ネットワーク: アウトバウンド GitHub + Apple CDN を許可します。オフィス IP または Tailscale からの SSH を除く受信をブロックします。
- ディスク暗号化: クラウド Mac 上の FileVault は一大事です。スナップショットのエクスポートでは除外する必要があります
*.p12保管庫に保存されているときに暗号化されていない限り。
| リスク | クラウド Mac での軽減策 |
|---|---|
| 悪意のあるフォークの PR ワークフロー | 寄稿者の承認が必要です。パブリックフォークには自己ホストはありません |
| 盗難された登録トークン | 有効期間の短いトークン。メンテナンスウィンドウ後に再登録する |
| 並列ジョブのディスク枯渇 | 同時実行の上限 + ディスク ウォーターマーク (次のセクション) |
| 漏洩した派生データ | 個別の署名ラベル。スクラブ RUNNER_TEMP 仕事の後 |
7. Ops: ディスクのウォーターマーク、Xcode のアップグレード、ランナーのローテーション
| レベル | ディスク使用量 | アクション |
|---|---|---|
| 緑 | < 70% | 14 日より古い派生データをローテーションする |
| 黄色 | 70–85% | パラレル 2 をドロップします。アップロードされたアーカイブを削除する |
| 赤 | > 85% | 新しいアーカイブをブロックします。 VNC を検証してからディスクを拡張する |
Xcode のマイナー アップグレード: ./svc.sh stop、アップグレード、スモークワークフロー、 svc.sh start。アクション ランナー パッケージをメンテナンス期間中に毎月バンプします。ロールバックのために前のディレクトリを保持します。
8. 組織レベルのランナーとリポジトリごとのランナー
プラットフォーム チームは 1 つのリポジトリ登録ではすぐに限界を迎えます。 GitHub Enterprise Cloud と GitHub チームは、グループ ポリシーを使用して組織のランナーをアタッチできます。
- ランナーグループ 環境にマップします (例:
ios-releaseただ見るsigningラベル)。 - 一時的なランナー (ライセンスがある場合) 各ジョブの後にディスクを消去します。信頼できないビルド ジョブには最適ですが、一致キャッシュには適していません。一時的なものを署名ホストから遠ざけてください。
- ポリシーのヒント: リポジトリが設定できるドキュメント
runs-on: [self-hosted]CODEOWNERS で。不正なワークフローが主要な exfil パスです。
2 つの製品ラインが 1 つを共有する場合 クラウドMacビルドマシン、ディスク黄色のアラートが毎週発生するまで、2台目のMacを購入するのではなく、ラベルごとに分割します。ラインに互換性のない Xcode バージョンが必要な場合は、強制的に停止します。デュアルではなく 2 番目のシートを追加します。 xcode-select 1 つのボリュームのハック。
# .github/workflows/canada-archive.yml
on:
repository_dispatch:
types: [archive-ready]
jobs:
archive:
runs-on: [self-hosted, macos-m4-canada, build]
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.client_payload.sha }}
- run: xcodebuild -scheme App archive -archivePath $RUNNER_TEMP/App.xcarchive
APAC Linux ランナーは単体テストを完了し、コミット SHA とアーティファクト URL とともにカナダに派遣されます。このパターンでは、北米の Apple CDN 付近のアーカイブ レイテンシーを維持しながら、lint に対して macOS の分を支払うことを回避します。
9. 可観測性: ジョブが失敗したときに何を記録するか
ホストされたランナーはインフラストラクチャを隠します。自己ホスト型では、シグナルを所有することが強制されます。 Datadog の全額請求なしで実行可能な最小限のオブザーバビリティ:
- 船
~/actions-runner/_diag/Runner_*.logレッドビルド (rsync またはエージェント) のログスタックに追加します。 - 5 分ごとに cron:
df -h /+./run.sh --checkランナーが 10 分以上オフラインの場合、PagerDuty に送信されます。 - ワークフローに注釈を付ける
run-idFastlane 出力で ASC アップロード エラーを関連付けます。 - キューの深さを追跡する: 保留中の macOS ジョブが 3 つを超える場合は、開発者が「GitHub が遅い」と非難する前にプラットフォーム チャネルに警告します。
環太平洋チームは、APAC オフィスからクラウド Mac SSH への RTT を GitHub API レイテンシとは別にログに記録する必要があります。この 2 つを混同すると、間違ったスケールアップの決定 (より多くのランナーとより良いリージョン) につながります。
10. 最初の週のランブックチェックリスト
- プロビジョニング 1 クラウドMacビルドマシン (最小 24GB/512、毎週のリリースが 3 つを超える場合は 1TB)。
- ランナーとラベルを登録します。デフォルトのままにする
runs-onリリース ワークフローが移行されるまでホストされます。 - スモーク → 空のアーカイブ → 署名された内部ビルド (アップロードはオプション)。
- ホストされた時間を追跡します。それでも 1,500/月未満の場合は、セカンダリ リポジトリを延期します。
- このホスト上でのみ、ASC API キーと一致する書き込みアクセスを文書化します。
- ディスクアラート + 保持
~/actions-runner/_diag7日間。
14. よくある質問
セルフホスト型 macOS ランナーは許可されますか?
GitHub では、ファーストクラスのセルフホスト型サポートについて文書化しています。パッチとシークレットはあなた自身のものです。信頼できない共有ホストにはインストールしないでください。
クラウド Mac ごとにランナーは何人ですか?
複数のフォルダーが可能です。 iOS 署名とディスク I/O の場合は、 物理 Mac ごとに 1 つのキュー ジョブの種類にラベルを使用します。
ARM64 ランナーと x86 シミュレーターのマトリックス?
Apple Silicon ネイティブ ビルドがデフォルトです。本当に x86 シミュレーター グリッドが必要な場合にのみ、Intel クラウド Mac またはホストされたランナーを追加してください。
GitLab macOS エージェント?
同じパターン: macOS ホスト + エージェントを修正しました。この記事は GitHub Actions / ワークフロー構文のままです。
プライベートリポジトリと分単位の価格設定?
macOS 分/月が約 3,000 分を超える場合、または固定 IP/キーチェーンが必要な場合は、多くの場合、2 ~ 3 か月以内に専用シートが獲得されます。
ランナーのオフラインアラート?
GitHub ランナー API (Enterprise) または cron を使用する ./run.sh --check 外部稼働時間プローブを使用します。
Hashvps は適合しますか?
専用の IPv4、M4 ベア メタル、およびマルチリージョンのカナダ/APAC ノードが必要な場合は、はい。チェックアウトする前に、遅延ガイドとディスク層を比較してください。
派生データを自己ホスト型ランナーにキャッシュする必要がありますか?
専用クラウド Mac でははい: 次のような安定したパスをマウントします /Users/runner/DerivedDataCache およびキーキャッシュによる $(SWIFT_VERSION)-$(hash Package.resolved)。依存関係のバンプを無効にします。ホストされたランナーはすでにこれを不透明に行っています。自己ホスト型では、ユーザーの責任になりますが、増分ビルドにかかる時間を 30 ~ 50% 節約できます。
並列 iOS + watchOS ターゲットの M4 Pro / 32GB はどうですか?
平行 xcodebuild 署名がシリアル化されたままであれば、24GB の場合は 2 つの中規模アプリで機能します。同じディスク上に 2 番目のランナー フォルダーを追加する前に RAM を追加します。メモリ不足はシミュレーターのフレークや不可解な現象として現れます。 clang OOM、明確なアラートではありません。
12. ホスト型 macOS からの 3 段階の移行 (分)
ビッグバンカットオーバーブレイクにより列車が解放されます。 2 つのスプリントにわたる段階的な移行を使用します。
フェーズ A (1 週目): クラウドMacランナーを登録してください。シャドウ ワークフローを実行する workflow_dispatch のみ;同じコミット上のホストされたジョブとログとタイミングを比較します。署名には触れないでください。
フェーズ B (2 週目): 動く archive への仕事 runs-on: [self-hosted, build];保つ upload_to_testflight キーチェーンが安定するまでホストまたは手動で 5 晩連続で実行します。
フェーズ C (3 週目以降): マッチ + 署名ジョブを次の場所に移動します signing 同時実行性 1 のラベル。デフォルトのブランチでホストされている macOS を無効にします。緊急ホストジョブを 1 つ残しておきます workflow_dispatch 災害復旧のために。
開発者とのコミュニケーション: インタラクティブなシミュレーターは APAC ラップトップまたは VNC クラウド Mac 上にあります。 CI レーンはデスクトップの代替品ではありません。この期待管理により、「CI が遅いため」机上に Mac mini をシャドー IT で置くことを防ぐことができます。
ロールバック トリガー: セルフホスト型のキューの深さが 2 時間で 4 つのジョブを超えるか、無関係なコミットでコードデザインが 2 回失敗した場合、ホスト型を再度有効にします。 archive SSH 接続している間は 48 時間持続します。ワークフローの README に Runbook のリンクを保存しておくと、オンコールで午前 2 時に Slack 履歴が grep されなくなります。
13. 12 か月の TCO ワークシート (財務にコピー)
財務部門は、一致する数字を求めます。この表を開始テンプレートとして使用します。組織の分単位の階層とクラウド Mac の見積もりを接続します。
| 品目 | ホスト型 macOS (~5,000 分/月) | クラウド Mac シート 1 つ |
|---|---|---|
| コンピューティング | ~$400/月の変動 | ~$250–450/月固定 |
| 作戦労働 | ゼロに近い | ~4 時間/月のパッチ |
| 停止リスク | GitHub キューの急増 | ランナーがオフライン = リリースがブロックされている |
| 署名監査 | 固定IPを証明するのが難しい | 専用の IPv4 + VNC 証拠 |
| とんとん | 多くの場合、macOS の時間が 3,000 分を超え、一致が安定している必要がある 2 ~ 4 か月目 | |
隠れた節約の追加: 「ホスト上で動作し、ローカルで障害が発生する」ドリフト後の再構築が減り、SSH が障害発生から 1 コマンド離れている場合のインシデント対応が高速化されます。 xcodebuild ログ。
財務省は、なぜ移行後もホストされた分の料金を支払うのかと尋ねるかもしれません。オープンソースのミラー、フォークからの緊急 PR、または署名ホスト上で使用したくない Xcode ベータ カナリア用に、小規模なホスト プールを保持します。通常は、以前の支出の 5 ~ 10% であり、ゼロではありません。
GitHub アクションを実際のクラウド Mac ビルド マシンに固定する
セルフホスト型 macOS ランナー 環境主権を購入する: M4 統合メモリはアーカイブを短縮します。ネイティブ codesign OpenSSH は、GHA と同じホスト上で Fastlane/match を維持します。 ~4W のアイドル状態とファンレスの静音性が 24 時間 365 日のキューに適しています。 Gatekeeper と FileVault は、API キーと証明書を監査可能な出力にロックします。これは、リリース ゲート用に毎週リセットされるホスト プールよりも優れています。
リリース ワークフローを分単位の課金から移行しますか? Mac クラウド プランを比較する 今週最初のランナーを登録してください。