21. Переезд на собственную инфраструктуру Python - qa-guru/knowledge-base GitHub Wiki

В этом руководстве описано, как собрать собственный тестовый стенд, который используется для обучения в школе QA GURU. Для работы понадобится Docker, Selenoid, Jenkins, командная строка и любой редактор кода.

Шаги для работы с ssh ключами (данные шаги не обязательны если это ваш личный сервер и работаете только вы с ним)

Нажать, чтобы раскрыть
  1. Необходимо проверить есть ли ssh-ключи в директории .ssh с помощью команды ls -l ~/.ssh | grep id_rsa.

  1. Если ssh-ключей нет, то их можно сгенерировать с помощью команды ssh-keygen -t rsa -b 4096 -C 'ваш email'(как пример ssh-keygen -t rsa -b 4096 -C [email protected]). После ввода команды и нажатия Enter, вам будет предложено ввести путь к файлу, куда сохранить ключ. По умолчанию это ~/.ssh/id_rsa. Нажмите Enter, чтобы сохранить ключ в этом месте. Далее вам будет предложено ввести пароль для ключа(тут необходимо вводить пароль если это секьюрные данные и где ключ будете не только вы использовать). Повторите ввод пароль((тут необходимо вводить пароль если это секьюрные данные и где ключ будете не только вы использовать)) и нажмите Enter. После этого ключ будет сгенерирован. Для всех шагов можно нажать просто Enter, чтобы использовать значения по умолчанию. После создания ключей их можно увидеть в папке ~/.ssh с помощью команды ls -l ~/.ssh | grep id_rsa.

  1. Необходимо проверить работает ли ssh-agent с помощью команды eval $(ssh-agent -s). Если ssh-agent не работает, то его можно запустить с помощью команды ssh-agent bash.

Далее необходимо добавить ключи в ssh-agent с помощью команды ssh-add ~/.ssh/id_rsa.

Первичная настройка удалённого сервера

Первым делом необходимо изменить пароль сервера с помощью команды passwd. Далее обновляем данные репозиториев. Вводим команду apt update && apt upgrade -y.

Теперь установим утилиту Midnight Commander с помощью команды apt instal mc -y. Запустить её можно с помощью команды mc. Далее проверяем какой интерпретатор команд используется с помощью команды echo $0. Если используется интерпретатор sh, то его можно поменять на bash с помощью команды chsh -s /usr/bin/bash.

Установка Java и переменной JAVA_HOME

Для работы Jenkins необходима Java. Установить её можно с помощью команды sudo apt-get install openjdk-21-jdk -y. В данной команде будет установлена версия 21. Для проверки версии Java можно ввести команду java -version.

Теперь необходимо добавить переменную JAVA_HOME. Для начала проверяем если она уже установлена с помощью команды echo $JAVA_HOME. Если переменной нет, то её можно добавить. Проверяем, где находится бинарник Java. По умолчанию все бинарники находятся в папке /usr/lib/jvm/. Проверить можно с помощью команды ls /usr/lib/jvm/. Как пример для Java 21 путь будет /usr/lib/jvm/java-21-openjdk-amd64/. Добавить переменную нужно в etc/environment. Для этого вводим nano /etc/environment и добавляем строку JAVA_HOME="/usr/lib/jvm/java-21-openjdk-amd64/". После этого сохраняем изменения(Ctrl+S, Ctrl+X), и в терминале вводим команду source /etc/environment.

Проверяем что переменная добавлена с помощью команды echo $JAVA_HOME.

Установка Docker

Docker можно установить с помощью скрипта curl -sSL https://get.docker.com -o get-docker.sh. Если у вас не установлен curl, то его можно установить с помощью команды apt install curl -y.

Далее делаем файл исполняемым с помощью команды chmod +x get-docker.sh. Запускаем скрипт с помощью команды ./get-docker.sh. После установки Docker проверяем что всё установилось, а именно вводим команду docker --version и потом docker compose version и в ответ должны получить версии установленных программ.

Создаём директории и yml файл

