マルチSaaS体制ではGitLab RunnerとGitHub Actions セルフホストRunnerを同一台の高スペック裸金属Apple Siliconに載せたい場面が増える。先にCPU・RAM・NVMeの予算を二系統で割り、シークレット境界とキャッシュパスを混線させないことが成功条件だ。 関連:マネージドキューと分単位クォータの対照FAQ
1. 並行クォータ:二系統の「同時実行予算」
GitLabはRunnerの同時ジョブ数とexecutor、GitHubはランナー当たりのジョブ同時数とOrganization/RepoのConcurrencyが別物。単一ホストでは合算がRAMとコアを超えないよう、数字で表にする。xcodebuildが重いなら片系統を常時1ジョブに縛るのが安全だ。
2. タグラベルルーティング:混線を防ぐ命名規約
GitLabはtags、GitHubはruns-onラベルで振り分ける。mac-ci-glとmac-ci-ghaのようにプレフィックスを分離し、誤マッチで隣プラットフォームのジョブが乗らないようにする。同一ラベル名を両方で使うのは運用事故の温床だ。
関連:同一ホスト上での隔離再ビルドとCI共存の実例
3. シークレット隔離:キーチェーンと実行ユーザ
別OSユーザまたは別キーチェーンファイルで署名資格を分ける。環境変数注入はログマスクとセット。可能ならOIDCで短命トークンに寄せ、長寿命PATをホストに残さない。監査はRunner IDとジョブIDで相関できる形に固定する。
4. NVMeキャッシュ分区:DerivedDataとRunner作業領域
APFSボリュームまたはサブディレクトリ強制でDerivedData・actions-runner/_work・GitLabのbuilddirを物理的に分離する。共有キャッシュは読み取り専用レイヤーに限定し、書き込みはジョブ単位プレフィックス+TTL掃除で衝突を避ける。
5. 実装FAQ
- 優先度:夜間ヘビーとPR軽量を同一Runner名で混ぜない。
- ポート:両Runnerの通信とローカルヘルスチェックをRunbookに明記。
- 退避:片方メンテ時もう片方だけ残すフェイルオーバー手順を用意。
専有MacとMac miniで境界を保つ
共有ホストでは隣ジョブのNVMe尾が境界を侵す。専有Apple Siliconならクォータ表とキャッシュ分区がそのまま効く。macOSはxcodebuildとGatekeeper/SIP/FileVaultを一続きで説明でき、Apple Siliconの統合メモリは二Runnerの並行に向く。Mac mini M4は待機電力が低く、常時ウォームのコストを抑えやすい。
裸金属上の二系統Runnerは変数が多い。ホームで専有ノードの構成を確認し、今すぐ購入してクォータと隔離を固めるのが合理的だ。