Современная разработка требует, чтобы приложение работало стабильно в самых разных условиях. Если ваш проект использует Node.js, вам наверняка важно, как он поведет себя на 16-й, 18-й или 20-й версии среды выполнения. А если вы разрабатываете кроссплатформенный инструмент, то к списку проверок добавляются разные операционные системы: Ubuntu, Windows и macOS. В этой статье рассмотрим GitHub Actions Matrix.
Писать отдельные инструкции (Jobs) для каждой комбинации — это путь к созданию огромных, трудночитаемых YAML-файлов. В этой статье мы разберем, как использовать инструмент Matrix в GitHub Actions, чтобы оптимизировать CI/CD процессы и запускать десятки тестов с помощью всего нескольких строк кода.
Что такое Matrix Strategy?
Matrix Strategy (матричная стратегия) — это функционал GitHub Actions, который позволяет запускать один и тот же Job несколько раз, используя различные переменные. По сути, вы создаете массив данных, и GitHub автоматически генерирует комбинации запусков на их основе.
Это значительно экономит время на написание кода и упрощает поддержку workflow. Вместо копирования блоков кода вы просто указываете параметры, которые должны меняться.
Настройка базовой матрицы для Node.js
Предположим, вам нужно протестировать проект на трех версиях Node.js: 12, 14 и 18. Вместо создания трех разных задач, мы используем ключ strategy и matrix.
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12, 14, 18]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: node -v
В этом примере GitHub Actions запустит три параллельных процесса. В каждом из них переменная ${{ matrix.node-version }} примет соответствующее значение из списка.
Тестирование на разных операционных системах
Если ваша цель — кроссплатформенная совместимость, матрицу можно расширить, добавив в нее выбор ОС. В этом случае GitHub создаст комбинации всех указанных параметров.
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [12, 14, 18]
runs-on: ${{ matrix.os }}
Как это работает: GitHub перемножит количество ОС на количество версий Node.js. В данном примере (2 ОС * 3 версии) будет запущено 6 параллельных задач. Это позволяет за один пуш в репозиторий убедиться, что код работает и на Linux, и на Windows во всех необходимых средах.
Продвинутые параметры: Fail-Fast и Max-Parallel
При работе с матрицами важно контролировать поведение всей очереди задач:
- fail-fast: По умолчанию, если одна из задач в матрице падает с ошибкой, GitHub отменяет все остальные запущенные задачи в этом Job. Чтобы этого избежать и дождаться результатов всех тестов, установите
fail-fast: false. - max-parallel: Если у вас очень большая матрица (например, 20 комбинаций), вы можете ограничить количество одновременно выполняемых задач, чтобы не занимать все ресурсы сразу.
strategy:
fail-fast: false
max-parallel: 2
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [12, 14, 18]
Использование Include и Exclude
Иногда нам не нужны абсолютно все комбинации. Например, вы хотите протестировать проект на macOS, но только для последней версии Node.js.
- Exclude: Позволяет исключить конкретную связку из матрицы.
- Include: Позволяет добавить специфическую комбинацию или расширить существующую задачу дополнительными параметрами.
Пример использования:
Если мы хотим убрать из тестов Ubuntu с 14-й версией ноды, но добавить macOS с 17-й версией:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [12, 14, 18]
exclude:
- os: ubuntu-latest
node-version: 14
include:
- os: macos-latest
node-version: 17
Обработка ошибок с Continue-on-error
Если вы тестируете экспериментальные функции или нестабильные версии среды, вы можете использовать параметр continue-on-error. Это позволит вашему общему Workflow получить статус «Success», даже если конкретный шаг в матрице завершился неудачей.
Заключение
Использование Matrix в GitHub Actions — это стандарт де-факто для профессиональной настройки CI/CD. Это не только делает ваши файлы конфигурации чище, но и обеспечивает максимальное покрытие тестами при минимальных усилиях.
Начните внедрять матричную стратегию в свои проекты, чтобы гарантировать стабильность кода в любой экосистеме!

