Сборки GitHub Actions с использованием Матрицы

GitBeginner
Практиковаться сейчас

Введение

При разработке программного обеспечения крайне важно убедиться, что ваш код корректно работает в различных средах. Например, библиотеку Node.js следует тестировать на нескольких версиях Node.js (например, v18, v20, v22).

Вместо создания отдельных заданий (jobs) для каждой версии GitHub Actions предоставляет Стратегию Матрицы (Matrix Strategy). Это позволяет определить набор переменных, и GitHub Actions автоматически создаст задание для каждой комбинации этих переменных.

В этой лабораторной работе вы обновите свой рабочий процесс (workflow), чтобы запускать тесты параллельно для трех разных версий Node.js.

Эта лабораторная работа основана на репозитории, который вы создали в предыдущих лабораторных работах. Вы будете работать с репозиторием github-actions-demo.

Изменение рабочего процесса для включения матрицы стратегий

Ключевое слово strategy используется для настройки матрицы сборки (build matrix). Мы определим матрицу с единственным ключом node-version.

  1. На странице вашего репозитория GitHub для github-actions-demo нажмите зеленую кнопку Code.
  2. Убедитесь, что выбрана вкладка HTTPS, и скопируйте URL. Он должен выглядеть примерно так: https://github.com/your-username/github-actions-demo.git.
  3. Откройте терминал в среде LabEx. Путь по умолчанию — ~/project.
  4. Используйте команду git clone для загрузки репозитория. Замените your-username на ваш фактический логин GitHub.
cd ~/project
git clone https://github.com/your-username/github-actions-demo.git

Пример вывода:

