11. Jenkins. Создаем первую задачу и управляем параметрами Python - qa-guru/knowledge-base GitHub Wiki
Jenkins — система для обеспечения процесса непрерывной интеграции (CI) программного обеспечения. Jenkins написан на Java и у инструмента открытый исходный код.


Для создания новой задачи необходимо на главной странице(Dashboard) Jenkins кликнуть на кнопку New Item.

Далее указать её название и выбрать тип Freestyle project. Нажимаем OK.

Далее переходим во вкладку Configure.

Так как на сервере могут работать несколько агентов под разные задачи, то во время настройки задачи необходимо указать актуального Jenkins-агента. В нашем случае мы запускаем тесты на Python, поэтому переходим в настройки задачи, ставим галочку в поле Restrict where this project can be run и в поле Label Expression вводим python.

В блоке Source Code Management выбираем Git и в строку Repository URL вставляем ссылку на репозиторий.
Немного проскролив ниже к блоку Branches to build в поле ввода Branch Specifier указываем ветку, которую будем тестировать.
Важно! По умолчанию в поле
Branch Specifierуказана ветка*master, что означает, что Jenkins будет тестировать эту ветку. Если у вас веткаmainили любая другая, то необходимо указать ее заменив значение.

После этого необходимо добавить шаги сборки. Переходим к блоку Build Environment. В разделе Build Steps кликаем на Add build step и в выпадающем списке кликаем на Execute shell.

В появившемся поле вводим следующий скрипт для установки виртуального окружения и запуска тестов которые используют requirements.txt:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pytest .Если в проекте используется poetry, то скрипт будет выглядеть следующим образом:
python -m venv .venv
source .venv/bin/activate
pip install poetry
poetry install
pytest .Чтобы добавить Allure-отчёт переходим к блоку Post-build Actions, выбираем и кликаем на Add post-build action и в выпадающем списке кликаем на Allure Report. В поле Path проверяем, чтобы путь указывал на правильную директорию в проекте, а именно на allure-results.
Нажимаем Save для сохранения настроек.


Jenkins в паре с Allure позволяет автоматически запускать тесты и снабжать их подробными отчётами с различными аттачментами: логи, скриншоты, скринкасты, исходный код страницы и другое.
Для этого необходимо сперва добавить некоторые утилиты в код тестов. Для этого в директории utils в проекте создаем файл attach.py и пропишем в нём реализацию аттачментов:
import allure
from allure_commons.types import AttachmentType
# Скриншоты
def add_screenshot(browser):
png = browser.driver.get_screenshot_as_png()
allure.attach(body=png, name='screenshot', attachment_type=AttachmentType.PNG, extension='.png')
# логи
def add_logs(browser):
log = "".join(f'{text}\n' for text in browser.driver.get_log(log_type='browser'))
allure.attach(log, 'browser_logs', AttachmentType.TEXT, '.log')
# html-код страницы
def add_html(browser):
html = browser.driver.page_source
allure.attach(html, 'page_source', AttachmentType.HTML, '.html')В коде тестов можно вызывать эти функции для добавления необходимых аттачей. К примеру:
attach.add_html(browser)
attach.add_screenshot(browser)
attach.add_logs(browser)Для добавления Selenoid в проект переходим во вкладку Capabilities, выбираем Python и копируем код.

