GitLab CI интеграция

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

Для запуска Protractor-тестов в GitLab CI требуется корректно настроенное окружение. В качестве базового контейнера обычно используют node:16 или новее, чтобы обеспечить совместимость с современными версиями Protractor и Selenium WebDriver. Также необходимо установить браузеры, используемые в тестах, чаще всего Chrome или Firefox, и их драйверы.

Пример фрагмента .gitlab-ci.yml для установки зависимостей и браузера:

image: node:16

stages:
  - test

before_script:
  - apt-get update
  - apt-get install -y unzip xvfb libxi6 libgconf-2-4 wget
  - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
  - dpkg -i google-chrome-stable_current_amd64.deb || apt-get -f install -y
  - npm ci

protractor_test:
  stage: test
  script:
    - Xvfb :99 -screen 0 1280x1024x24 &
    - export DISPLAY=:99
    - npx protractor protractor.conf.js

Ключевые моменты:

  • Использование Xvfb необходимо для запуска браузеров в headless-режиме на сервере CI, где отсутствует графическая оболочка.
  • npm ci предпочтительнее npm install в CI, так как обеспечивает воспроизводимость установленных версий зависимостей.
  • Установка Chrome и зависимостей для запуска тестов обязательна, иначе Protractor не сможет инициировать сессии WebDriver.

Конфигурация Protractor для CI

Файл protractor.conf.js требует отдельной настройки для непрерывной интеграции:

exports.config = {
  directConnect: true,
  framework: 'jasmine',
  specs: ['specs/**/*.spec.js'],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: ['--headless', '--no-sandbox', '--disable-gpu', '--window-size=1280,1024']
    }
  },
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 60000
  }
};

Важные моменты:

  • --no-sandbox требуется для корректного запуска Chrome в контейнерах Docker.
  • --headless позволяет запускать тесты без графического интерфейса.
  • Настройка defaultTimeoutInterval учитывает возможные задержки в CI, особенно при параллельных запусках.

Параллельный запуск тестов

Protractor поддерживает параллельное выполнение сценариев, что ускоряет тестирование на CI:

multiCapabilities: [
  {
    browserName: 'chrome',
    shardTestFiles: true,
    maxInstances: 3
  }
]

Пояснения:

  • shardTestFiles: true разделяет тесты между несколькими экземплярами браузера.
  • maxInstances контролирует количество одновременных браузеров, что важно для балансировки нагрузки на CI-агента.

Логирование и отчётность

Для анализа результатов в GitLab CI необходимо настроить вывод логов и интеграцию с отчётными форматами, например, JUnit:

const { SpecReporter } = require('jasmine-spec-reporter');
const jasmineReporters = require('jasmine-reporters');

exports.config = {
  onPrepare: () => {
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
    jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
      savePath: 'reports',
      consolidateAll: false
    }));
  }
};

Особенности:

  • JUnitXmlReporter позволяет GitLab CI собирать тестовые отчёты через встроенный функционал анализа артефактов.
  • Репортер SpecReporter улучшает читаемость логов в консоли CI.

Артефакты и кеширование

Для оптимизации сборок рекомендуется сохранять артефакты и кешировать зависимости:

cache:
  paths:
    - node_modules/

artifacts:
  when: always
  paths:
    - reports/
  • Кеширование node_modules ускоряет повторные сборки.
  • Сохранение папки reports позволяет GitLab CI отображать результаты тестов в интерфейсе.

Интеграция с пайплайнами

Тестовый этап Protractor обычно располагают после сборки и перед деплоем. Типовая структура пайплайна:

stages:
  - build
  - test
  - deploy

build_job:
  stage: build
  script:
    - npm ci
    - npm run build

test_job:
  stage: test
  script:
    - Xvfb :99 -screen 0 1280x1024x24 &
    - export DISPLAY=:99
    - npx protractor protractor.conf.js
  artifacts:
    paths:
      - reports/

deploy_job:
  stage: deploy
  script:
    - echo "Deploying application"
  only:
    - main

Это обеспечивает строгую последовательность: сборка → тестирование → деплой, с возможностью остановки пайплайна при падении тестов.

Советы по стабильности

  • Использовать фиксированные версии браузеров и WebDriver для предотвращения несовместимостей.
  • Включать таймауты ожидания элементов (browser.wait или ExpectedConditions) вместо статических sleep, особенно в CI, где задержки сети могут варьироваться.
  • Разделять интеграционные и e2e-тесты, чтобы сокращать время пайплайна и локализовать ошибки.

Эта конфигурация обеспечивает надёжный и воспроизводимый запуск Protractor-тестов в GitLab CI, интегрируя их в автоматизированные пайплайны и формируя читаемые отчёты для анализа результатов.