Теперь необходимо создать директории.

  1. Переходим в папку opt с помощью команды cd /opt.
  2. Создаём папку testbed с помощью команды mkdir testbed.
  3. Переходим в папку testbed с помощью команды cd testbed.
  4. Создаём папку work с помощью команды mkdir work.
  5. Создаём папку image с помощью команды mkdir image.
  6. Создаём папку init с помощью команды mkdir init.
  7. Переходим в папку init с помощью команды cd /init. И создаём в ней папку selenoid с помощью команды mkdir selenoid.
  8. Возвращаемся в папку testbed с помощью команды cd /opt/testbed или cd ...
  9. Создаём файл docker-compose.yml с помощью команды touch docker-compose.yml или же сразу открыть файл для редактирования nano docker-compose.yml (после сохранения файл создастся автоматически).

Или создание папок можно сделать с помощью утилиты Midnight Commander, которую мы уже установили. Дерево директорий в итоге должно выглядеть следующим образом:

opt/
├─ testbed/
│  ├─ work/
│  ├─ image/
│  │    ├─ Dockerfile
│  ├─ docker-compose.yml
│  ├─ init/
│  │    ├─ selenoid/

Добавляем конфигурацию Jenkins и запускаем

В файлеdocker-compose.yml прописываем конфигурацию Jenkins:

version: '3.4'

services:
  jenkins:
    user: root
    restart: always
    image: jenkins/jenkins:lts
#    build:
#      context: ./image

    volumes:
      - ${PWD}/work/jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8888:8080
    network_mode: bridge
    environment:
      - ALLURE_NO_ANALYTICS=1

Находясь в директории testbed запускаем команду docker compose up -d. Если старт произошел успешно, то будет отображено следующее:

Далее необходимо ввести команду docker compose logs jenkins. И После этого в терминале будет отображен пароль, который нужно скопировать.

После этого можно перейти в браузере по адресу http:/ip-address-вашего сервера:8888 и увидеть окно Jenkins. Где в поле Administrator password вводим скопированный ранее пароль и нажимаем Continue.

На следующем этапе можно выбрать установку плагинов по умолчанию или же установить их вручную. Для начала можно установить рекомендованные плагины. Для этого нажимаем Install suggested plugins.

После установки плагинов будет отображено окно создания пользователя. Заполняем поля и нажимаем Save and Continue.

В окне Instance Configuration можно оставить всё по умолчанию и нажать Save and Finish.

В окне Jenkins is ready нажимаем Start using Jenkins.

Добавляем плагин Allure Report

Для работы с Jenkins необходимо установить плагин Allure Report. Для этого переходим в Manage Jenkins -> Manage Plugins -> Available и в поиске вводим Allure Report. Устанавливаем плагин.

Если установка прошла успешно, то будет отображено следующее:

Повторяем действия для установки плагина Text File Operations и Post build task.

Настройка Jenkins

Добавляем переменную JAVA_HOME

Для начала необходимо добавить переменную JAVA_HOME. Для этого переходим в Manage Jenkins -> Tools -> JDK installations и кликаем на кнопку Add JDK.

В строку JAVA_HOME добавляем переменную $JAVA_HOME, а в строку Name пишем jdk21. После этого нажимаем Save.

Добавляем allurecommandline

Чтобы добавить allurecommandline переходим в Manage Jenkins -> Tools -> Allure Commandline installations и кликаем на кнопку Add Allure Commandline installation. В поле Name пишем allurecommandline. После этого нажимаем Save.

Создание образа с помощью Dockerfile и установка Python

Создаём файл Dockerfile в папке image с помощью команды nano image/Dockerfile. В файле прописываем следующее:

FROM jenkins/jenkins:lts

USER root
RUN apt-get update && apt-get upgrade -y && apt-get install -y python3 python3-pip python3-venv && apt-get install -y rsync
RUN python3 -m venv /venv
RUN . /venv/bin/activate && pip install --upgrade pip && pip install pytest allure-pytest 'selene>=2.0.0rc9' 'python-dotenv==1.0.1'

USER jenkins