Далее код необходимо модернизировать:
options = Options()
selenoid_capabilities = {
"browserName": "chrome",
"browserVersion": "100.0",
"selenoid:options": {
"enableVNC": True,
"enableVideo": False
}
}
options.capabilities,update(selenoid_capabilities)
driver = webdriver.Remote(
command_executor=f"https://{selenoid_login}:{selenoid_pass}@{selenoid_url}/wd/hub",
options=options)
browser.config.driver = driverДля добавления видео заменим параметр enableVideo из кода выше на True:
options = Options()
selenoid_capabilities = {
"browserName": "chrome",
"browserVersion": "100.0",
"selenoid:options": {
"enableVNC": True,
"enableVideo": True
}
}
options.capabilities,update(selenoid_capabilities)
driver = webdriver.Remote(
command_executor=f"https://{selenoid_login}:{selenoid_pass}@{selenoid_url}/wd/hub",
options=options)
browser.config.driver = driverДалее в файле attach.py добавим соответствующую функцию:
# скринкаст
def add_video(browser):
video_url = f"{selenoid_url}/video/" + browser.driver.session_id + ".mp4"
html = "<html><body><video width='100%' height='100%' controls autoplay><source src='" \
+ video_url \
+ "' type='video/mp4'></video></body></html>"
allure.attach(html, 'video_' + browser.driver.session_id, AttachmentType.HTML, '.html')Добавить видео в коде теста можно следующим образом:
attach.add_video(browser)Для безопасного хранения конфиденциальной информации, такой как логины, пароли, ключи и т.д., в проекте создаем файл .env и прописываем в нем переменные:
SELENOID_LOGIN=login
SELENOID_PASS=password
SELENOID_URL=selenoid_urlВместо login, password и selenoid_url прописываем свои значения. Данный файл храниться в .gitignore и не попадает в репозиторий.
Для работы с переменными из файла .env в коде тестов устанавливаем библиотеку python-dotenv:
pip install python-dotenvВ файле conftest.py прописываем:
from dotenv import load_dotenv
import os
@pytest.fixture(scope="session", autouse=True)
def load_env():
load_dotenv()
selenoid_login = os.getenv("SELENOID_LOGIN")
selenoid_pass = os.getenv("SELENOID_PASS")
selenoid_url = os.getenv("SELENOID_URL")Для того чтобы Jenkins мог использовать переменные из файла .env необходимо их добавить в него.
Для этого в блоке Build Steps и кликаем на Add build step и в выпадающем списке кликаем на Create/Update Text File.

В появившемся окне в поле File Path вводим .env, а в поле Text File Content прописываем переменные из файла .env.
Обязательно указываем отметки в Create at Workspace и Overwrite file.
Важно! Блок с
.envвсегда должен быть выше блока сExecute shell. НажимаемSaveдля сохранения настроек.

Для добавления параметризации необходимо в блоке General поставить галочку в поле This project is parameterized и выбрать тип параметра.

Если выбрать параметр String Parameter то в поле Name вводим имя переменной, а в поле Default Value вводим значение переменной которое будет использоваться по умолчанию.

Если выбрать параметр Choice Parameter то в поле Name вводим имя переменной, а в поле Choices вводим значения переменной в столбик. А в поле Description вводим описание переменной.

При добавлении параметризации в команде запуска тестов необходимо указать переменные. Пример реализации если в коде указаны реализация парсера версии браузера и в jenkins реализуем выбор нужной версии:
pytest --browser_version=${BROWSER_VERSION}Если необходимо добавить несколько переменных, то в команде запуска тестов указываем их через пробел.
Если необходимо запустить определенную папку с тестами, то это можно реализовать следующим образом:

Команда запуска тестов будет выглядеть следующим образом:
pytest ${TESTS_TYPE}Если добавляются параметры, которые не влияют на запуск тестов или на конфигурацию, то изменять команду запуска не нужно.
Для изменения количества отображающихся билдов/прогонов тестов в блоке General ставим отметку Discard old builds. В поле Max # of builds to keep вводим количество отображаемых билдов/прогонов тестов.

Для добавления таймера для запуска тестов в блоке Build Triggers ставим отметку Build periodically. В поле Schedule вводим время запуска тестов.
Для этого можно использовать следующие команды:
Запускать тесты каждый день в 12:00:
H 12 * * *Запускать тесты каждый понедельник в 12:00:
H 12 * * 1Запускать тесты каждый час:
H * * * *
Для клонирования проекта необходимо перейти на главной странице(Dashboard) Jenkins кликнуть на кнопку New Item.
Указать имя для проекта. Проскролить ниже к блоку Copy from и в поле Name вводим имя проекта, который будем клонировать.
Из выпадающего списка выбираем проект, который будем клонировать. Нажимаем OK.
