Rust テストのシャーディング
Tuist は、過去のターゲット実行時間に基づいて Cargo のテストターゲットを CI ワーカーに分散します。ユニットテストターゲット、統合テストターゲット、および各ライブラリの doctests は個別のモジュールとして扱われます。同一ターゲット内のテストはまとめられます。
- Rust Test Insights を設定し、プランニングジョブとワーカーで CLI を認証してください。
- ワークスペース内で
-p <package>を使用して 1 つのパッケージを選択してください。複数パッケージのシャーディングはサポートされていません。 - すべてのジョブで同じリビジョン、Rust ツールチェーン、パッケージ選択、フィーチャー、およびテストフィルターを使用してください。
プランの作成#
テストを実行せずにターゲットをコンパイルおよび列挙するため、--no-run にシャード数を追加します:
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 テスト引数を使用します:
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 オプションはシャーディングでサポートされていません。プランニングと実行の間でテスト選択を同一に保ってください。