You already run Jenkins on Linux、しかし、iOS / macOS ビルドは、ハードウェアの購入、ホストされたランナーのキューイング、またはラップトップのベビーシッターの間で行き詰まっています。考えるチームのためにVPS operations、このガイドでは 4 番目のパスを開きます。コントローラーを Linux 上に維持し、接続します。専用のリモート Mac as SSH agents。 7 つのレビュー地雷と比較表を取得します。GitHub Actions セルフホスト ランナー, a 6 ステップのオンボーディング ランブック(認証情報、ラベル、同時実行性、xcodebuild、アーティファクト)、および当社への相互リンクrunner, SSH checklist, and Fastlane + CI articles.
多くの企業は Mac に不足しているわけではありません。監査可能、スケーラブル、ロールバックしやすい契約: コントローラーを使い慣れた Linux 上に維持し、macOS ビルドのファンアウトを専用のクラウド Mac に移動します。以下の 7 つの項目は、「私たちは Jenkins を信じています」を署名できるリスク表に変えます。
リモート Mac を「xcodebuild を実行する Linux」のように扱います。 ignoring TCC、キーチェーン、および時折の GUI 依存関係により、初回実行の署名とプロビジョニングが爆発的に増加します。
CI に個人の macOS アカウントを再利用する:スリープ ポリシー、更新プロンプト、およびデスクトップ セッションにより、真の無人フローが破壊されます。専用の CI ユーザーを作成し、reproducible builds.
CPU コアのみによる同時実行のサイジング:Xcode のメモリ スパイクと NVMe 書き込み増幅は通常、CPU よりも前に影響を及ぼします。バケツなしDerivedData、2 つのジョブが互いにデッドロックする可能性があります。
コントローラーからエージェントへの SSH パスの違いを無視します。要塞、キーローテーション、およびStrictHostKeyCheckingポリシーは IaC 内に存在する必要があります。そうしないと、ローテーション日にすべて赤のキューが取得されます。
プラグインのスプロールをデザインの代わりに使用します。重い Groovy とエージェント上のアドホック シェルにより MTTR が長くなります。最小限のプラグイン セットと明示的なツールチェーン バージョンを定義します。
エージェント上にのみアーティファクトを残します。オブジェクト ストレージまたはアーティファクト リポジトリへのアーカイブがなければ、ディスクとコンプライアンスの両方が影響を受け、保持期間がパイプライン ポリシーに関連付けられます。
「最初の人間窓口」計画はありません:最初の署名マテリアルのインストールでは、ヘッドレスに戻る前に 1 回限りの VNC またはデスクトップの確認が必要な場合があります。SSH と VNC のチェックリスト.
一般的な根本原因は、「リモート Mac」をコンピュータではなく生のコンピューティングとして扱うことです。ステートフル Apple ツールチェーン ホスト。プラットフォーム チームは、データベースのレプリカと同じように、イメージのフィンガープリント、ツールチェーンのバージョン、キーチェーンの境界、クリーンアップ ウォーターマークを管理する必要があります。とペアリングするエンタープライズ ビルド プール: 複数のアプリがホストを共有する場合、Jenkins ラベルは「任意の Mac」より細かくなければなりません。そうしないと、キュー セマンティクスで分離を表現できません。
GitHub Actions に対して、実際の差は「コンパイルできるかどうか」ではなく、イベントソースと資格情報の境界: Jenkins は、クロスリポジトリ オーケストレーションと cron スタイルのジョブで優れています。アクションは PR ネイティブのワークフローで威力を発揮します。すでにジョブ DSL と承認を標準化している場合、SSH 経由で macOS を追加することは、多くの場合、2 番目の CI 宗教を開始するよりも混乱が少なくなります。ただし、エンドツーエンドで PR 主導型の場合、自己ホスト型ランナーの必要な接着剤は少なくなる可能性があります。読んでくださいrunner guideノードを登録する前にセクションをキャッシュします。ほとんどのディレクトリ契約は直接翻訳されます。
次の表は比較をロックしているため、四半期ごとにロゴを再訴訟することなくコントロール プレーンを選択できます。
特効薬はありません。選択するのはあなたです。オーケストレーションメンタルモデル and a credential boundary、ロゴではありません。キューの遅延、説明可能な障害、キーのローテーション コストという 3 つの SLA をレビューに書き込みます。
| Dimension | Jenkins + SSH エージェント (macOS) | GitHub Actions セルフホスト ランナー |
|---|---|---|
| Event model | 汎用 Webhook、cron、パラメータ化されたビルド。 Git ホスト間でプラグイン可能 | GitHub イベント (PR、プッシュ、リリース) と密接に結合されています。他の場所への移行コストが高くなる |
| Credentials | コントローラーは SSH キーと役割を一元的に保持し、コントローラー プレーンを強化します | ランナー トークンと組織/リポジトリ スコープは比較的標準化されています |
| 並列処理とキュー | ラベル + ノード容量 + スロットル プラグイン - 柔軟だが構成が重い | 行列と同時実行性は YAML に組み込まれており、学習曲線がより緩やかになります |
| Observability | ビルドログの集約は成熟しています。メトリクス/アラートはDIYです | プラットフォームの UI と API は統合されています。深いカスタマイズにはサードパーティが必要になることがよくあります |
| Best fit | 複数の製品ライン、オンプレミスのアーティファクト ストア、混合 Git ホスト、厳しい承認 | PR 主導の配信を行う GitHub 中心のエンジニアリング組織 |
Jenkins の用語で「VPS のような」Mac をレンタルするということは、登録可能なノードプロファイル: SSH、予測可能なディスク層、およびツールチェーンのバージョンをノードのメタデータにスタンプする機能が修正されました。
Jenkins があなたのレビューを獲得したら、ご褒美をあげましょうnode propertiesファーストクラスとして: Xcode パス、Swift バージョン、CocoaPods が関係する場合の Ruby/Bundler、および GUI ジョブが許可されるかどうか - すべてがヘルス ジョブ出力でアサートされる必要があります。とペアリングするスナップショットと長期間存続するノードの比較: 存続期間の長いエージェントは増分クリーンアップに頼っています。スナップショットのベースラインは、再加熱された画像とロールバック スモーク テストに基づいています。
ランナーと Jenkins の両方を同じフリートで操作する必要がある場合は、統合してくださいDerivedData バケット化契約: 「スケジュールをずらして衝突を避けることを願う」のではなく、Unix ユーザーまたはルートを分離する。
順序は重要です。最初に ID とディレクトリ、2 番目にツールチェーン プローブ、最後に同時実行性です。と揃えるreproducible buildsしたがって、Jenkins は、署名が不安定なままであるにもかかわらず「SSH が機能する」ことを証明するだけではありません。
専用ユーザーを作成し、root として作業します。 e.g. /Users/ci/jenkins; forbid sharing ~/Desktop人間とともに。コントローラーはキーベースの認証のみを使用します。
Jenkins ノードを作成します。 launch via SSH、macOS 側のホスト、認証情報、リモート ルート、および JVM パスを設定します。
Label for intent: at least ios, xcode-16, heavy-pod- 依存性の高いインストールをコンパイルのみのジョブから分離します。
最初にヘルス ジョブを実行します。 print xcode-select -p, swift --version、ディスク、メモリのスナップショット。受け入れの証拠としてログを保存します。
パイプラインで明示的な DerivedData を渡します。 match SwiftPM/ポッドのガバナンス— リポジトリごとのバケット、デフォルトを回避~/Library/Developer/Xcode/DerivedData sharing.
タイムアウト、アーカイブ、クリーンアップを定義します。ログのアップロード、失敗時の保持、ディスクがウォーターマークを超えた場合の停止スケジュール ルール。
pipeline {
agent { label 'ios && xcode-16' }
options { timestamps(); timeout(time: 45, unit: 'MINUTES') }
environment { DERIVED_DATA = "${WORKSPACE}/DerivedData" }
stages {
stage('Probe') { steps { sh 'xcode-select -p; xcodebuild -version; df -h' } }
stage('Build') {
steps {
sh 'xcodebuild -scheme "App" -configuration Release -destination "generic/platform=iOS" -derivedDataPath "$DERIVED_DATA" build'
}
}
}
post { always { archiveArtifacts artifacts: '**/build.log', allowEmptyArchive: true } }
}
Tip:パイプラインが店舗にも出荷される場合は、お読みくださいFastlane + CIそして、ビルド ユーザー、キーチェーン パーティション、App Store Connect API キーを Jenkins 認証情報ドメインと調整します。
コントローラーのアップグレードの日に、アップグレードの前後で同じコミットをカナリア化し、フィンガープリント出力とビルド時の分布を比較します。に対してrunner caching: Jenkins ワークスペース ワイプが攻撃的すぎるため、強制的にいっぱいになりますpod install走るたびに。保守的すぎるワイプはディスクを埋める - プラットフォームと製品で保持層を定義します。
ベンダーが非標準の SSH ポートと非 root ユーザーを提供する場合は、接続メタデータを資格情報の説明に保存し、ジョブ全体に分散しないようにします。とペアリングしますSSH checklist for known_hostsホストキーチェックをグローバルに無効にする代わりにポリシーを適用します。
古典的な間違いは、同時実行のサイジングを「何回まで」という基準で行うことです。xcodebuildプロセスは適合します。」実際には、pod install/ SPM はさまざまなフェーズでピークを解決およびコンパイルします。スロットルとラベルを使用してモデル化します。mutex resources. Pair with SwiftPM/ポッドのガバナンス重い解決ジョブを高速のグリーン ビルドから分離します。
シミュレーターを多用した UI テストでは、同時実行のストーリーとコンパイルのみのジョブが変わります。フォローするXCTest / Simulatorシャーディング ガイダンスを利用し、それらのジョブを独自のラベルまたは子ノード プールで分離します。
Warning:ディスクが安全基準を下回っている場合は、スケジュールを継続しないでください。スケジュールを一時停止して、最初にクリーンアップしてください。そうしないと、Xcode と git が状態を半分書き込む可能性があり、短いキューよりもコストが高くなります。
マルチリージョンのフリートはエンコードする必要がありますregionノード名とラベルに含め、アーティファクト出力パスにタグを付けて、偶発的なクロスリージョン一括コピーがビルドの失敗と間違われるのを防ぎます。とrent vs buy TCO、レイテンシーと下り帯域幅をコストモデルに早期に組み込みます。
並列処理とリポジトリのサイズに合わせてしきい値を調整します。これらのアンカーは、セキュリティ チームとプラットフォーム チームを連携させます。 EU を多用する組織の場合は、ログを記録しますどのマシンがどの署名 ID にアクセスしたかDSGVO 監査の質問をサポートするため、リモート ノードは匿名のペットであってはなりません。
xcodebuild -version, swift --version、CocoaPods が使用されている場合の Ruby/Bundler、およびディスク モデル。変更後にカナリア ジョブを再実行します。オフィスのラップトップやワンオフの Mac mini では、スリープ、ネットワークのジッター、ツールチェーンのドリフトが発生します。純粋な Linux は Apple の公式 iOS スタックを実行できません。 macOS ビルドを Linux に移行しながら Jenkins を Linux 上に維持する専用、常時接続、SSH 接続可能ノードは「どこかに Mac が必要だ」ということを運用契約に変えます。アドホック ハードウェアや不安定な仮想化ホストと比較して、NodeMiniのMac Miniクラウドレンタル固定 SSH、クリア ディスク層、反復可能なプロファイルのペアであり、プラットフォーム グレードの CI に適しています。レベルを比較するrental rates and onboard via the help center.
この Runbook を内部の「ツールチェーン変更レベル」にバインドします。Xcode パッチ、マイナー アップグレード、メジャー アップグレードでは、異なる承認、カナリア スコープ、キャッシュ無効化ルールが必要です。
自動的ではありません。 Jenkins はプラグイン可能なパイプラインとオンプレミスの統合で勝利を収めています。 PR ネイティブ イベントではアクションが優先されます。すでにジョブ DSL を持っている場合は、SSH エージェントの方がスムーズなことがよくあります。 GitHub 中心の場合、ランナーは接着剤をあまり必要としないかもしれません。ハードウェア層を比較するrental rates.
はい - スリープ、GUI プロンプト、権限のドリフトを避けるために、ホームとキーチェーンを個人アカウントから分離します。 SSH チェックリストと再現可能なビルドの記事に合わせてください。オンボーディングの詳細については、help center.
単一ジョブのピーク RAM と NVMe 書き込み増幅をベースラインにし、P95 を監視しながら同時実行性をスケールします。 DerivedData をバケット化し、重いポッドのインストールをスロットルします。こちらもお読みくださいself-hosted runnerJenkins ラベルにマップするキャッシュ パターンに関する記事。