Как использовать GitHub Actions для создания рабочих процессов для CI?

Завершено

Здесь вы узнаете о действиях и рабочих процессах GitHub для CI.

Вы узнаете, как:

  • Создание рабочего процесса из шаблона
  • Общие сведения о журналах GitHub Actions
  • Тестирование с несколькими целевыми объектами
  • Отдельные задания сборки и тестирования
  • Сохранение и доступ к артефактам сборки
  • Автоматизация маркировки PR во время проверки

Создание рабочего процесса из шаблона

Чтобы создать рабочий процесс, начните с шаблона. Шаблон содержит общие задания и шаги, предварительно настроенные для конкретного типа автоматизации, которую вы реализуете. Если вы не знакомы с рабочими процессами, заданиями и шагами, ознакомьтесь с Автоматизация задач разработки с помощью модуля GitHub Actions.

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

На странице "Выбор рабочего процесса" вы можете выбрать из множества различных шаблонов. Одним из примеров является шаблон Node.js, который выполняет чистую установку зависимостей узлов, создает исходный код и выполняет тесты для разных версий Node. Другим примером является шаблон пакета Python, который устанавливает зависимости Python и выполняет тесты, включая lint, в разных версиях Python.

В поле поиска введите Node.js.

снимок экрана: вкладка

В результатах поиска в области Node.js выберите Настроить.

снимок экрана с вкладкой

Этот рабочий процесс шаблона по умолчанию Node.js отображается в только что созданном файле node.js.yml.

name: Node.js CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x, 16.x, 18.x]

    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

Обратите внимание на атрибут on:. Этот рабочий процесс активируется при отправке изменений в репозиторий и при создании pull request против основной ветви.

В этом рабочем процессе есть один job. Давайте рассмотрим, что это делает.

Атрибут runs-on: указывает, что для операционной системы рабочий процесс выполняется на ubuntu-latest. Атрибут node-version: указывает, что существует три сборки, по одному для Node версии 14.x, 16.x и 18.x. Мы описываем часть matrix подробно позже, при настройке рабочего процесса.

steps в задании используется действие GitHub Actions actions/checkout@v3, чтобы получить код из вашего репозитория на виртуальную машину, а также действие actions/setup-node@v3, чтобы настроить правильную версию Node.js. Мы указываем, что мы собираемся протестировать три версии Node.js с помощью атрибута ${{ matrix.node-version }}. Этот атрибут ссылается на матрицу, которая была определена ранее. Атрибут cache указывает диспетчер пакетов для кэширования в каталоге по умолчанию.

Последняя часть этого шага выполняет команды, используемые проектами Node.js. Команда npm ci устанавливает зависимости из файла package-lock.json, npm run build --if-present запускает скрипт сборки, если он существует, и npm test запускает платформу тестирования. Обратите внимание, что этот шаблон включает как этапы сборки, так и тестовые действия в одном задании.

Дополнительные сведения о npm см. в документации по npm:

Журналы действий для сборки

При запуске рабочего процесса создается журнал, содержащий сведения о том, что произошло, и все ошибки или тестовые сбои.

Если ошибка или сбой теста, в журналах отображается красный ✖, а не зеленый флажок ✔. Вы можете изучить сведения об ошибке или сбое, чтобы изучить то, что произошло.

 журнал действий GitHub Actions с подробными сведениями о неудачном тесте.

В упражнении вы определите неудачные тесты, проверив подробные сведения в журналах. Журналы можно получить на вкладке "Действия".

Настройка шаблонов рабочих процессов

В начале этого модуля мы описали сценарий, в котором необходимо настроить CI для своей команды. Шаблон Node.js является отличным началом, но вы хотите настроить его, чтобы лучше соответствовать требованиям вашей команды. Вы хотите нацелиться на разные версии Node и разные операционные системы. Вы также хотите, чтобы шаги сборки и тестирования были отдельными заданиями.

Давайте рассмотрим, как настроить рабочий процесс.

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest]
    node-version: [16.x, 18.x]

Здесь мы настроили матрицу сборки для тестирования в нескольких операционных системах и языковых версиях. Эта матрица создает четыре сборки, по одному для каждой операционной системы, в паре с каждой версией Node.

