Создание кастомного Docker образа

Playwright — это мощная библиотека для тестирования браузеров, позволяющая выполнять автоматизированные тесты на реальных браузерах. Однако для надежности тестов и унификации среды разработки, часто необходимо использовать Docker для изоляции и автоматизации процессов. Создание кастомного Docker образа для запуска тестов с Playwright позволит обеспечить стабильную и повторяемую среду для тестирования.

1. Подготовка исходной среды

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

Dockerfile — это текстовый файл, содержащий инструкции для сборки образа. Начнем с выбора базового образа. Для работы с Playwright требуется поддержка браузеров, таких как Chromium, Firefox и WebKit. Важно помнить, что Playwright требует наличия нескольких системных библиотек для корректной работы браузеров в контейнере.

2. Создание базового Dockerfile

# Используем официальный Node.js образ в качестве базового
FROM mcr.microsoft.com/playwright:v1.23.0-focal

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем package.json и package-lock.json для установки зависимостей
COPY package*.json ./

# Устанавливаем зависимости
RUN npm install

# Копируем проект в контейнер
COPY . .

# Открываем порт, на котором будут работать тесты
EXPOSE 3000

# Запуск тестов Playwright
CMD ["npm", "test"]

Объяснение:

  • Базовый образ mcr.microsoft.com/playwright:v1.23.0-focal уже включает все необходимые зависимости для работы с Playwright и поддерживает необходимые браузеры.
  • Команда WORKDIR /app создаёт рабочую директорию в контейнере.
  • Копирование package*.json и установка зависимостей с помощью npm install.
  • После установки зависимостей, проект копируется в контейнер командой COPY . ..
  • Открытие порта 3000 позволяет взаимодействовать с контейнером, если тесты требуют внешнего сервера.
  • Последней строкой задается команда для запуска тестов — в данном случае npm test.

3. Добавление зависимостей для тестирования

Для выполнения тестов на Playwright, требуется установить саму библиотеку Playwright и дополнительные инструменты, такие как тестовый фреймворк (например, Jest или Mocha). Важно использовать актуальные версии пакетов.

Пример содержания файла package.json:

{
  "name": "playwright-docker",
  "version": "1.0.0",
  "scripts": {
    "test": "playwright test"
  },
  "dependencies": {
    "playwright": "^1.23.0"
  },
  "devDependencies": {
    "jest": "^27.4.0"
  }
}

Команда playwright test будет запускать все тесты, определенные в проекте, используя библиотеку Playwright.

4. Построение и запуск Docker образа

После того как Dockerfile и проект настроены, можно создать Docker образ и запустить контейнер.

  1. Сборка Docker образа: Для сборки Docker образа используется команда:

    docker build -t playwright-image .

    Эта команда создаст образ с именем playwright-image из текущего контекста (точки). Важно удостовериться, что в корне проекта находятся все необходимые файлы, включая Dockerfile, package.json и тесты.

  2. Запуск контейнера: После сборки образа, контейнер можно запустить с помощью следующей команды:

    docker run -it --rm playwright-image

    Флаг -it позволяет взаимодействовать с контейнером в режиме терминала, а --rm автоматически удаляет контейнер после завершения его работы.

5. Обработка ошибок и устранение зависимостей

Когда тесты начинаются выполняться в Docker контейнере, важно учитывать несколько моментов:

  • Нехватка системных библиотек. Иногда контейнер может не иметь всех необходимых для работы браузеров системных библиотек. Это можно решить, добавив дополнительные команды в Dockerfile для их установки.
  • Ошибка с правами доступа. Docker может требовать дополнительных прав для доступа к системным ресурсам или файлам. В таких случаях помогает использование флагов для прав пользователя в Docker, например, USER и GROUP.

6. Оптимизация Dockerfile

Для ускорения сборки образа и уменьшения его размера, можно внести несколько изменений в Dockerfile:

  • Разделить установку зависимостей и копирование файлов. Таким образом, если зависимости не меняются, Docker будет использовать кешированные слои, а сборка будет быстрее.
  • Установить конкретные версии пакетов, чтобы избежать проблем с несовместимостью версий.
# Используем официальную версию Playwright
FROM mcr.microsoft.com/playwright:v1.23.0-focal

WORKDIR /app

# Копируем только package.json и package-lock.json
COPY package*.json ./

# Устанавливаем зависимости
RUN npm install

# Копируем остальные файлы
COPY . .

EXPOSE 3000

CMD ["npm", "test"]

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

7. Многоконтейнерная среда

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

Пример файла docker-compose.yml:

version: '3'

services:
  playwright:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    environment:
      - NODE_ENV=production
    networks:
      - playwright-network

networks:
  playwright-network:
    driver: bridge

Этот файл позволяет управлять несколькими контейнерами и их сетевыми настройками. Контейнер для тестов будет подключён к сети и доступен на порту 3000.

8. Использование кастомных Docker образов в CI/CD

Для интеграции с CI/CD пайплайнами (например, с GitLab CI, GitHub Actions или Jenkins), важно настроить правильную сборку и тестирование контейнера. В таких системах необходимо создать конфигурацию для автоматического деплоя Docker образа и его запуска.

Пример конфигурации для GitHub Actions:

name: Playwright Tests

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    services:
      docker:
        image: mcr.microsoft.com/playwright:v1.23.0-focal
        options: --privileged

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

    - name: Build Docker image
      run: docker build -t playwright-image .

    - name: Run tests
      run: docker run playwright-image

Эта конфигурация запускает Docker контейнер с тестами на Playwright в процессе CI. Важной частью является использование образа Playwright с флагом --privileged, чтобы контейнер мог использовать дополнительные возможности системы, требующие повышенных прав.

Заключение

Создание кастомного Docker образа для тестирования с Playwright позволяет разработчикам создавать изолированные, стабильные и предсказуемые тестовые среды, которые можно легко интегрировать в любой CI/CD процесс. Правильная настройка Dockerfile, управление зависимостями и учёт особенностей среды выполнения обеспечат успешное и надёжное тестирование с Playwright в контейнеризованных средах.