Перейти к основному содержимому
Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Распределённое выполнение задач (DTE)

Lerna ускоряет среднее время CI с помощью кэширования и флага --since. Но эти функции не помогают в худшем сценарии. Когда изменяется что-то в основе вашего репозитория и все задачи должны выполняться в CI, единственный способ улучшить производительность — добавить больше агентских заданий и эффективно распараллелить задачи.

Самый очевидный способ распараллеливания — группировка задач по типу: все тесты в одном задании, сборки в другом, а линтинг в третьем. Эта стратегия называется бинингом. Это может осложниться, если для некоторых тестов требуются предварительные сборки, но если предположить, что вы нашли способ это организовать, типичная настройка выглядит как на диаграмме ниже. Здесь тестовые задачи задерживаются до готовности артефактов сборки, а задачи сборки и линтинга могут стартовать сразу.

CI с использованием бининга

Проблема бининга — простой одного или нескольких заданий. Распределённое выполнение задач Nx сводит этот простой к минимуму, назначая каждую задачу агентам на основе её среднего времени выполнения. Nx гарантирует корректный порядок выполнения и использует распределённое кэширование, чтобы артефакты сборки были доступны на каждом агенте, которому они нужны.

При настройке распределённого выполнения задач Nx ваш граф задач будет выглядеть так:

CI с использованием DTE

CI не только завершится быстрее, но и отладка будет такой же, как при выполнении всего CI в одном задании. Это потому что Nx использует распределённое кэширование для воссоздания логов и артефактов сборки в главном задании.

Подробнее в руководстве по оптимизации худшего сценария CI.

Настройка

Для распределённого выполнения задач вам необходимо (1) подключиться к Nx Cloud и (2) активировать DTE в вашем CI-воркфлоу.

1. Connect to Nx Cloud via the interactive, browser-based workflow
npx nx connect-to-nx-cloud

Настройка CI-воркфлоу

Каждая организация управляет своими CI/CD-пайплайнами по-разному, поэтому невозможно охватить все случаи. Однако следующие примеры настройки DTE для CLI Nx у популярных провайдеров дадут хорошую отправную точку. Их легко адаптировать под специфичные команды Lerna вроде lerna run (вместо nx run-many или nx affected):

Распределять можно только кэшируемые операции, так как их результаты нужно воспроизвести в основном задании.

Подробнее о настройке DTE читайте в этом руководстве.

Процесс выполнения в CI

Распределённое выполнение задач работает с любым CI-провайдером. Вы отвечаете за запуск заданий в вашей CI-системе, а Nx Cloud координирует их взаимодействие. Вам потребуется создать два типа заданий:

  1. Главное задание, управляющее выполнением

  2. Несколько агентских заданий, выполняющих задачи

Процесс главного задания:

# Coordinate the agents to run the tasks
- npx nx-cloud start-ci-run
# Run any commands you want here
- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main
# Stop any run away agents
- npx nx-cloud stop-all-agents

Процесс агентского задания очень прост:

# Wait for tasks to execute
- npx nx-cloud start-agent

Главное задание выглядит почти так же, как без распределения. Всё, что нужно — вызвать npx nx-cloud start-ci-run в начале и опционально npx nx-cloud stop-all-agents в конце.

Агентские задания запускают долгоживущие процессы start-agent, выполняющие все задачи CI-запуска. Для их настройки достаточно вызвать npx nx-cloud start-agent. Процесс будет работать, пока Nx Cloud не остановит его.

Важно: главное и агентские задания должны иметь идентичное окружение и исходный код. Они запускаются примерно одновременно. После завершения главного задания все агенты останавливаются.

Также важно понимать, что агент Nx Cloud — это не машина, а долгоживущий процесс, работающий на машине. То есть Nx Cloud не управляет вашими агентами — это нужно настраивать в конфигурации CI (см. примеры CI выше).

Nx Cloud выступает оркестратором. Основное задание сообщает Nx Cloud, что нужно выполнить, а Nx Cloud распределит эти задачи между агентами. Nx Cloud автоматически перемещает файлы между агентами и из агентов в основное задание.

В результате, когда команда вроде lerna run build --since=main завершается в основном задании, все артефакты файлов, созданные агентами, копируются в основное задание — так, будто оно выполняло сборку локально.

Параллельное выполнение задач

Параметр --concurrency передаётся агентам. Например, npx lerna run build --since=main --concurrency=3 --dte указывает Nx Cloud выполнять до 3 целей сборки параллельно на каждом агенте. Так, при наличии 10 агентов, вы сможете параллельно запустить до 30 сборок.

Также рекомендуется параллелизировать как можно больше команд. Например:

- lerna run lint --since=main
- lerna run test --since=main
- lerna run build --since=main

хуже, чем

- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main

Последний вариант будет планировать выполнение всех трех команд одновременно, поэтому если агент не может найти что-либо для сборки, он начнет запускать тесты и линты. В результате это приводит к лучшему использованию агентов и сокращению времени CI.

Репозитории и примеры