- Железный сервер или виртуальная машина
- Приложение эмулятор терминала
- VSCode (текстовый редактор, правка удаленных файлов)
Пример делается на Ubuntu и в целом должен работать для debian линуксов.
Нормальный терминал и команды линукс работают в приложении GitBash, которое входит в состав Git for Windows.
Работаем с аутентификацией по паре публичный + приватный ключ.
Для Windows, например, запускаем git bash на локальной windows машине, для макос — терминал
В git bash проверяем, есть ли у нас папка .ssh и что в ней лежит
ls -l ~/.ssh | grep id_rsa
Если пусто, то ключей у нас нет. Если ключи есть то увидим, что в папке лежат id_rsa
, id_rsa.pub
Создадим пару ключей
ssh-keygen -t rsa -b 4096 -C `<[email protected]>`
<[email protected]>
замените на что-то свое. Это комментарий, который вам позволит понять, к чему относится этот ключ.
Проверим, работает ли у нас ssh агент
eval $(ssh-agent -s)
Должны увидеть Process ID (PID) агента.
Добавим ключи ssh агенту
ssh-add ~/.ssh/id_rsa
Теперь с ними можно работать.
Если это хостинг, то, как правило, есть вариант скопировать туда публичный ключ и он везде будет добавляться.
Если нет, то копируем наш ключ на удаленную машину:
ssh-copy-id root@host-address-or-IP
Зачем: немного сэкономить время на вводе команд, чтобы вместо ssh [email protected]
использовать ssh test-bed
.
Лейбл запомнить легче, чем IP адрес.
заходим в папку с файлами ssh и запускаем VSCode.
cd ~/.ssh
code .
если нет файла config, то создаем его, если есть — открываем
добавляем запись
Host test-bed
Hostname 192.168.1.10
User root
Port 22
Теперь к удаленному серверу можно подключиться набрав в терминале ssh test-bed
apt update && apt upgrade -y && apt install mc
echo $0
Если не устраивает та, что используется по умолчанию.
chsh -s /bin/bash
Самый ленивый способ — скриптом с сайта
curl -sSL https://get.docker.com | sh
Переходим в /opt, клонируем текущий репозиторий, переобзываем это дело
cd /opt
git clone https://github.com/cheshi-mantu/cm-jenkins-selenoid-python-testbed.git
mv cm-jenkins-selenoid-python-testbed test-bed
cd test-bed
./image/Dockerfile
Файл описывает, как нам надо поменять образ докера с дженкинсом, который мы хотим использовать.
Мы внутри добавляем питон, а также питоньи библиотеки.
./init/selenoid
Содержит файл browsers.json
с описанием образов браузеров (название, версия, ссылка на образ), которые будут использоваться селеноидом.
./work/jenkins
— рабочая папка дженкинса, куда будет происходить маппинг рабочих папок деженкинса внутри контейнера. Просто для удобства, чтобы иметь к ним доступ с локальной машины.
./work/selenoid
— рабочая папка селеноида, куда будет происходить маппинг рабочих папок селеноида внутри контейнера.Просто для удобства, чтобы иметь к ним доступ с локальной машины.
./docker-compose.yml
— описание сервисов и их настроек.
Т.к. мы хотим, чтоб образ с дженкинсом еще и позволял нам гонять питонские тесты без агентов с питоном, мы должны такой образ собрать прямо на месте. Это делается так:
Удаляем (комментируем ссылку на исходный образ)
#image: jenkins/jenkins:lts
добавляем директиву build
build:
context: ./image
Компоуз возьмет Dockerfile из папки ./image соберет новый образ и создаст контейнер на его основе.
Образы браузеров для Selenoid не скачиваются автоматически. Чтоб скачать те образы, которые мы захотели использовать на стенде (см. ./init/selenoid/browsers.json) надо их явно скачать, используя команду докера pull
.
Ну, и это можно сразу же автоматизировать
Создайте файл getchrome.sh
, сделайте его исполняемым chmod +x getchrome.sh
и добавьте туда такие строки:
CHROME_RELEASES="100 101 102"
for RELEASE in $CHROME_RELEASES
do
echo "Pulling chrome ${RELEASE}.0"
docker pull selenoid/vnc:chrome_${RELEASE}.0
done
docker compose up -d
После того, как деплой стартанул, проверяем состояние сервисов:
docker compose ps
Все сервисы должны быть в состоянии Running
Смотрим логи Jenkins
docker compose logs jenkins
В логах мы ищем что-то похожее:
jenkins_1 | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins_1 | Please use the following password to proceed to installation:
jenkins_1 |
jenkins_1 | 32d64223e62945fe8c4c1ed050360700
jenkins_1 |
jenkins_1 | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
jenkins_1 |
jenkins_1 | *************************************************************
jenkins_1 | *************************************************************
jenkins_1 | *************************************************************
Заходим на наш сервер в браузере, используя порт, указанный в настройках Jenkins в файле docker-compose.yml
services:
jenkins:
<snip>
ports:
- 8888:8080
<snip>
порт используется тот, что слева (слева — наружу, справа — тот, что внутри контейнера).
http://192.168.1.10:8888
И в открывшемся окне вводим пароль, который мы выудили в логах Jenkins.
В открывшемся окне выбираем установку "рекомендуемых" плагинов. Так будет быстрее, чем по одному выбирать из обширнго списка. Легче удалить ненужное потом.
Далее вводим (лучше не пропускать) данные нового администратора.
И в общем-то всё.
Jenkins готов к дальнейшей работе.
Зайти на http://<ip-address-or-server-name>
:4444/status
Ожидаем, что увидим JSON ответ от приложения со списком браузеров.
Зайти на http://<ip-address-or-server-name>
:8080
Ожидаем, что увидим браузеры, можно попробовать запустить контейнер с браузером
Не забыть, что нужно пробросить REMOTE_DRV
в переменной окружения.
pipeline {
agent any
stages {
stage('Hello') {
steps {
git branch: 'main', url: 'https://github.com/cheshi-mantu/cm-py-demoqa-remote-wdr.git'
}
}
stage('set-env') {
steps {
sh 'echo REMOTE_DRV=http://<IP_ADDR>:4444/wd/hub > .env'
}
}
stage('run-python-tests') {
steps {
catchError(buildResult: 'UNSTABLE', message: 'uh oh', stageResult: 'UNSTABLE') {
sh 'pytest tests --alluredir=allure-results'
}
}
}
stage('reporting') {
steps {
allure includeProperties: false, jdk: '', results: [[path: 'allure-results']]
}
}
}
}
pipeline {
agent any
stages {
stage('code checkout') {
steps {
git branch: 'main', url: 'https://github.com/cheshi-mantu/cm-py-demoqa-remote-wdr.git'
writeFile encoding: 'UTF-8', file: '.env', text: 'REMOTE_DRV=http://<IP_ADDR>:4444/wd/hub'
}
}
stage('running python tests') {
steps {
catchError(buildResult: 'UNSTABLE', message: 'uh-oh', stageResult: 'FAILURE') {
sh 'pytest tests --alluredir=allure-results'
}
}
}
stage('generate allure repport') {
steps {
allure includeProperties: false, jdk: '', results: [[path: 'allure-results']]
}
}
}
}
pipeline {
agent any
stages {
stage('Hello') {
steps {
git branch: 'alt-site', url: 'https://github.com/cheshi-mantu/cm-py-demoqa-remote-wdr.git'
}
}
stage('run-python-tests') {
steps {
withEnv(['REMOTE_DRV=http://<ADDRESS>:4444/wd/hub']) {
catchError(buildResult: 'UNSTABLE', message: 'uh oh', stageResult: 'UNSTABLE') {
sh 'pytest tests --alluredir=allure-results'
}
}
}
}
stage('reporting') {
steps {
allure includeProperties: false, jdk: '', results: [[path: 'allure-results']]
}
}
}
}