2026:リモート Mac 上のセルフホスト GitHub Actions と GitLab CI ランナー
ラベル、並行度の上限、シークレット分離

約 17 分 · MACCOME

プラットフォーム/モバイルのリードが 2026 年に iOS/macOS ビルドをリモート Mac へ移すとき、典型の出だしは「まずランナーを登録し、方針はあと」です。その結果、ラベルが曖昧になり、ディスクを圧迫する並行度になり、署名コンテキストが絡み合います。本稿はシンガポール、東京、ソウル、香港、米国東海岸、米国西海岸でノードを選ぶチーム向けに、痛みの分解、制御面の比較表2枚、貼り付け可能なワークフロー断片、6ステップの手順書、監視指標3つを示します。マルチプロジェクト容量およびCI 向け SSH と VNCの各記事と相互に参照し、CI レビューと発注判断に使います。

「ランナーを増やす」だけでは、キューと不安定ジョブは直りにくいです

セルフホストランナーは、オーケストレータに実際の macOS 実行面を晒します。GitHub Actions はリポジトリ/組織レベルのランナーを使い、GitLab はエグゼキュータ種別つきのプロジェクト/グループランナーを使います。ラベルが汎用のまま(macios など)だとワークフローが同一ホストを奪い合い、DerivedData と IO のホットスポットが積み上がり、失敗は明確なリソース圧ではなくランダムなタイムアウトに見えます。ホストを足したりいきなり M4 Pro に飛ぶ前に、次の6つの痛み分類へ分解してください。

  1. ラベルに能力次元が無い:Xcode のメジャー/マイナー、署名要件、シミュレータのグラフィック要件が無いとスケジューラは闇雲に配分し、インシデント時に「どのジョブ種が限界を超えたか」を説明できません。
  2. 並行度が文書化されていない:ディスクロックが許す量を超えるジョブ並列は全員を遅くします。既定値に頼らず、ランナーあたりの最大ジョブ数を運用ドキュメントに書きます。
  3. シークレット面とビルド面が同一:対話ログインと CI で macOS ユーザーを共有すると、キーチェーンのプロンプトやプロビジョニングプロファイルが「たまに無人で通る」パイプラインになります。
  4. キャッシュの名前空間が無い:単一の DerivedData ルートに複数リポジトリが書き込むと汚染と危険なクリーンが増えます。攻めた clean が並行プロジェクトを巻き込みます。
  5. 成果物とリージョンの不一致:シンガポールで協業しつつランナーが米西海岸だと、大きな .xcarchive や依存キャッシュの移動がマシン代の節約を帯域と時間で相殺します。
  6. レンタル役割のドリフト:リリース週は短いバーストが要るのに、通年ピーク単価を払うとランナー利用率が低いままキャッシュフローだけが悪化します。

次の表でランナー役割と GitHub/GitLab の差を議論可能にし、そのうえで YAML を写し、実行ステップに落とします。

専用ビルドホストと共有ランナープール:チケットに役割を書く

スコープの切り分けは次のとおりです。マルチプロジェクトの記事はキューとレンタル配分を扱い、本稿はMac を登録し、ワークフローが確実に正しい環境へ当たるようにすることです。表1はアーキテクチャレビューで使います。

観点共有ランナープール専用ビルドホスト
典型ジョブLint、単体テスト、軽い xcodebuild、本番署名なしアーカイブ、TestFlight アップロード、マルチシミュレータ行列、厳格な署名
ラベル細かい粒度:macos-14xcode-16no-signing など、合成可能プロジェクト専用タグ。他リポジトリが runs-on で乗れないようにする
並行度控えめな並列+キューあふれはバーストホストへ並列はディスクのテレメトリに束ね、飽和より安定を優先する
シークレットとアカウント専用 CI ユーザー、キーチェーンまたはプロファイル戦略で分割固定の署名身分、ローテーション責任者、監査証跡
向くとき結合が低く、短いキューが許容できるコンプライアンス、顧客納品、再現性の要るリリースゲート

GitHub Actions と GitLab Runner:制御面の違い

いずれもリモート Mac を動かせますが、シークレット注入、ランナー可視性、キャッシュの習慣は異なります。表2はプラットフォームとエンジニアリングの語彙を揃えます(フィールド名は各ベンダーの現行ドキュメントで確認してください)。

観点GitHub Actions(セルフホスト)GitLab Runner(shell/ssh)
スケジューリングリポ/組織ランナー+ runs-on: [self-hosted, …]tags の一致+登録スコープ(プロジェクト/グループ/インスタンス)
シークレットSecrets/Variables、Environments。短命クラウド資格は OIDCCI/CD 変数、マスク変数。グループ継承と保護ブランチに注意
並行度のつまみ行列ジョブはランナー側のプロセス上限を自前で課すconcurrent とランナー単位設定。分離なしに同一ユーザーへ複数エグゼキュータを載せない
よくある落とし穴セルフホストが対話ログインの環境変数を引きずることがある複数ランナープロセスが Xcode ライセンスやポートを奪い合う
yaml
# GitHub Actions:汎用 macOS ではなく能力ラベルにジョブを束ねる
jobs:
  ios_build:
    runs-on: [self-hosted, macOS, xcode-16, m4-ci]
    concurrency:
      group: ios-${{ github.ref }}
      cancel-in-progress: true
    steps:
      - uses: actions/checkout@v4
      - name: Select Xcode
        run: sudo xcode-select -s /Applications/Xcode_16.app

