Перейти к содержимому

Шардинг тестов Rust

Tuist распределяет цели тестирования Cargo по CI-воркерам, используя исторические данные о длительности целей. Цели модульных тестов, интеграционных тестов и doctests каждой библиотеки являются отдельными модулями. Тесты внутри одной цели выполняются вместе.

Requirements
  • Настройте Rust Test Insights и аутентифицируйте CLI в задаче планирования и на воркерах.
  • Выберите один пакет, используя -p <package> в рабочем пространстве. Шардинг нескольких пакетов не поддерживается.
  • Используйте одинаковую ревизию, инструментарий Rust, выбор пакета, возможности (features) и фильтры тестов в каждой задаче.

Создание плана#

Добавьте количество шардов к --no-run, чтобы скомпилировать и перечислить цели без выполнения тестов:

bash
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:

bash
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 не поддерживаются для шардинга. Сохраняйте идентичный выбор тестов при планировании и выполнении.