コンテンツへスキップ

Rust テストのシャーディング

Tuist は、過去のターゲット実行時間に基づいて Cargo のテストターゲットを CI ワーカーに分散します。ユニットテストターゲット、統合テストターゲット、および各ライブラリの doctests は個別のモジュールとして扱われます。同一ターゲット内のテストはまとめられます。

Requirements
  • Rust Test Insights を設定し、プランニングジョブとワーカーで CLI を認証してください。
  • ワークスペース内で -p <package> を使用して 1 つのパッケージを選択してください。複数パッケージのシャーディングはサポートされていません。
  • すべてのジョブで同じリビジョン、Rust ツールチェーン、パッケージ選択、フィーチャー、およびテストフィルターを使用してください。

プランの作成#

テストを実行せずにターゲットをコンパイルおよび列挙するため、--no-run にシャード数を追加します:

bash
TUIST_SHARD_REFERENCE=my-ci-run tuist cargo test -p store --no-run --shard-max 4

コマンドは、shard_plan_id とゼロベースの shards 配列を含む JSON を出力します。GitHub Actions では、shard-plan-id と shards も GITHUB_OUTPUT に書き込まれます。明示的な参照がない場合、Tuist はサポートされている CI 環境から参照を導出します。

オプション説明
--shard-max Nシャードの最大数
--shard-min Nシャードの最小数
--shard-total N利用可能なターゲットまでの正確な数
--shard-max-duration Nシャードの目標最大継続時間(ミリ秒)

--shard-total を単独で使用するか、--shard-min と --shard-max を組み合わせて使用します。過去の継続時間データがない場合、プランナーはデフォルトのターゲット見積もりを使用します。シャードオプションなしの通常の --no-run は、ビルドのみを行うコマンドのままです。

各シャードの実行#

各ワーカーでプラン ID とシャードインデックスを設定し、同じ Cargo テスト引数を使用します:

bash
TUIST_SHARD_PLAN_ID=<plan-id> TUIST_SHARD_INDEX=0 tuist cargo test -p store

あるいは、プラン ID を渡す代わりに、TUIST_SHARD_REFERENCE をプランニングジョブの参照に設定します。Tuist は割り当てを取得し、Cargo にそれらのターゲットのみを実行するよう指示します。無効または互換性のない割り当ての場合、すべてのテストを実行するのではなくコマンドは失敗します。空の割り当ての場合、テストは実行されません。ワーカーからの結果は Test Insights でプランにリンクされ、quarantine は各シャード内で適用されます。

制限事項#

これはターゲットレベルのシャーディングであり、一度ビルドして配布する方式ではありません。各ワーカーにはソースチェックアウトが必要で、独自のターゲットをビルドします。Cargo コンパイルキャッシュ を使用すれば、対象となるコンパイル成果物を再利用できます。Tuist はテスト実行可能ファイルをアップロードせず、他の Rust テストランナーも必要としません。

シャーディングには、選択された 1 つのパッケージが必要です。複数パッケージのコマンドを絞り込むと Cargo の統一された依存関係フィーチャーが変更される可能性があるため、Tuist は異なるフィーチャーグラフでテストを実行するのではなく、それを拒否します。複数パッケージのシャーディングがサポートされるまで、各パッケージを個別にプランニングしてください。

シャーディングには標準の libtest ハーネスとキャプチャされたデフォルト出力が必要です。quiet、verbose、alternate-format、uncaptured-output、および custom-harness コマンドは拒否されます。Cargo がターゲットを一意に識別できない場合は、-p <package> で正確なワークスペースパッケージを選択してください。依存パッケージ、バージョン修飾セレクター、パッケージ/ターゲット名のグロブ、および Cargo の nightly -C オプションはシャーディングでサポートされていません。プランニングと実行の間でテスト選択を同一に保ってください。