Четыре сборки, а также все их тесты, создают довольно много логов. Это может быть сложно разобраться во всём этом. В следующем примере показано, как переместить шаг теста в выделенное тестовое задание. Это задание тестирует несколько целевых объектов. Разделение шагов сборки и тестирования упрощает понимание журнала.

test:
  runs-on: ${{ matrix.os }}
  strategy:
    matrix:
      os: [ubuntu-latest, windows-latest]
      node-version: [16.x, 18.x]
  steps:
  - uses: actions/checkout@v3
  - name: Use Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v3
    with:
      node-version: ${{ matrix.node-version }}
  - name: npm install, and test
    run: |
      npm install
      npm test
    env:
      CI: true

Что такое артефакты?

Когда рабочий процесс создает что-то, отличное от записи журнала, продукт называется артефактом. Например, сборка Node.js создает контейнер Docker, который можно развернуть. Данный артефакт, то есть контейнер, может быть загружен в хранилище с помощью действия actions/upload-artifact, а затем скачан из хранилища с помощью действия actions/download-artifact.

Сохранение артефакта обеспечивает его сохранность между заданиями. Каждое задание использует свежий экземпляр виртуальной машины, поэтому вы не можете повторно использовать артефакт, сохраняя его на виртуальной машине. Если вам нужен артефакт в другом задании, вы можете передать артефакт в хранилище в одном задании и скачать его для другого задания.

Хранилище артефактов

Артефакты хранятся в хранилище на GitHub. Пространство свободно для общедоступных репозиториев, и некоторые суммы бесплатны для частных репозиториев, в зависимости от учетной записи. GitHub хранит артефакты в течение 90 дней.

В следующем фрагменте рабочего процесса обратите внимание, что в действии actions/upload-artifact@main есть атрибут path:. Значением этого атрибута является путь для хранения артефакта. Здесь мы указываем public/, чтобы загрузить все в каталог. Если нам просто нужно загрузить один файл, мы используем что-то вроде public/mytext.txt.

  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: npm install and build webpack
        run: |
          npm install
          npm run build
      - uses: actions/upload-artifact@main
        with:
          name: webpack artifacts
          path: public/

Чтобы скачать артефакт для тестирования, сборка должна успешно завершиться и артефакт должен быть загружен. В следующем коде мы указываем, что тестовое задание зависит от задания сборки.

test:
    needs: build
    runs-on: ubuntu-latest

В следующем фрагменте рабочего процесса мы скачиваем артефакт. Теперь тестовое задание может использовать артефакт для тестирования.

steps:
    - uses: actions/checkout@v3
    - uses: actions/download-artifact@main
      with:
        name: webpack artifacts
        path: public

Дополнительные сведения об использовании артефактов в рабочих процессах см. в разделе Хранение данных рабочего процесса в виде артефактов в документации по GitHub.

Автоматизация проверок в GitHub с помощью рабочих процессов

До сих пор мы описали запуск рабочего процесса с событиями GitHub, такими как push или pull request. Можно также запустить рабочий процесс по расписанию или на некоторых событиях за пределами GitHub.

Иногда мы хотим запустить рабочий процесс только после того, как пользователь выполняет действие. Например, мы хотим запустить рабочий процесс только после того, как рецензент утвердит запрос на вытягивание. В этом сценарии можно активировать pull-request-review.

Еще одним действием, которое можно предпринять, является добавление метки к запросу на слияние. В этом случае мы используем действие pullreminders/label-when-approved-action.

    steps:
     - name: Label when approved
       uses: pullreminders/label-when-approved-action@main
       env:
         APPROVALS: "1"
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         ADD_LABEL: "approved"

Обратите внимание, что блок называется env:. Этот блок определяет переменные среды для этого действия. Например, можно задать необходимое количество утверждающих. Вот один. Переменная аутентификации secrets.GITHUB_TOKEN необходима, поскольку действие должно внести изменения в ваш репозиторий, добавляя метку. Наконец, укажите имя добавляемой метки.

Добавление метки может быть событием, которое запускает другой рабочий процесс, например слияние. Мы осветим эту тему в следующем модуле по вопросу непрерывной доставки с помощью GitHub Actions.