ハイライト
Xcode Cloud は、チームがビルド消費を監視および最適化できるように、使用状況ダッシュボードを追加します。開始条件を細かく設定し、テスト宛先を合理化し、無関係なファイル変更を除外することで、品質を低下させることなく CI 計算の使用量を大幅に削減できます。
主要内容
あなたのチームは Xcode Cloud を使用していますが、毎月のコンピューティング クレジットがすぐに消費されてしまいます。リリース ワークフローでは、コードを変更せずにバージョンをビルドすることが多く、テストは多数の同様のシミュレーターで繰り返し実行され、ドキュメントの更新によって完全なビルド プロセスがトリガーされます。
(02:17) セッションでは、フード トラック プロジェクトを使用してこれらの問題を診断し、最適化する方法を示します。
ビルド時間と使用量を理解する
(02:25) Xcode Cloud の 2 つの重要な指標:
- 期間: 実測時間、ビルドの開始から結果のレンダリングまでの合計時間
- 使用量: すべてのアクションの計算時間の合計
分析、アーカイブ、ビルド、テストなどのアクションは並行して実行されるため、期間は最も遅いアクションの時間に等しく、使用量はそれらの合計となります。 14 分のビルドでは 32 分の使用量が消費される可能性があります。
(02:43) ビルドの詳細で、使用量の分布を表示し、各アクションにかかる時間を確認できます。これが最適化のエントリ ポイントです。
Usage Dashboard
(03:55) App Store Connect の新しい使用状況ダッシュボードでは、次のものが提供されます。
- 現在の請求期間の合計使用量と残高の割合
- 30 日間のビルド数と使用傾向
- 製品ごとの使用量分布を表示
- ワークフローごとの使用状況統計の表示
(04:55) 特定の製品を入力すると、各ワークフローの使用方法を確認できます。多くの場合、リリース ワークフローは最適化の対象として最も価値があります。
開始条件を最適化する
(05:34) 開始条件により、どのイベントがビルドをトリガーするかが決まります。 Food Truck のリリース ワークフローはもともとスケジュールされた条件を使用し、定期的に構築されていたため、新しい変更がない状況が頻繁に発生しました。
(06:30) ブランチ変更条件に置き換えられました: コードがリモート ブランチにプッシュされた場合のみビルドします。さらに一致のみに制限するrelease/*機能ブランチの変更によってリリース ワークフローがトリガーされるのを防ぐために、接頭辞付きブランチを追加します。
(07:52) 特定のフォルダーへの変更を除外することもできます。 Food Truck の docs ディレクトリには開発ドキュメントのみが含まれており、ドキュメントを変更してもビルドをトリガーする必要はありません。
- 開始条件で [ファイルとフォルダー] > [カスタム条件] を選択します。 2.「ビルドを開始しない」を選択します。
- 条件を追加します: [任意のフォルダー] > [ドキュメント]
テスト先の合理化
(09:08) テスト アクションでは、各宛先が並行して実行されます。エミュレータを選択しすぎると使用量が増加し、同様のデバイスでノイズの多い障害が発生します。
(09:31) Xcode Cloud は、さまざまな画面サイズの代表的なデバイスをカバーするエミュレーターの厳選されたリストである「推奨」エイリアスを提供します。手動で選択した多数のシミュレーターを推奨 iPhone に置き換えて、使用量を削減しながらテスト範囲を確保します。
特定のコミットをスキップする
(10:42) README の更新のみなど、一部のコミットでは CI をトリガーする必要はありません。コミットメッセージの最後に追加します[ci skip]:
git commit -m "Update README [ci skip]"
Xcode Cloud はプッシュ後このイベントを無視します。正確な形式を使用する必要があることに注意してください。
最適化効果
(12:10) これらのベスト プラクティスを適用した後、フード トラックのビルド時間が 1 分短縮され、使用量が 4 分減少しました。統合ワークフローが長期間実行されると、使用傾向は大幅に低下し、新しい watchOS ワークフロー用のクォータが解放されました。
詳細
開始条件の設定
(06:40) リリースワークフローの開始条件設定例:
Start Condition: Branch Changes
Source Branch: Custom Branches
- Branches beginning with: "release"
Files and Folders: Custom Conditions
- Don't start a build when: Any Folder = docs
キーポイント:
- ブランチの変更は、スケジュールされた空の実行を避けるために、コードがプッシュされたときにのみトリガーされます。
- カスタム ブランチは完全一致または接頭辞一致をサポートします
- ファイルの除外は正確なファイル パスまたはフォルダーをサポートします
- 複数の条件間に AND 関係がある
テスト先の選択
(09:46) アクションの宛先構成をテストします。
Test iOS
Destinations:
- Recommended iPhones (iPhone 8, iPhone 11, iPhone 12, iPhone 13... の代替)
キーポイント:
- 推奨されるエイリアスは、さまざまな画面サイズと機能の組み合わせをカバーします
- 宛先ごとに独立してテストを実行し、並行して実行します
- 同様のデバイスでのテストの失敗にはノイズが多いため、宛先を減らすと誤検知を減らすことができます
- プロジェクトにデバイス固有のコードパスがある場合は、対応する宛先を追加できます
Custom Scripts
(11:07)各 action は複数のタイミングでカスタムスクリプトを実行します。
# 未使用の依存関係をクリーンアップ
brew cleanup
# 不安定な API リクエストをリトライ
for i in {1..3}; do
curl -f https://api.example.com/data && break
sleep 5
done
キーポイント:
- スクリプトは action の pre-build、post-build などの段階で実行されます
- 一時ファイルやキャッシュをクリーンアップすると、ビルド時間を短縮できます
- 外部サービスへのリクエストにリトライロジックを追加し、偶発的なネットワーク問題によるビルド失敗を避けます
テストの信頼性
(11:30)不安定なテストにより、ビルドが繰り返し再試行され、大量の使用量が無駄になる可能性があります。 Fixing these tests should be prioritized rather than relying on retries.
不安定なテストの一般的な理由:
- 非同期操作が正しく待機していない
- テスト間で状態を共有する
- 外部サービスまたはネットワークへの依存
- 時間に敏感なアサーション
重要ポイント
-
やるべきこと: チーム用に Xcode Cloud 使用状況監視メカニズムをセットアップする
-
実行する価値がある理由: 使用状況ダッシュボードは使用状況を透明にし、無駄を特定し、割り当てを合理的に割り当てるのに役立ちます。
-
開始方法: App Store Connect の使用状況ダッシュボードを定期的に確認し、ワークフローごとに使用状況の分布を分析します
-
やるべきこと: さまざまなブランチ タイプに独立したワークフローを構成する
-
実行する価値がある理由: フィーチャー ブランチでは簡単なビルドとテストのみが必要で、リリース ブランチでは完全なアーカイブと分析のみが必要です。
-
開始方法: 複数のワークフローを作成し、開始条件のブランチ変更を使用して、異なるブランチ プレフィックスに一致させます。
-
やるべきこと: コミット仕様に CI スキップ マーカーを導入する
-
実行する価値がある理由: 完全な CI プロセスを必要としないドキュメントの更新、構成ファイルの調整、その他の送信により、使用量を節約できます。
-
開始方法: チームの Git ワークフロー ドキュメントに追加します
[ci skip]使用説明書 -
やるべきこと: watchOS コンパニオン アプリ用のスタンドアロン Xcode Cloud ワークフローを構成します。
-
実行する価値がある理由: watchOS は iOS から独立してビルドおよびテストされ、個別の構成によりトリガー条件と送信先をより柔軟に制御できます。
-
開始方法: Xcode のレポート ナビゲーターで新しいワークフローを作成し、watchOS 関連のスキームとテスト計画を選択します。
関連セッション
- Xcode Cloud の紹介 — WWDC21 Xcode Cloud 入門
- チーム向け Xcode Cloud の詳細 — チーム Xcode Cloud の詳細な使用
- Xcode Cloud の高速で信頼性の高いテストを作成する — 高速で信頼性の高いテストを作成する
コメント
GitHub Issues · utterances