すでに専用のリモート Mac 上でコンパイルとスクリプト化されたタスクを出荷していますが、CI のクロスプラットフォーム ブラックボックス UI フローのMaestroはシミュレータのライフサイクル、非インタラクティブな SSH セッション、 同時記録ディレクトリと衝突します。この記事は、macOS 上でも同じ「YAML と予測可能なキュー」コントラクトを必要とする、快適な Linux 上でのシャーディング テスト を行う読者を対象としています。 Maestro 固有の差異 を明らかにするための 7 つの箇条書き、XCTest との責任を調整するための 1 つの 比較表 、そして 6 ステップのハンドオフ ランブック と弊社の XCTest 並列テスト、ランナーとキャッシュ、および SSH ファースト CI の記事を参照して、環境のドリフトを製品のリグレッションと誤読しないようにしてください。
Maestro はケースを読みやすいフローとして表現します (手書きの XCTest よりも操作プレイブックに近い) が、 一度ヘッドレス リモート セッションに入ると、依然として CoreSimulator、ウィンドウ サービス、およびスタックされたディスク I/O を継承します。以下の 7 つの項目をプラットフォームのセルフレビューとして扱います。認識が多ければ多いほど、Maestro は「SSH を試してみる」 から卒業して専用のペルソナとキュー契約を行う必要があります。
Maestro を無限に伸縮性のある Linux プールのように扱う: iOS ターゲットは macOS とシミュレータにバインドされたままになります。同時実行の上限は、YAML の行数ではなく、メモリと GPU の曲線に従う必要があります。
記録、スクリーンショット、レポートのデフォルトの相対パス: 並列ジョブは互いに踏みつけたり、ブート ボリュームをいっぱいにしたりする可能性があり、断続的に「ディスクに空き領域があるのに書き込みに失敗する」というエラーが表示されます。
1 つの DerivedData ルートをコンパイル ジョブと共有する: Maestro によってトリガーされるビルド キャッシュは XCTest パターンに似ています。不明瞭な名前空間では、「フローは緑、xcodebuild は赤」、つまり誤解を招く逆相関が生じます。
シミュレータ サービスがウォームアップされていない SSH セッション: CoreSimulator のコールド スタートとログイン セッションの想定が Runbook に組み込まれていない場合、最初のフローのタイムアウトが不安定なテストとして見せかけられます。
1 つのクラウド Mac 上で Android と iOS を共同ホストする: Android の依存関係とエミュレータは、ポートと RAM を盗み、iOS シミュレータの I/O と競合し、シンプルなダッシュボードに抵抗する方法でキューのレイテンシを引き延ばします。
フロー レベルのタイムアウトと再試行バジェットの欠落: 1 つのウェッジ フローが同時実行スロットを占有し、キューの深さが増大します。財務部門では、失敗した試行は 1 つも発生せず、消費分が確認されます。
アーティファクトを返送する契約がない: ログが切り捨てられずに終了コードのみを返す障害と、Maestro レポート フォルダーにより、対話型のシェル フォレンジックが強制されます。これは、「VPS のように管理する」の反対です。
共通の根本原因は、宣言型 UI スクリプトを「軽量スクリプト」と誤解していることです。Maestro は依然として実際の iOS ランタイムに組み込まれており、XCTest の記事ですでに管理されているものと同じ物理的制約を継承しています。違いは強調点です。Maestro はブラックボックス回帰とクロスプラットフォームの一貫性に偏っており、単体テストの完全な代替品ではなく、第 2 のゲートとして適合します。
キャパシティ プランニングの場合、「フロー同時実行数」の 2 つの数値を記述します。毎日のプル リクエストの安定した同時実行数と、夜間の完全なマトリックスのピーク同時実行数です。 1 つ目は、レンタルコストの認識を固定します。 2 番目のメッセージは、OS のスロットルがいつ開始されるかを示します。 CPU コア数だけでサイズを決めるのは、GHz だけでラップトップを購入するのと同じくらい危険です。もう 1 つの実用的な詳細はポートとローカル モックです。多くの Linux セットアップの固定ループバック ポートとは異なり、Maestro の並列実行では、「単一実行の緑、並列の赤」の誤検知を回避するために、ポートを分離または動的に割り当てる必要があります。
ランナー記事と組み合わせてください。ラベルはビルドとテストを区別する必要があり、また Maestro が重いコンパイルと同時実行できるかどうかも区別する必要があります。そうでない場合は、ワークフローでシリアル化するか、ラベルを分割します。衝突を丁寧に回避するエンジニアに依存しないでください。 「不安定」という単語を台帳フィールド (フロー名、デバイス タイプ、最初のインストールとウォーム状態、メンテナンス期間) に置き換えます。フィールドがなければ、チームはブルート再実行してクラウド Mac の分を書き込みます。
Maestro をリリース ゲートに昇格させる前に、率直な質問をしてください。フローが失敗したとき、オンコールで 10 分以内に、 それが環境なのか製品なのかを判断できますか?そうでない場合は、YAML の美しさではなく、ロギングとアーティファクトのコントラクトが不完全になります。次のテーブルは「マエストロはどこに住んでいますか?」になります。アーキテクチャの承認について議論します。
単一の正解はありません。小規模なチームは、ハードウェアを節約するためにコンパイルを使用して Maestro をシリアル化する場合があります。成長段階のチームはラベルを分割することが多いため、コンパイルではキャッシュの温かさが維持されますが、UI ブラックボックスの作業は異なるメモリ曲線に沿って行われます。レビューでは、キューの遅延、障害の説明可能性、復元コストの 3 つの SLA を明示的に取得します。
| Dimension | Maestro ブラックボックス フロー (リモート Mac) | XCTest / xcodebuild テスト | コンパイルのみ (アーカイブ/ビルド) |
|---|---|---|---|
| 主な上向き要因 | クロスプラットフォームの YAML 可読性。製品と QA が参加できます。パスは実際のユーザーをミラーリングします | きめ細かい主張と報道。 Xcodeプロジェクトと緊密に統合されています | 最速のフィードバック。成熟したキャッシュレシピ |
| 主なコスト | シミュレータと記録 I/O。同時実行スロットは敏感です | 並列ワーカーと UI テストが GPU を争う | 実際の UI 回帰シグナルはありません。補完的なゲートが必要です |
| 一般的なキュー | 夜間のフル実行とプレリリースのサブセット。コンパイルのピークからずらして離れる | PR ゲートとシャード化されたナイトリー | すべてのコミットまたはマージの前提条件 |
| 復元戦略 | テスト ランナーは頻繁にリセットされます。マインドマウントレポートディレクトリ | スナップショットまたは長期間存続するノードのベースラインに合わせる | コンパイル ホストはより長いキャッシュ サイクルを維持できる |
| ランナーフィット | mac-maestro などの専用ラベルを使用してください。 | mac-test によるパーティション分割 | mac-build パーティションを優先します |
Maestro の言葉で言う「VPS のように Mac をレンタルする」ということは、「誰かの机の上のラップトップのようにランダムに赤いもの」 ではなく、予測可能なセッション、ディレクトリ名前空間、 同時実行スロットを購入することを意味します。
エンタープライズ ビルド プールを運用している場合は、Maestro ジョブの同時実行数の上限をクォータ ドキュメントに書き込み、リリース署名ジョブが同じキーチェーン ウィンドウと競合しないようにします。 スナップショットと永続ノードを組み合わせます。フロー アーティファクトとシミュレータの状態が説明の難しい中間状態に早くさまようため、マエストロ ランナーは通常、コンパイル ホストよりも短い復元サイクルを必要とします。
「分割」 を選択した場合は、アーティファクトとレポートの転送ポリシーも更新します。Maestro junit または HTML 出力は、オブジェクト ストレージに配置されるか、ディスク上の検証された固定パスに従います。ネットワークを横断する場合は、TLS、チェックサムをエンコードし、パイプラインで再試行します。そうしないと、一時的なジッターが「フローの不安定性」として増大します。ほとんどのチームにとって、ラベル パーティションとシリアル化された競合するステージは、ハードウェアをすぐに追加するよりコストが低くなります。メトリクスが相互干渉を証明したら、容量を追加します。
SSH-first CI の記事と同様に、Maestro トリアージは SSH ログと構造化アーティファクトに留まり、VNC を狭いブレークグラス ウィンドウ用に確保する必要があります。これにより、CI は帯域幅を急増させ監査ナラティブを弱める永続的なデスクトップ セッションに依存しません。それを内部標準に書き込むことで、「モニターを接続すると合格した」という終わりのない議論が終わります。
このシーケンスでは最初にプロファイル、2 番目に並列化、最後にキューの展開を強調しています。つまり、Maestro が文書化されていない 2 番目の環境を導入しないように、フィンガープリント スクリプトを再現可能なビルドに合わせます。
Xcode と Maestro のバージョンを固定します: CI ユーザー レコード xcodebuild -version と台帳の maestro --version の下にあります。ジョブ内のアドホック パス切り替えを禁止します。
フローごとに専用の作業ディレクトリとレポート ルートを指定します。 リポジトリ、ブランチ、ビルド ID を含むバケット パスにより、記録とスクリーンショットが衝突することはありません。
同時実行性については保守的に始めます: 1 つのフローが完全にグリーンであることを証明し、キューを開く前に RAM と simctl の安定性を監視しながら並列性を高めます。
必要に応じてウォーム シミュレータ: アイドル ウィンドウ中にカナリア フローを実行し、正常性メトリクスとして最初のインストールの失敗率を追跡します。
タイムアウトと再試行バジェットを強制する: ジョブのプラットフォームのハード タイムアウトに加えて、重要なステップでのソフト タイムアウトにより、不正なコミットがすべてのスロットに割り込むことができなくなります。
復元の頻度を調整する: メジャー アップグレードまたはイメージのロールバックの後、完全な並列処理を復元する前に同じカナリア フローを再実行し、スナップショット メンテナンス プレイブックに引き継ぎます。
#!/usr/bin/env bash set -euo pipefail xcode-select -p xcodebuild -version maestro --version xcrun simctl list devices available | head -n 30 sysctl hw.memsize hw.ncpu
注: 同じホストで Fastlane リリース も実行している場合は、GPU またはキーチェーンを競合するリリース ウィンドウから Maestro ジョブを遠ざけてください。メンテナンス ウィンドウまたはハード ラベルを使用してください。
GitHub Actions とピアでは、Maestro を少なくともライト PR ゲート (小さなフロー サブセット) と夜間のフル マトリックス (マップとエッジ ケース) に分割します。専用リモート Mac は、日中のキューが縮小し、ゲート障害により環境と製品がより早く分離されるため、利点があります。 1 つのスタック フローがキューをデッドロックできないように、タイムアウト分と再試行ポリシーを文書化します。
複数のチームがプールを共有する場合は、誰が同時実行性を上げることができるか、どの監視しきい値を最初に通過する必要があるかを公開します。そうしないと、1 つのチームの並列処理実験が全員の待ち時間が長くなり、会議が指標に取って代わります。技術契約では、不足している組織契約を修正することはできません。
Apple のエコシステムでは、「ヘッドレス」がグラフィックス スタックがゼロであることを意味することはほとんどありません。多くのチームは、すべての依存関係が裸の SSH のみのセッションから起動することを期待するのではなく、無関係な GUI を最小化した固定ログイン セッションを実装しています。プラットフォーム エンジニアリングでは、フローをバケット化する必要があります。純粋なロジック、重いアニメーションを含まないシミュレーターが必要なフロー、GPU やカメラの負荷が高いフローです。最後のバケットをナイトリーまたは専用ラベルノードに送信します。
優先順位を付けるときは、 まず同じ種類のデバイスを再現可能に起動できることを証明します。起動時の失敗は通常、サービス、ディスク、またはアクセス許可を意味します。ブート後のランダムなクラッシュは、多くの場合、メモリのスパイクや過剰な並列処理を意味します。 SSH と VNC をクロスチェックします。本当に時折 GUI トリアージが必要な場合は、CI を永続的なデスクトップ セッションに依存させるのではなく、VNC の表面積を縮小します。
警告: 「初回起動時に許可をタップ」に依存するフローをそのまま並列 CI にドロップしないでください。スタブに置き換えるか、ゴールデン イメージで 1 回限りの認証を完了して文書化してください。そうしないと、すべての復元が一斉に爆発してしまいます。
高解像度の録画や長いビデオの場合は、 フローにリソース層をタグ付けし、専用ノード上で一致するディスク クラスを予約します。エンドツーエンドのキュー遅延が定義されている場合は、大量の記録スイートと軽量フローの大きなバッチを同時にスケジュールしないでください。ビジネスでピクセル完璧な証拠チェーンが必要な場合は、それらのフローを低周波数のパイプラインに移動して、他のすべてのレイテンシ バジェットを設定しないようにします。
再現可能なビルドキーチェーン ポリシーに一致します。テスト ユーザーとリリース ユーザーが異なる場合、Maestro がシミュレーターを起動するための最小限の署名材料にまだ達していることを確認します。ユーザーが共有されている場合は、1 つの失敗したフローがリリース資産を汚染しないように、ディレクトリとキーチェーンのパーティションを強化します。
最後に、一時的な VNC をいつ許可するか、誰が承認するか、ウィンドウの継続時間、およびアクセスの記録方法など、「最小限の GUI」ポリシーをオンコール ハンドブックに成文化します。ハンドブックがなければ、チームはデフォルトで「誰が最も声を大きくするか」を選択することになり、帯域幅と監査ナラティブの両方が低下します。リモート Mac の価値は再現可能なセッション モデルであり、個人用のリモート デスクトップのおもちゃではありません。
内部の位置合わせには以下の箇条書きを使用してください。フロー ミックスと同時実行ポリシーに合わせて数値を調整します。
jetsam or abrupt process termination, lower concurrency before blind retries.個人のラップトップでは、スリープ、アップデート、デスクトップのマルチタスクによってフローが中断されます。純粋な Linux は Apple の公式シミュレータ スタックをホストできません。 Maestro を専用、常時接続、 プロファイルされたリモート Mac に移行すると、同時実行性とディレクトリ戦略が「画面をロックしないことを覚えていた人」ではなく契約に変わります。不安定な共有環境やチームメイトのマシンを借りている場合と比較すると、 継続的にセッション ドリフト、予測不可能なディスク、 同時実行性の戦いで出血が続きます。トリアージ ウィンドウは延長され、リリースはキューに延期され、財務部門では原因不明の分単位の燃焼が発生します。固定 SSH エントリ、クリアなディスク層、反復可能なノード ペルソナを必要とするチームは、多くの場合、Maestro に適したクリーンなプラットフォームであるNodeMini Mac Mini クラウド レンタルを見つけます。 レンタル料金でハードウェアと価格を比較し、ヘルプ センターでオンボーディングを完了します。
内部「CI 層」を使用してこの Runbook を運用可能にします。L1 コンパイルのみ。 L2 単体テストとライト フロー。 L3 はより広範なマエストロのサブセット。大量のレコーディング フローを含む L4 ナイトリー。各プロモーションでは、製品の逸話ではなく、監視ゲートを引用する必要があります。そうすれば、財務部門とエンジニアリング部門は同じキューとコストのストーリーを読むことができます。
Android と一部のクロスプラットフォーム シナリオでは可能ですが、iOS ターゲットでは依然として macOS と Xcode ツールチェーンが必要です。 iOS が優勢な場合は、Maestro を専用のリモート Mac または同等の macOS エグゼキューターに固定し、コントラクトとして同時実行性とディスク ポリシーを記述します。
XCTest の記事では、xcodebuild とシミュレーターでの並列処理とシャーディングについて説明しています。この記事では、Maestro YAML ブラックボックス フローと CI キュー分離について説明します。登録とラベルについてランナーの記事を読んでから、Maestro を 2 番目のゲートとして追加します。