Запуск GUI автотестов в GitLab CI\CD с использованием Docker Selenium PyTest
Доброго времени всем.
Может у кого то был опыт по запуску автотестов на PyTest Selenium-standalone и docker в GitLab CI.
Заранее оговорюсь, что опыт по части devOps почти нулевой и буду признателен за конструктивные комментарии.
На данный момент что имеется:
- проект с автотестами (selenium pytest) на локале
- все успешно крутится на двух контейнерах (локал), где один - это официальный образ контейнера selenium/standalone-chrome, а второй собирается и коннектится к хосту.
Что не понятно:
- как раскрутить всю сборку внутри gitlab и корректно настроить пайплайн
Структура локального проекта: SELENIUM/
- .SELENIUM/pages/
- .SELENIUM/tests/
- .SELENIUM/venv/
- .SELENIUM/conftest.py
- .SELENIUM/docker-compose.yml
- .SELENIUM/Dockerfile
- .SELENIUM/requirements.txt
Схема запуска проста.
1. На локале раним официальный контейнер селениума:
- docker run -d -p 4444:4444 -p 7900:7900 --shm-size="2g" selenium/standalone-chrome:latest;
2. Через Docker-compose build размечаем оба контейнера именами, портами и объединяем их в одну сеть: ./docker-compose.yml
version: '3'
services:
selenium:
image: seleniarm/standalone-chromium:latest
ports:
- "4444:4444"
- "5901:5900"
- "7900:7900"
networks:
- mynetwork
autotest:
build:
context: .
ports:
- "4445:4444"
# - "5902:5900"
# - "7901:7900" # Прокинуть порт 4444 контейнера Selenium к порту 4445 контейнера автотестов
networks:
- mynetwork
networks:
mynetwork:
3. В самом Dockerfile описываем, что куда и как копировать, и выполнять: FROM python:3.11.0
- Устанавливаем docker-compose
RUN apt-get update && apt-get install -y docker-compose
- Создаем директорию для данных
RUN mkdir /selenium_automatization`
- Копируем все необходимые файлы и папки
COPY ./requirements.txt /selenium_automatization/app/
COPY ./tests /selenium_automatization/tests
COPY ./pages /selenium_automatization/pages
COPY ./imgMaterials /selenium_automatization/imgMaterials
COPY ./conftest.py /selenium_automatization/conftest.py
- Устанавливаем рабочую директорию внутри контейнера
WORKDIR /selenium_automatization
- Устанавливаем зависимости
RUN pip install --upgrade pip && pip install -r /selenium_automatization/app/requirements.txt
4. После всех манипуляций запускаем из терминала:
docker-compose down
(на всякий случай убили все контейнеры)docker-compose build
(собрали все контейнеры заново)docker-compose up -d
(стартанули контейнеры с флагом -d для ручного запуска)docker exec -it selenium_python_1 bash
(провалились внутрь контейнера с тестами)pytest
(запустили тесты, которые подключаются к хосту указанному в conftest.py)
5. Сам conftest.py если кому необходим:
from selenium import webdriver
import pytest
def pytest_addoption(parser):
parser.addoption("--browser", action="store", default="chrome", help="Specify the browser to use (chrome or firefox)")
@pytest.fixture()
def browser(request):
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
capabilities = {
"browserName": "chrome",
"browserVersion": "114.0",
"platformName": "linux",
"se:noVncPort": 7900,
}
# capabilities = DesiredCapabilities.CHROME.copy()
capabilities.update(capabilities)
browser = webdriver.Remote(
command_executor="http://selenium:4444/wd/hub",
options=options
)
browser.maximize_window()
browser.implicitly_wait(20)
yield browser
browser.quit()
6. Итог:
После всех вышеперечисленных манипуляций, вся инфраструктура заводится и начинается выполнение тестов
7. Суть вопроса: При попытке вылить все в GitLab столкнулся с массой вопросов и проблем
- для настройки пайплайна был создан .gitlab-ci-dev.yml в который расписал по стейджам джобы:
stages:
- build
- tests
build-selenium:
stage: build
only:
- main
tags:
- yc
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- echo $BUILD_IMAGE:$BUILD_TAG
- docker build . -t $BUILD_IMAGE:$BUILD_TAG -f Dockerfile
- docker push $BUILD_IMAGE:$BUILD_TAG
build-tests:
stage: build
only:
- main
tags:
- yc
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- echo $BUILD_IMAGE:$BUILD_TAG
- docker build . -t $BUILD_IMAGE:$BUILD_TAG-tests -f Dockerfile
- docker push $BUILD_IMAGE:$BUILD_TAG-tests
selenium_test:
stage: tests
only:
- main
when: manual
tags:
- yc
image: $BUILD_IMAGE:$BUILD_TAG-tests
script:
- pytest
Как итог, при попытке завести всю инфраструктуру по ssh не получается, в силу того, что основной контейнер для выполнения тестов, не может стартануть. Второй же (с копией тестов) стартует, но не может подключиться к первому.
Есть ощущение, что я что то упустил из вида, но не пойму что.
Большая просьба, кидать камнями по существу, т.к. повторюсь еще раз, опыта в данной сфере у меня почти что нет, но разобраться очень хочется.
Большое спасибо за внимание!