После этого сохраняем файл(Ctrl+S, Ctrl+X) и переходим в папку testbed с помощью команды cd /opt/testbed.

Далее необходимо остановить контейнер Jenkins с помощью команды docker compose down.

Далее открываем файл docker-compose.yml с помощью команды nano docker-compose.yml и изменяем строчку с image: jenkins/jenkins:lts на build: ./image. Пример как должен выглядеть файл docker-compose.yml:

version: '3.4'

services:
  jenkins:
    user: root
    restart: always
    # image: jenkins/jenkins:lts
    build:
      context: ./image

    volumes:
      - ${PWD}/work/jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8888:8080
    network_mode: bridge
    environment:
      - ALLURE_NO_ANALYTICS=1

Сохраняем файл(Ctrl+S, Ctrl+X) и запускаем контейнер Jenkins с помощью команды docker compose up -d.

Если всё прошло успешно, то в терминале будет отображено следующее:

Создание виртуального окружения и активация его в Jenkins

Создание и активация виртуального окружения происходит командой

python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt

Добавляем Selenoid

Для начала необходимо остановить контейнер Jenkins с помощью команды docker compose down.

Далее добавляем Selenoid в файл docker-compose.yml:

Нажать, чтобы раскрыть
  selenoid:
    image: aerokube/selenoid:latest-release
    volumes:
      - "${PWD}/init/selenoid:/etc/selenoid"
      - "${PWD}/work/selenoid/video:/opt/selenoid/video"
      - "${PWD}/work/selenoid/logs:/opt/selenoid/logs"
      - "/var/run/docker.sock:/var/run/docker.sock"
    environment:
      - OVERRIDE_VIDEO_OUTPUT_DIR=/opt/testbed/work/selenoid/video
    command:
      [
        "-conf",
        "/etc/selenoid/browsers.json",
        "-video-output-dir",
        "/opt/selenoid/video",
        "-log-output-dir",
        "/opt/selenoid/logs"
      ]
    ports:
      - "4444:4444"
    network_mode: bridge

  selenoid-ui:
    image: "aerokube/selenoid-ui:latest-release"
    network_mode: bridge
    links:
      - selenoid
    ports:
      - "8080:8080"
    command: [ "--selenoid-uri", "http://selenoid:4444" ]

Полностью файл docker-compose.yml должен выглядеть следующим образом:

Нажать, чтобы раскрыть
version: '3.4'

services:
  jenkins:
    user: root
    restart: always
    # image: jenkins/jenkins:lts
    build:
      context: ./image

    volumes:
      - ${PWD}/work/jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8888:8080
    network_mode: bridge
    environment:
      - ALLURE_NO_ANALYTICS=1

  selenoid:
    image: aerokube/selenoid:latest-release
    volumes:
      - "${PWD}/init/selenoid:/etc/selenoid"
      - "${PWD}/work/selenoid/video:/opt/selenoid/video"
      - "${PWD}/work/selenoid/logs:/opt/selenoid/logs"
      - "/var/run/docker.sock:/var/run/docker.sock"
    environment:
      - OVERRIDE_VIDEO_OUTPUT_DIR=/opt/testbed/work/selenoid/video
    command:
      [
        "-conf",
        "/etc/selenoid/browsers.json",
        "-video-output-dir",
        "/opt/selenoid/video",
        "-log-output-dir",
        "/opt/selenoid/logs"
      ]
    ports:
      - "4444:4444"
    network_mode: bridge

  selenoid-ui:
    image: "aerokube/selenoid-ui:latest-release"
    network_mode: bridge
    links:
      - selenoid
    ports:
      - "8080:8080"
    command: [ "--selenoid-uri", "http://selenoid:4444" ]

Добавляем браузеры

Переходим в папку init/selenoid с помощью команды cd /opt/testbed/init/selenoid. Создаём файл browsers.json с помощью команды nano browsers.json и добавляем следующий код:

