Шардинг тестов Rust
Tuist распределяет цели тестирования Cargo по CI-воркерам, используя исторические данные о длительности целей. Цели модульных тестов, интеграционных тестов и doctests каждой библиотеки являются отдельными модулями. Тесты внутри одной цели выполняются вместе.
- Настройте Rust Test Insights и аутентифицируйте CLI в задаче планирования и на воркерах.
- Выберите один пакет, используя
-p <package>в рабочем пространстве. Шардинг нескольких пакетов не поддерживается. - Используйте одинаковую ревизию, инструментарий Rust, выбор пакета, возможности (features) и фильтры тестов в каждой задаче.
Создание плана#
Добавьте количество шардов к --no-run, чтобы скомпилировать и перечислить цели без выполнения тестов:
TUIST_SHARD_REFERENCE=my-ci-run tuist cargo test -p store --no-run --shard-max 4
Команда выводит JSON, содержащий shard_plan_id и массив shards с нулевой индексацией. В 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
В качестве альтернативы установите TUIST_SHARD_REFERENCE равным ссылке задачи планирования вместо передачи ID плана. Tuist получает назначение и просит Cargo выполнить только соответствующие цели. Недействительные или несовместимые назначения приводят к ошибке команды, а не к запуску всех тестов. Пустые назначения не выполняют тесты. Результаты с воркеров связываются с планом в Test Insights, и карантин применяется в пределах каждого шарда.
Ограничения#
Это шардинг на уровне целей, а не распределение с однократной сборкой. Каждому воркеру требуется клон исходного кода и сборка своих целей; кэш компиляции Cargo позволяет повторно использовать подходящие результаты компиляции. Tuist не загружает исполняемые файлы тестов и не требует другого раннера для тестов Rust.
Для шардинга требуется выбрать один пакет. Сужение команды для нескольких пакетов может изменить унифицированные зависимости возможностей (features) в Cargo, поэтому Tuist отклоняет такую команду вместо запуска тестов с другим графом возможностей. Планируйте каждый пакет отдельно, пока не будет добавлена поддержка шардинга нескольких пакетов.
Шардинг требует стандартных harness'ов libtest и захвата вывода по умолчанию. Команды с тихим режимом, подробным выводом, альтернативным форматом, без захвата вывода и с пользовательскими harness'ами отклоняются. Если Cargo не может однозначно определить цель, выберите конкретный пакет рабочего пространства с помощью -p <package>. Пакеты зависимостей, селекторы с указанием версии, глобальные шаблоны имён пакетов/целей и ночная опция Cargo -C не поддерживаются для шардинга. Сохраняйте идентичный выбор тестов при планировании и выполнении.