Jenkins

Jenkins представляет собой мощную систему непрерывной интеграции (CI), позволяющую автоматизировать сборку, тестирование и деплой приложений. В контексте тестирования с Puppeteer, Jenkins используется для организации автоматического запуска тестов в контролируемой среде, что обеспечивает стабильность и повторяемость тестирования.


Настройка Jenkins для Puppeteer

1. Установка Jenkins Для работы с Puppeteer требуется последняя стабильная версия Jenkins. Рекомендуется использовать установку через официальные пакеты для выбранной операционной системы или Docker-образ Jenkins, что упрощает управление зависимостями.

2. Конфигурация среды Node.js Puppeteer работает поверх Node.js, поэтому необходимо установить Node.js на Jenkins-агент:

  • В разделе Manage Jenkins → Global Tool Configuration → NodeJS добавляется новая установка Node.js.
  • Определяется версия Node.js, совместимая с текущей версией Puppeteer.
  • Включается автоматическая установка npm, если она отсутствует.

3. Настройка репозитория проекта Jenkins может получать исходный код из Git, GitHub, GitLab или Bitbucket. Важно правильно настроить ветку и методы аутентификации, чтобы Jenkins имел доступ к проекту.


Создание Jenkins Pipeline для Puppeteer

Использование Pipeline позволяет создавать гибкие сценарии выполнения тестов. Структура Pipeline для Puppeteer обычно включает следующие шаги:

pipeline {
    agent any

    environment {
        NODE_ENV = &
    }

    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/username/project.git'
            }
        }

        stage('Install Dependencies') {
            steps {
                sh 'npm install'
            }
        }

        stage('Run Puppeteer Tests') {
            steps {
                sh 'npx jest puppeteer'
            }
        }
    }

    post {
        always {
            archiveArtifacts artifacts: 'test-results/**/*.xml', allowEmptyArchive: true
            junit 'test-results/**/*.xml'
        }
    }
}

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

  • agent any позволяет запускать Pipeline на любом доступном агенте.
  • environment устанавливает переменные среды, которые могут понадобиться для тестов.
  • post блок обрабатывает результаты тестов и сохраняет артефакты.

Запуск Puppeteer в безголовом режиме на сервере

Puppeteer по умолчанию использует Chromium, который требует графического окружения. На сервере Jenkins часто отсутствует GUI, поэтому необходимо включать headless режим:

const browser = await puppeteer.launch({
    headless: true,
    args: ['--no-sandbox', '--disable-setuid-sandbox']
});

Пояснение аргументов:

  • –no-sandbox отключает режим песочницы, необходимый для некоторых CI-сред.
  • –disable-setuid-sandbox предотвращает ошибки запуска Chromium в ограниченной среде.

Сбор результатов и интеграция с Jenkins

Для корректной интеграции с Jenkins необходимо сохранять результаты тестов в формате, который понимает Jenkins, например, JUnit XML. Puppeteer часто используется вместе с Jest, который может генерировать XML-отчеты:

"jest": {
    "preset": "jest-puppeteer",
    "testResultsProcessor": "jest-junit"
}

После выполнения тестов Jenkins автоматически собирает артефакты и отображает результаты в виде графиков и детальных логов.


Работа с параллельными тестами

Для ускорения тестирования Puppeteer поддерживает запуск нескольких экземпляров браузера одновременно. В Jenkins это реализуется через параллельные стадии Pipeline:

stage('Parallel Tests') {
    parallel {
        stage('Test Suite 1') {
            steps {
                sh 'npx jest puppeteer/testSuite1'
            }
        }
        stage('Test Suite 2') {
            steps {
                sh 'npx jest puppeteer/testSuite2'
            }
        }
    }
}

Параллельное выполнение позволяет значительно сократить время CI-процесса, особенно при большом количестве UI-тестов.


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

Запуск Puppeteer в Docker-контейнерах обеспечивает изоляцию и воспроизводимость. Образ должен содержать Node.js, Chromium и необходимые зависимости:

FROM node:20-bullseye

RUN apt-get update && apt-get install -y \
    wget \
    ca-certificates \
    fonts-liberation \
    libappindicator3-1 \
    libasound2 \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libcups2 \
    libdbus-1-3 \
    libx11-xcb1 \
    libxcomposite1 \
    libxdamage1 \
    libxrandr2 \
    xdg-utils \
    --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npx", "jest", "puppeteer"]

Такой подход гарантирует одинаковое выполнение тестов на локальной машине и в Jenkins.


Логирование и отладка

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

await page.screenshot({ path: 'screenshots/test.png', fullPage: true });
await page.video().save('videos/test.mp4');

Эти файлы затем архивируются Jenkins и позволяют быстро выявлять проблемы UI.


Планирование и триггеры

Jenkins позволяет запускать тесты на основе событий:

  • По коммиту в репозиторий (webhook).
  • По расписанию (CRON) для nightly builds.
  • По успешной сборке других проектов, обеспечивая интеграционное тестирование.

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


Мониторинг стабильности тестов

Использование Jenkins позволяет собирать статистику по стабильности Puppeteer-тестов:

  • Отслеживание флейков (случайных падений тестов).
  • Сравнение времени выполнения различных тестовых наборов.
  • Анализ повторяемости ошибок для оценки качества UI.

Puppeteer в связке с Jenkins обеспечивает надежное и повторяемое тестирование пользовательского интерфейса, поддерживая полную автоматизацию CI/CD процессов.