Нажать, чтобы раскрыть
{
  "chrome": {
    "default": "123.0",
    "versions": {
      "123.0": {
        "image": "selenoid/vnc_chrome:123.0",
        "port": "4444",
        "path": "/"
      },
      "122.0": {
        "image": "selenoid/vnc_chrome:122.0",
        "port": "4444",
        "path": "/"
      }
    }
  },
  "firefox": {
    "default": "124.0",
    "versions": {
      "124.0": {
        "image": "selenoid/vnc_firefox:124.0",
        "port": "4444",
        "path": "/wd/hub"
      },
      "123.0": {
        "image": "selenoid/vnc_firefox:123.0",
        "port": "4444",
        "path": "/wd/hub"
      }
    }
  },
  "opera": {
    "default": "109.0",
    "versions": {
      "109.0": {
        "image": "selenoid/vnc_opera:109.0",
        "port": "4444",
        "path": "/"
      },
      "108.0": {
        "image": "selenoid/vnc_opera:108.0",
        "port": "4444",
        "path": "/"
      }
    }
  },
  "MicrosoftEdge": {
    "default": "123.0",
    "versions": {
      "123.0": {
        "image": "browsers/edge:123.0",
        "port": "4444",
        "path": "/"
      },
      "122.0": {
        "image": "browsers/edge:122.0",
        "port": "4444",
        "path": "/"
      }
    }
  }
}

Сохраняем файл(Ctrl+S, Ctrl+X) и переходим в папку testbed с помощью команды cd /opt/testbed. Выше представлен пример для браузеров Chrome, Firefox, Opera и Microsoft Edge. Для каждого браузера указаны версии и пути к образам. Если необходимо добавить другие браузеры или версии браузеров, то можно воспользоваться официальной документацией.

Скачиваем образы браузеров указанных в файле browsers.json

Все образы браузеров можно найти на Docker Hub. Как пример для браузеров Chrome ссылка на образы будет следующей: ссылка

Для скачивания образов браузеров Chrome, Firefox, Opera и Microsoft Edge необходимо ввести команды:

docker pull selenoid/vnc_chrome:123.0 && docker pull selenoid/vnc_chrome:122.0 && docker pull selenoid/vnc_firefox:124.0 && docker pull selenoid/vnc_firefox:123.0 && docker pull selenoid/vnc_opera:109.0 && docker pull selenoid/vnc_opera:108.0 && docker pull browsers/edge:123.0 && docker pull browsers/edge:122.0

Данные в команде указаны для примера. Если в файле browsers.json указаны другие версии браузеров, то необходимо указать их в команде.

Добавляем отображение видео на Selenoid

Для того чтобы видео отображалось в Selenoid необходимо ввести команду docker pull selenoid/video-recorder:latest-release.

Запуск Selenoid и Jenkins контейнеров

После того как все образы браузеров скачаны, можно запустить Selenoid с помощью команды docker compose up -d.

Если всё прошло успешно, то в терминале будет отображено следующее:

Далее переходим в браузере по адресу http://ip-address-вашего сервера:8080 и увидим окно Selenoid UI.

Если в верней части в SSE и в SELENOID отображается connected, то Selenoid работает корректно.

Также можно попробовать запустить в ручном режиме браузер, для этого необходимо перейти на вкладку CAPABILITIES и выбрать браузер и версию браузера в выпадающем списке. После этого нажать кнопку CREATE SESSION.

Работа с контейнерами и образами

Как зайти в контейнер

Для начала нужно узнать id контейнера с помощью команды docker ps. После этого вводим команду docker exec -it id_контейнера sh .

Как посмотреть список контейнеров

Для просмотра списка контейнеров необходимо ввести команду docker ps.

Как перезапустить контейнер

Для перезапуска контейнера необходимо ввести команду docker restart id_контейнера.

Как остановить контейнер

Для остановки контейнера необходимо ввести команду docker stop id_контейнера.

Как удалить контейнер

Для удаления контейнера необходимо ввести команду я или же docker rm -f id_контейнера.

Как посмотреть список скачанных образов

Для просмотра списка образов необходимо ввести команду docker images.

Как удалить образ

Для удаления образа необходимо ввести команду docker rmi id_образа или же docker rmi -f id_образа.

⚠️ **GitHub.com Fallback** ⚠️