Конфигурация для GitHub Actions

GitHub Actions — это мощный инструмент для автоматизации процессов CI/CD, позволяющий запускать тесты, сборки и деплой прямо в репозитории. Использование Jest с GitHub Actions позволяет интегрировать тестирование в процесс разработки и улучшить качество кода за счет автоматической проверки.

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

Для того чтобы настроить тестирование с Jest в GitHub Actions, необходимо создать файл конфигурации рабочего процесса в вашем репозитории. Рабочий процесс представляет собой YAML-файл, который описывает действия, которые должны быть выполнены в ответ на события в репозитории (например, пуши, пул-реквесты). Эти файлы обычно размещаются в директории .github/workflows.

Пример минимальной конфигурации для запуска тестов с Jest:

name: Run Jest Tests

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Set up Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '16'

    - name: Install dependencies
      run: |
        npm install

    - name: Run tests with Jest
      run: |
        npm run test

Разбор файла конфигурации

  • name: Название рабочего процесса, которое будет отображаться в интерфейсе GitHub Actions.
  • on: Определяет события, при которых будет запускаться процесс. В данном случае это пуши и пул-реквесты в ветку main.
  • jobs: Рабочие задачи, которые выполняются в рамках этого процесса. В примере описан один job с именем test.
  • runs-on: Указывает на окружение, в котором будет выполняться job. В данном случае используется последняя версия Ubuntu.
  • steps: Перечень шагов, которые выполняются в процессе. Каждый шаг — это отдельная команда или действие.
  1. Checkout code: С помощью actions/checkout происходит клонирование репозитория в контейнер, в котором будет выполняться процесс.
  2. Set up Node.js: Используется действие actions/setup-node для установки нужной версии Node.js (в примере — версия 16).
  3. Install dependencies: Установка зависимостей с помощью команды npm install.
  4. Run tests with Jest: Выполнение тестов через команду npm run test, которая должна быть настроена в вашем проекте для запуска Jest.

Настройка окружения для тестов

GitHub Actions предоставляет несколько типов виртуальных окружений для запуска рабочих процессов. Для запуска тестов с Jest предпочтительно использовать последние версии Node.js и Ubuntu, так как они обеспечивают стабильность и совместимость с большинством пакетов.

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

    - name: Set up Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '16'
        cache: 'npm'

Это позволит кэшировать зависимости и ускорить выполнение тестов на последующих запусках.

Кэширование зависимостей

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

Добавление кэширования:

    - name: Cache node modules
      uses: actions/cache@v3
      with:
        path: node_modules
        key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-modules-
  • path: Указывает на директорию или файл, который будет кешироваться. В нашем случае это папка node_modules.
  • key: Уникальный ключ для кеша. Включение хеша файла package-lock.json гарантирует, что кеш будет обновляться при изменении зависимостей.
  • restore-keys: Позволяет указать альтернативные ключи для восстановления кеша в случае, если основной ключ не найден.

Параметры конфигурации Jest

Если тесты требуют специфической конфигурации для работы в GitHub Actions, можно использовать несколько параметров в конфигурации Jest:

  1. CI Mode: При запуске тестов в CI-окружении, Jest по умолчанию устанавливает переменную CI=true, что отключает интерактивные запросы и уведомления, такие как требование нажатия клавиш. Это важно для бесшовного процесса тестирования.
    - name: Run tests with Jest
      run: |
        CI=true npm run test
  1. Параметры покрытия тестов: Для отслеживания покрытия тестами можно использовать ключ --coverage. Важно, чтобы результаты покрытия выводились в формате, совместимом с GitHub Actions.
    - name: Run tests with coverage
      run: |
        npm run test -- --coverage
  1. Ожидание завершения всех тестов: Если в тестах есть асинхронные процессы, стоит убедиться, что все они завершены до того, как процесс выйдет. Jest по умолчанию ожидает завершения асинхронных операций, но в некоторых случаях требуется дополнительная настройка.

Отчеты о тестах

GitHub Actions поддерживает отображение отчётов о тестах, что позволяет анализировать результаты тестирования прямо в интерфейсе. Для этого можно использовать несколько подходов:

  • JUnit: Jest может генерировать отчеты в формате JUnit, который поддерживается GitHub Actions.

Для этого нужно установить соответствующий пакет:

npm install jest-junit --save-dev

И в package.json добавить настройку для Jest:

"jest": {
  "reporters": [
    "default",
    ["jest-junit", { "outputDirectory": "test-reports", "outputName": "jest-test-report.xml" }]
  ]
}

После этого можно будет добавить шаг для загрузки отчёта в процессе GitHub Actions:

    - name: Upload Jest test report
      uses: actions/upload-artifact@v3
      with:
        name: jest-test-report
        path: test-reports/jest-test-report.xml

Этот шаг загрузит отчёт в формате XML, который можно будет просматривать в интерфейсе GitHub Actions.

Логирование и уведомления

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

Пример добавления логирования в шаги:

    - name: Log test results
      run: |
        echo "Starting Jest tests..."
        CI=true npm run test
        echo "Jest tests completed."

Также можно интегрировать уведомления через Slack или email с помощью стандартных действий или через собственные вебхуки.

Использование Docker для изоляции среды

В некоторых случаях тесты могут требовать специфического окружения, которое не всегда удобно настраивать в стандартном контейнере GitHub Actions. В этом случае можно использовать Docker.

Пример конфигурации с Docker:

    jobs:
      test:
        runs-on: ubuntu-latest
        services:
          - name: docker:19.03.12
            options: --privileged
        steps:
          - name: Checkout code
            uses: actions/checkout@v3

          - name: Build Docker container
            run: docker build -t my-app .

          - name: Run Jest tests in Docker
            run: docker run --rm my-app npm run test

Здесь контейнер Docker собирается из вашего репозитория и используется для запуска тестов, что помогает создавать полностью изолированные и повторяемые тестовые среды.

Обработка ошибок

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

    - name: Run tests
      run: npm run test
      continue-on-error: false

Настройка continue-on-error: false гарантирует, что последующие шаги не будут выполняться, если тесты не пройдут успешно.

Заключение

Конфигурация Jest для GitHub Actions — это важный этап интеграции автоматических тестов в процесс CI/CD. Подходящая настройка окружения, кэширования зависимостей, отчётов и других аспектов помогает ускорить процесс тестирования и повысить его эффективность. GitHub Actions предоставляет гибкие возможности для автоматизации тестирования, позволяя минимизировать человеческий фактор и повышать качество кода на протяжении всего жизненного цикла разработки.