Когда вы используете CodeShip в качестве сервера CI, вы можете значительно увеличить скорость своих CI-сборок с помощью Parallel Test Pipelines. Конвейеры позволяют запускать несколько команд одновременно, например, вы можете разделить набор тестов на несколько конвейеров и выполнить сборку CI намного быстрее.

1. Как запускать параллельные команды на CodeShip

Настройка через интерфейс CodeShip

Один из способов — определить команды через интерфейс CodeShip. После включения параллельных конвейеров тестирования каждый проект может иметь несколько конвейеров тестирования, которые будут выполняться параллельно.

Чтобы выполнить сборку CI как можно быстрее, нам необходимо убедиться, что параллельные команды будут запускать подмножество набора тестов таким образом, чтобы все команды выполнялись одновременно, чтобы избежать узких мест медленного конвейера. Чтобы разделить набор тестов, мы будем использовать Knapsack Pro с режимом очереди, который выполняет динамическое разделение набора тестов по конвейерам для тестов Ruby и JavaScript, чтобы поддерживать оптимальное выполнение наших тестов в параллельных конвейерах (также известных как узлы CI).

Пример набора тестов в RSpec для проекта Ruby on Rails

Настройка тестовых конвейеров (используется 1/2)

# first CI node running in parallel

# RSpec tests in Knapsack Pro Queue Mode (dynamic test suite split)
KNAPSACK_PRO_CI_NODE_TOTAL=2 KNAPSACK_PRO_CI_NODE_INDEX=0 bundle exec rake knapsack_pro:queue:rspec

Настройка тестовых конвейеров (используется 2/2)

# second CI node running in parallel

# RSpec tests in Knapsack Pro Queue Mode (dynamic test suite split)
KNAPSACK_PRO_CI_NODE_TOTAL=2 KNAPSACK_PRO_CI_NODE_INDEX=1 bundle exec rake knapsack_pro:queue:rspec

Пример разделения набора тестов для запуска тестов Cypress в JavaScript

Настройка тестовых конвейеров (используется 1/2)

# first CI node running in parallel
KNAPSACK_PRO_CI_NODE_TOTAL=2 KNAPSACK_PRO_CI_NODE_INDEX=0 $(npm bin)/knapsack-pro-cypress

Настройка тестовых конвейеров (используется 2/2)

# second CI node running in parallel
KNAPSACK_PRO_CI_NODE_TOTAL=2 KNAPSACK_PRO_CI_NODE_INDEX=1 $(npm bin)/knapsack-pro-cypress

Подробнее о Cypress test runner для E2E-тестов в JavaScript вы можете узнать в этой статье.

2. Настройка через codeship-services.yml

Если вы используете CodeShip Pro, то группа параллельных шагов определяется с помощью заголовка type: parallel, а затем вложения всех шагов, которые вы хотите распараллелить, как показано в этом примере:

- type: parallel
  steps:
  - service: app
    command: KNAPSACK_PRO_CI_NODE_TOTAL=2 KNAPSACK_PRO_CI_NODE_INDEX=0 bundle exec rake knapsack_pro:queue:rspec
  - service: app
    command: KNAPSACK_PRO_CI_NODE_TOTAL=2 KNAPSACK_PRO_CI_NODE_INDEX=1 bundle exec rake knapsack_pro:queue:rspec

Еще примеры настройки Параллелизм CodeShip Pro

3. Как работает разделение набора динамических тестов

Если вы хотите лучше понять, как работает динамическое разделение набора тестов и какие проблемы оно может решить, посмотрите видео:

Резюме

Параллельное выполнение тестов — это быстрый способ сократить время сборки CI. Чтобы сделать его более эффективным, мы можем оптимально разделить набор тестов между узлами CI с помощью Knapsack Pro, чтобы поддерживать автоматическую балансировку узлов CI и запускать сборку CI как можно быстрее.

Первоначально опубликовано на docs.knapsackpro.com.