コミット時に入力情報を残す
ブランチ、commit、scheme、Xcodeのバージョン、ビルドパラメーターを記録します。同じcommitから作業を続けられるため、「さっき実行したのはどのバージョン?」とチャット履歴をたどる必要がありません。
引き継ぎ項目:コミットハッシュ+タスクID
アジア太平洋のメンバーがコードをコミットし、北米のメンバーが成果物を作成。ビルド環境はデータセンターに置いたまま、個人のPCと一緒に稼働時間を終えることはありません。
1台を1契約者だけで利用する専有環境です。仮想マシンではありません。Apple M4搭載の2プラン、5拠点から選べ、365日稼働します。
1日$19.2から。電源、ネットワーク、冷却はデータセンターが管理。プロジェクトのパイプライン、ビルドキュー、リリース権限はチームで設定できます。
Xcodeビルドマシンをオフィスからデータセンターへ。pushのたびにタスクを開始できるため、誰かがPCをつけたまま電源につないでおく必要はありません。
マシンにセルフホスト型macOS runnerを登録し、リポジトリの運用ルールに沿ってブランチ、テスト対象、成果物のパスを設定します。まず手動でコマンドラインビルドが成功することを確認してから自動実行を設定すれば、環境とCI設定の問題を切り分けやすくなります。
単一アプリの順次ビルドならPush M4 Sから始められます。M4 / 16GB / 256GB SSD。依存関係とDerivedDataのキャッシュを保持して後続タスクで再利用し、複数のタスクが同じビルド出力へ同時に書き込まないようにしてください。
365日稼働により、データセンターでの管理やオフィスの停電に左右されない運用が可能です。ただし、失敗したタスクが自動復旧するわけではありません。runnerの自動起動、再試行、ディスクのクリーンアップ、ログ通知はチームのパイプラインで設定してください。
以下ではプロジェクトディレクトリ内のApp.xcworkspaceとApp schemeを例にしています。実行前に実際の名称へ置き換えてください。
xcodebuild -version
xcodebuild \
-workspace App.xcworkspace \
-scheme App \
-configuration Release \
-destination 'generic/platform=iOS' \
-derivedDataPath build/DerivedData \
-archivePath build/App.xcarchive \
archive
署名設定は事前に準備してください。このコマンドで生成されるのはarchiveであり、エクスポートやアップロードまで完了するわけではありません。
アジア太平洋の日中にコミットし、米国東部のノードで北米の日中の成果物作成やリリースを引き継げます。主な操作者に合わせてノードを選び、ビルドタスクはキューで引き継ぎます。
ブランチ、commit、scheme、Xcodeのバージョン、ビルドパラメーターを記録します。同じcommitから作業を続けられるため、「さっき実行したのはどのバージョン?」とチャット履歴をたどる必要がありません。
引き継ぎ項目:コミットハッシュ+タスクID
専有環境でも同時実行は無制限ではありません。同じMac上のタスクにはキューや排他ロックを設定し、署名とエクスポートは順番に実行します。プロジェクトごとに作業ディレクトリとキャッシュキーを分けてください。
引き継ぎ項目:キューの状態+ログのパス
北米の担当者はテスト結果、archive、エクスポートログを確認してからリリースを承認します。タスクが失敗した場合は実行状況とエラーログを保存し、すぐにキャッシュを消して再実行しないでください。
引き継ぎ項目:成果物の場所+承認結果
ノードはシンガポール、東京、ソウル、香港、米国東部から選べます。VNC操作では操作者の所在地を優先し、自動ビルドではリポジトリや依存関係の取得先へのネットワーク経路も考慮してください。タイムゾーンはシフト計画の目安であり、接続遅延を保証するものではありません。大陸をまたいで頻繁に操作する場合は、各地域のチームに合わせてマシンを用意し、runnerのラベルを統一すると便利です。
App Store向けのarchive、署名、アップロードを固定のビルド環境で実行します。環境の移行を減らし、署名資産を各メンバーのPCへコピーせずに済みます。
リリースブランチでXcodeのパスを指定し、SDKと依存関係のロックファイルを記録します。操作用デスクトップで前回選んだバージョンに頼らず、ビルドログに実際に使用したツールチェーンを出力してください。
証明書とプロビジョニングプロファイルをリリース用マシンにまとめ、最小限の権限でキーチェーンを設定します。パスワードはCIの保護された変数から渡し、リポジトリ、コマンド出力、公開ログには記載しないでください。
まずxcarchiveを保存し、チームでレビュー済みのExportOptions設定を使ってエクスポートします。アップロードは認証と承認を別途設定し、コンパイル、署名、アップロードの失敗を切り分けやすくします。
バージョン、コミットハッシュ、ビルドログ、成果物を関連付けます。署名資産の使用場所を必要最小限にし、チーム管理の安全な場所に暗号化バックアップを保管して、単一障害点を避けてください。
FlutterやReact NativeのiOSビルドにもmacOSのツールチェーンが必要です。ネイティブ依存関係、Pods、Xcodeのキャッシュをマシンに保持すれば、都度環境を構築する手間を減らせます。
M4 / 16GB / 256GB SSD
単一アプリの日常的なCI、単一のリリースキュー、クロスプラットフォームプロジェクトの安定した成果物生成の検証に適しています。ビルド、シミュレーター、その他のプロセスでマシンのメモリを共有するため、まずは順次実行し、ピーク時の使用量を確認してからタスクを増やしてください。
依存関係のロックファイルを保持し、ブランチごとにキャッシュキーを設定します。過去の成果物はチームの成果物ストレージへ移し、ローカルディスクをアーカイブで圧迫しないようにしてください。
M4 / 24GB / 512GB SSD
複数ターゲットのarchive、Flutter / React Nativeの混在ビルド、より多くの依存関係やツールチェーンを保持するプロジェクトに適しています。24GBのメモリは並列タスクに余裕をもたらしますが、同時実行数は実際のプロジェクトで検証してください。
ビルド時間、メモリ負荷、ディスク使用量をそれぞれ記録してください。ボトルネックが地域間のダウンロードや署名のロック待ちなら、メモリを増やしても直接解決しません。まずキャッシュとキューを見直しましょう。
複数バージョンのXcode、依存関係のキャッシュ、archiveが増え続ける場合は、+1TB SSDまたは+2TB SSDの追加を検討できます。ストレージ拡張で増えるのは容量であり、ユニファイドメモリではありません。使用量の内訳を確認してから決めてください。
同じクラウドMacでローカルモデルの推論、スクリプトの検証、小規模なテストも実行できます。モデルがユニファイドメモリに収まることを確認し、リリースタスクと時間を分けて実行してください。
ユニファイドメモリはmacOS、推論フレームワーク、コンテキストキャッシュ、その他のプロセスでも使用します。モデルファイルのサイズは実行時のメモリ使用量と同じではありません。短い入力で試してから、コンテキストやバッチサイズを段階的に増やしてください。
記録項目:モデルのバージョン、量子化方式、ピークメモリ
フレームワークのバージョン、入力サンプル、生成パラメーターを固定してから、実行時間と出力を比較します。16GBと24GBのどちらを選ぶかは、対象タスクを安定して実行できるかで判断してください。モデル規模や速度を一律に決めつけることはできません。
記録項目:入力の長さ、実行パラメーター、実行時間
推論とXcodeのビルドは計算資源とメモリを取り合います。リリース時は実験キューを停止し、実験スクリプトには専用のディレクトリと権限を設定して、リリース用キーチェーンにはアクセスさせないでください。長時間のタスクは適宜結果を保存します。
記録項目:タスクの優先度、停止条件、結果の保存先
macOSとApple Silicon環境が必要な検証に適しており、小規模な実験は大規模な学習とは異なります。まず1日単位でレンタルして実際のワークロードを試し、その後に継続利用を検討できます。
以下はタスクの進め方を示す2つの役割別シナリオです。実在の顧客評価や接続性能の実測結果を示すものではありません。
「Fastlaneは固定のマシンに置いています。担当者が誰でも、同じビルド記録を確認できます。誰かがPCを開くのを待つ必要はありません。」
「まずテスト担当者のネットワークからリモートデスクトップ接続を確認して、ノードを決めます。自動テストはキューで実行し、人の確認が必要なときだけデスクトップを操作します。」
単一アプリの順次ビルドは16GBから。複数ターゲットや混在ビルドには24GBを検討してください。主な作業拠点のノードを選び、まず最初のパイプラインを動かしてみましょう。
専有の物理Mac miniを1日$19.2からレンタル。実際の利用可否はコンソールに表示される最新状況をご確認ください。