# GitLab CI:tags がリモート Mac 上のランナーに写る
ios_build:
  tags: [macos, xcode16, m4-ci]
  script:
    - xcodebuild -version
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
info

注:ラベル名は社内 Runbook に Xcode パス、署名の可否、最大並列ジョブ数とともに登録し、古いワークフローのコピペだけに頼らないでください。

6ステップ:リモート Mac から受け入れ済みのセルフホストパイプラインへ

リージョンの事前作業はマルチリージョンガイド、接続の選択はCI 向け SSH と VNCを前提とします。

  1. ランナー能力マトリクスを固定する:Mac ごとに Xcode 版、本番署名方針、最大並列ジョブ、ディスク階層、アラート閾値を列挙します。
  2. CI ユーザーとディレクトリを作る:非対話のサービスアカウントとし、DerivedData/キャッシュのルートをプロジェクトまたはリポジトリの名前空間で分けます。
  3. ランナーとラベルを登録する:GitHub/GitLab 登録後、すべてのタグをマトリクスと突き合わせ、文書のない「仮」ラベルを禁止します。
  4. シークレットとローテーションを設定する:リポジトリ/環境シークレットは最小権限にし、証明書とプロファイルの配布を統制し、ローテーションとロールバックの責任者を記録します。
  5. 2週間のテレメトリを取る:キュー深さ、ジョブ P95、週次ディスク増分、失敗分類です。データが無ければ第2ランナー購入も見送ります。
  6. 受け入れと廃止を書く:バーストホストのランナー登録解除、鍵の失効、キャッシュ掃除は実行手順として残し、ベースライン変更は変更チケットに載せます。

ダッシュボードに載せる3指標

Grafana、Datadog、週次レポートに貼れるフィールド名の例です。

  1. キュー深さとタイムアウト率:タイムアウトが特定ラベル集合に偏るなら、CPU を買う前に並行度を締めるかディスクパスを分割します。
  2. DerivedData/キャッシュルートの週次増分(GB):週あたりの GB をレンタル請求と並べ、1TB/2TB が実ビルド形に合うか判断します。
  3. クロスリージョン成果物の分(時間):主経路は利用者と同居させます。大洋横断の大容量アップロードは典型の隠れコストです。レビュー付録にエンジニア時間を計上します。

専用ホストで2週間安定したら、重い行列用に第2ノードや M4 Pro を検討します。

運用補足:xcodebuild と Swift Package の解決がネットワークとディスクを同時に飽和させると、P95 はコンパイラ吞吐だけでなくインデックスとキャッシュ書き込みから伸びがちです。CPU だけでなくキュー長とディスク await を並べて見ます。ランナーのオンライン時間をレンタル請求と紐づければ、財務が「なぜ専用が要るか」を説明できます。さもなければ共有プール論争が証拠なしに繰り返されます。

アドホックなノート PC とネスト VM が、監査可能な iOS CI と相性悪い理由

ネスト仮想化は Metal、署名、USB ワークフローに摩擦を足します。個人ノートはスリープと更新が無人ジョブを壊します。本番相当の Apple Silicon には、ランナーラベルと並行度を運用ベースラインに落としたうえでのベアメタル専用、選べるリージョン、合成可能なレンタル条件が向きます。

断片化したデスクトップだけでは、長寿命ゲートウェイ、AI エージェント実行層、マルチリポジトリ CI を支えにくく、権限プロンプトと突発 OS 更新が自動化をランダム失敗にします。MACCOME は複数リージョンのMac mini M4/M4 Proベアメタルを柔軟な期間で提供し、セルフホストランナーのベースライン実行層と受け入れ済みバースト容量として使えます。リージョン、SSH/VNC、マルチプロジェクトの各記事のあと、料金ページでパッケージを揃え、成果物パスに合うリージョンを注文します。

主成果物リージョンで短いレンタルを試し、月次から四半期へのベースライン拡張はその後に判断します。極短いピークは日次/週次バーストで吸収し、誤ったティアにキャッシュフローを閉じ込めないでください。

よくある質問

先にランナーですか、ラベルですか?

まずラベルの意味とランナーあたりの並列度を固定し、キューとディスクを観察します。レンタル料金を開き、マルチリージョン選定と合わせてください。

GitHub と GitLab のシークレットで一つに揃える要点は?

長寿命シークレットは git に置かず、署名は別 macOS ユーザーで分離します。接続パターンはCI 向け SSH と VNCを読み、ヘルプセンターも参照してください。

並行プロジェクトではほかに何を読みますか?

マルチプロジェクト容量とレンタル配分でランナー役割をマイルストーンに揃えます。