Cloning into 'github-actions-demo'...
remote: Enumerating objects: X, done.
remote: Counting objects: 100% (X/X), done.
remote: Total X (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (X/X), done.
  1. Перейдите в клонированный репозиторий:
cd ~/project/github-actions-demo
  1. Создайте новый файл рабочего процесса (workflow) .github/workflows/matrix-build.yml с помощью редактора WebIDE. Вы можете найти этот файл в проводнике файлов слева в разделе project/github-actions-demo/.github/workflows/.

  2. Начните с создания базовой структуры рабочего процесса. Добавьте имя рабочего процесса и триггер:

name: Matrix Build

on: [push]
  1. Теперь добавьте секцию jobs с базовой структурой задания сборки:
jobs:
  build:
    runs-on: ubuntu-latest
  1. Добавьте стратегию матрицы. Это ключевая часть, которая позволяет запускать задание с несколькими версиями Node.js:
strategy:
  matrix:
    node-version: [18, 20, 22]

Это определяет переменную матрицы node-version с тремя значениями. GitHub Actions создаст отдельное задание для каждого значения.

  1. Добавьте секцию steps. Сначала добавьте шаг для извлечения кода (checkout):
steps:
  - uses: actions/checkout@v4
  1. Добавьте шаг настройки Node.js. Обратите внимание, как мы используем ${{ matrix.node-version }} для обращения к текущему значению матрицы:
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. Добавьте шаг для установки зависимостей:
- name: Install dependencies
  run: npm install
  1. Добавьте шаг сборки, который создает директорию артефактов:
- name: Build project
  run: |
    mkdir dist
    echo "This is the build artifact" > dist/build.txt
  1. Добавьте шаг запуска тестов:
- name: Run tests
  run: npm test
  1. Наконец, добавьте шаг загрузки артефакта. Обратите внимание, что имя артефакта включает версию матрицы, чтобы сделать каждый артефакт уникальным:
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist

Ваш полный файл теперь должен выглядеть следующим образом:

name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

Объяснение

  • strategy: Определяет стратегию сборки.
  • matrix: Определяет переменные матрицы.
  • node-version: Это имя переменной, которое мы выбрали. Мы присвоили ей массив значений [18, 20, 22]. GitHub Actions запустит задание build три раза, по одному разу для каждого значения.
  • ${{ matrix.node-version }}: Этот синтаксис позволяет вам обращаться к текущему значению матрицы в ваших шагах.

Сохраните файл (Ctrl+S или Cmd+S) после внесения изменений.

Обновление setup-node и имени артефакта для использования контекста матрицы

Определение матрицы — это только половина дела; нам также необходимо указать шагам, как использовать текущее значение из матрицы. Мы делаем это с помощью контекста ${{ matrix.node-version }}.

Нам также необходимо гарантировать, что артефакты, загружаемые каждой параллельной задачей (job), имеют уникальные имена, иначе они перезапишут друг друга.

  1. В файле .github/workflows/matrix-build.yml убедитесь, что шаг Use Node.js использует переменную матрицы:
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. Убедитесь, что шаг Upload build artifact включает версию матрицы в имя артефакта:
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist
  1. Ваш полный файл рабочего процесса (workflow) должен выглядеть следующим образом:
name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

Сохраните файл (Ctrl+S или Cmd+S).

Зафиксируйте изменения, отправьте их и наблюдайте за параллельными заданиями

Давайте посмотрим на матрицу в действии, зафиксировав ваши изменения в GitHub.

  1. Убедитесь, что вы находитесь в каталоге репозитория:
cd ~/project/github-actions-demo
  1. Добавьте изменения в индекс (Stage the changes):
git add .
  1. Зафиксируйте изменения (Commit the changes):
git commit -m "Add matrix strategy for Node.js versions"
  1. Отправьте изменения в удаленный репозиторий на GitHub (Push the changes to the remote repository on GitHub):
git push

Примечание об аутентификации (Note on Authentication):
Когда вы выполняете git push, WebIDE автоматически предложит вам пройти аутентификацию. Следуйте этим подробным шагам:

  1. Появится всплывающее окно с сообщением: "The extension 'GitHub' wants to sign in using GitHub." Нажмите Allow.
  2. Появится новое уведомление. Нажмите "Copy&Continue to GitHub", затем нажмите "Open" в следующем запросе.
  3. Войдите в свою учетную запись GitHub в открывшемся окне браузера и введите скопированный код авторизации. После подтверждения авторизации страница закроется автоматически.
  4. Подождите несколько секунд, и вы увидите, что терминал успешно завершил операцию пуша.

Примечание о конфиденциальности (Privacy Note): WebIDE запросит полный доступ к вашей учетной записи GitHub для целей аутентификации. Вам не нужно беспокоиться о проблемах конфиденциальности — виртуальная машина LabEx будет немедленно уничтожена после завершения текущей лабораторной работы, и ваши учетные данные и информация об авторизации не будут сохранены.

Этот процесс аутентификации не требует ручной настройки имени пользователя или Personal Access Token.

Проверка на GitHub (Verify on GitHub)

  1. Посетите свой репозиторий на GitHub в веб-браузере.
  2. Нажмите на вкладку Actions.
  3. Нажмите на последний запуск рабочего процесса (workflow run).
  4. На левой боковой панели (или в основном представлении графа) вы теперь увидите три отдельных задания (jobs), перечисленных в группе build:
    • build (18)
    • build (20)
    • build (22)
  5. Они будут выполняться параллельно (или почти параллельно). Вы можете нажать на каждое из них, чтобы увидеть, что шаг Use Node.js настроил запрошенную конкретную версию.
GitHub Actions matrix builds

Резюме

В этой лабораторной работе вы узнали, как использовать Стратегию Матрицы (Matrix Strategy) в GitHub Actions. Вы:

  1. Определили матрицу с несколькими версиями Node.js, используя strategy: matrix.
  2. Обновили шаги рабочего процесса для динамического использования версии из контекста матрицы (${{ matrix.node-version }}).
  3. Обеспечили уникальность имен артефактов для каждого задания матрицы.

Эта мощная функция позволяет вам проверять ваш проект на соответствие широкому спектру конфигураций с минимальным дублированием кода.