├── .gitignore ├── README.MD ├── docker-compose.yml ├── img ├── docker-general-settings.png ├── docker-settings-resources.png ├── linux-distro-start-terminal.png ├── selenoid-manual-session.png ├── selenoid-ui-main.png └── terminal_elevated.png └── init └── selenoid └── browsers.json /.gitignore: -------------------------------------------------------------------------------- 1 | work/ -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # Тестовый стенд через docker-compose и WSL 2 | 3 | ## WSL, активация, первичные настройки 4 | 5 | ### Установить windows terminal (можно это и не делать) 6 | 7 | [Установить Windows Terminal](https://www.microsoft.com/store/productId/9N0DX20HK701) 8 | 9 | Терминал позволяет открывать окна CMD, PowerShell, WSL-дистрибутивов, так что вполне может пригодиться. 10 | 11 | ### Активация WSL 12 | 13 | 1. Запустить терминал от имени администратора 14 | 1. Либо правая кнопка и далее так 15 | ![Terminal elevated right click](./img/terminal_elevated.png) 16 | 2. Либо открыть меню пуск и начать печатать "windowster..." или "ter.." и когда появится Windows Terminal нажать Ctrl+Shift+Enter. 17 | 2. Активация WSL: ```dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart``` 18 | 3. Активация функционала виртуальной машины: ```dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart```. 19 | 4. Перезагрузка. 20 | 5. Обновить ядро WSL для перехода на WSL2: 21 | 1. Скачать ``` https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi ``` 22 | 2. Установить. 23 | 6. Установить версию WSL2 по умолчанию. 24 | 1. В терминале: ``` wsl --set-default-version 2 ``` 25 | 7. Установить Linux distro 26 | 1. Зайти в Microsoft Store 27 | 2. В поиск вбить Linux 28 | 3. Выбрать дистро и установить 29 | 8. Посмотрим, что у нас установлено из WSL 30 | 1. В терминале: ```wsl --list --verbose``` 31 | 2. Примерный вывод в терминале: 32 | 33 | ``` 34 | PS C:\Users\username> wsl --list --verbose 35 | NAME STATE VERSION 36 | Ubuntu-20.04 Stopped 1 37 | Ubuntu-18.04 Stopped 2 38 | ``` 39 | 9. Конвертируем дистро первой версии во вторую (Ubuntu-20.04). 40 | 1. ```wsl --set-version Ubuntu-20.04 2``` 41 | 42 | ## Docker Desktop 43 | 44 | [На сайте докера скачиваем](https://www.docker.com/products/docker-desktop) установочный файл, запускаем. 45 | 46 | ### Настройки Docker 47 | 48 | #### Use the WSL2 based engine 49 | ![Use the WSL2 based engine](./img/docker-general-settings.png) 50 | 51 | #### Resourses 52 | ![Use the WSL2 based engine](./img/docker-settings-resources.png) 53 | 54 | С такими настройками докер будет работать внутри Linux дистро и дополнительно ничего устанавливать не потребуется. 55 | 56 | ## Работа с Linux distro 57 | 58 | ### Запуск 59 | 60 | Запускаем дистро из меню пуск или через терминал (картинка): 61 | 62 | ![Use the WSL2 based engine](./img/linux-distro-start-terminal.png) 63 | 64 | ### Первичные настройки 65 | 66 | 1. Задать пользователя (для локальных тестов можно покороче) 67 | 2. Задать пароль (для локальных тестов можно покороче) 68 | 69 | ### Ставим JDK 70 | 71 | Проверяем, есть ли у нас Java: 72 | 73 | ```java --version``` 74 | 75 | Терминал нам ответит что-то похожее на это, если Java не установлена: 76 | ``` 77 | user@qa-test-bed:~$ java --version 78 | Command 'java' not found, but can be installed with: 79 | sudo apt install default-jre 80 | sudo apt install openjdk-11-jre-headless 81 | sudo apt install openjdk-8-jre-headless 82 | ``` 83 | ### Обновляемся 84 | 85 | ```sudo apt-get update && sudo apt-get upgrade``` 86 | 87 | ### Устанавливаем JDK 88 | 89 | ```sudo apt-get install default-jdk``` 90 | 91 | Соглашаемся на установку и потом ждем, пока вся эта радость установится. 92 | 93 | Ещё раз проверяем версию Java: 94 | 95 | ```java --version``` 96 | 97 | ``` 98 | PS C:\Users\username> java --version 99 | java 11.0.7 2020-04-14 LTS 100 | Java(TM) SE Runtime Environment 18.9 (build 11.0.7+8-LTS) 101 | Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.7+8-LTS, mixed mode) 102 | ``` 103 | 104 | ### Прописываем переменную окружения JAVA_HOME (понадобится) 105 | 106 | Джава вероятнее всего установилась вот так: 107 | 108 | ```/usr/lib/jvm/java-11-openjdk-amd64``` в JAVA_HOME необходимо прописывать именно этот путь, который не включает папку `bin`. 109 | 110 | #### Редактируем файл с переменными окружения 111 | 112 | ```sudo nano /etc/environment``` 113 | 114 | добавляем на последнюю строку: 115 | 116 | ```JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64``` 117 | 118 | Нажимаем последовательно Ctrl+S (сохранить), Ctrl+X (выйти из редактора nano). 119 | 120 | #### Обновляем сведения о переменных окружения 121 | 122 | ```source /etc/environment``` 123 | 124 | #### Проверяем, прописалась ли переменная окружения 125 | 126 | ```echo $JAVA_HOME``` 127 | 128 | ``` 129 | username@pc:$ source /etc/environment 130 | username@pc:$ echo $JAVA_HOME 131 | /usr/lib/jvm/java-11-openjdk-amd64 132 | ``` 133 | Всё ок. 134 | 135 | ## Ставим все через docker-compose 136 | 137 | ### Selenoid 138 | 139 | Описано здесь: https://aerokube.com/selenoid/latest/#_selenoid_with_docker_compose 140 | 141 | #### Готовим конфиг для docker-compose 142 | 143 | В папке проекта создаем файл `docker-compose.yml` 144 | 145 | ```yaml 146 | version: '3.4' 147 | 148 | services: 149 | selenoid: 150 | image: aerokube/selenoid:latest-release 151 | volumes: 152 | - "${PWD}/init/selenoid:/etc/selenoid" 153 | - "${PWD}/work/selenoid/video:/opt/selenoid/video" 154 | - "${PWD}/work/selenoid/logs:/opt/selenoid/logs" 155 | - "/var/run/docker.sock:/var/run/docker.sock" 156 | environment: 157 | - OVERRIDE_VIDEO_OUTPUT_DIR=work/selenoid/video 158 | command: ["-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video", "-log-output-dir", "/opt/selenoid/logs"] 159 | ports: 160 | - "4444:4444" 161 | network_mode: bridge 162 | ``` 163 | 164 | ${PWD} - текущая директория 165 | 166 | `volumes` позволяет монтировать папки файловой системы локальной машины в контейнер. 167 | 168 | Для строки типа `"${PWD}/init/selenoid:/etc/selenoid"` слева от двоеточия находится папка, которая лежит на локальной машине (в Linux distro), справа — на файловой системе контейнера. 169 | 170 | ##### В папке проекта создаём подпапки 171 | - init/selenoid 172 | - work/selenoid/video 173 | - work/selenoid/logs 174 | 175 | #### Файлы внутри init/selenoid 176 | 177 | Создаём `browsers.json` 178 | 179 | ```json 180 | { 181 | "chrome": { 182 | "default": "88.0", 183 | "88.0": { 184 | "env" : ["LANG=ru_RU.UTF-8", "LANGUAGE=ru:en", "LC_ALL=ru_RU.UTF-8", "TZ=Europe/Moscow"], 185 | "image": "selenoid/vnc:chrome_88.0", 186 | "tmpfs": {"/tmp": "size=512m"}, 187 | "port": "4444" 188 | } 189 | } 190 | } 191 | } 192 | ``` 193 | #### Образы браузеров 194 | 195 | Образы браузеров необходимо скачивать самостоятельно. Для примера выше потребуется образ браузера `selenoid/vnc:chrome_88.0`, он скачивается следующим образом: 196 | 197 | ```bash 198 | docker pull selenoid/vnc:chrome_88.0 199 | ``` 200 | После этого, можно попробовать запустить то, что получилось. 201 | 202 | #### Запуск через docker-compose 203 | 204 | В папке проекта выполняем: 205 | 206 | ```bash 207 | docker-compose up 208 | ``` 209 | В консоли будет что-то вроде вот этого: 210 | 211 | ``` 212 | user@pc:/path/project$ docker-compose up 213 | Starting project_selenoid_1 ... done 214 | Attaching to project_selenoid_1 215 | selenoid_1 | 2021/03/03 20:33:19 [-] [INIT] [Loading configuration files...] 216 | selenoid_1 | 2021/03/03 20:33:19 [-] [INIT] [Loaded configuration from /etc/selenoid/browsers.json] 217 | selenoid_1 | 2021/03/03 20:33:19 [-] [INIT] [Video Dir: /opt/selenoid/video] 218 | selenoid_1 | 2021/03/03 20:33:19 [-] [INIT] [Logs Dir: /opt/selenoid/logs] 219 | selenoid_1 | 2021/03/03 20:33:19 [-] [INIT] [Your Docker API version is 1.41] 220 | selenoid_1 | 2021/03/03 20:33:19 [-] [INIT] [Timezone: UTC] 221 | selenoid_1 | 2021/03/03 20:33:19 [-] [INIT] [Listening on :4444] 222 | ``` 223 | 224 | В браузере заходим `http://your-ip-address:4444/status` 225 | 226 | Должна быть видна JSON строка `{"total":5,"used":0,"queued":0,"pending":0,"browsers":{"chrome":{"75.0":{},"76.0":{},"87.0":{},"88.0":{}}}}` 227 | 228 | Выключаем при помощи Ctrl+C, переходим к след. шагу. 229 | 230 | ### Selenoid UI 231 | 232 | Описано здесь: http://aerokube.com/selenoid-ui/latest/#_with_docker_compose 233 | 234 | Добавляем в файл `docker-compose.yml` необходимое для запуска selenoid-ui: 235 | 236 | ```yaml 237 | selenoid-ui: 238 | image: "aerokube/selenoid-ui:latest-release" 239 | network_mode: bridge 240 | links: 241 | - selenoid 242 | ports: 243 | - "8080:8080" 244 | command: ["--selenoid-uri", "http://selenoid:4444"] 245 | ``` 246 | #### Проверяем работоспособность 247 | 248 | ```bash 249 | docker-compose up 250 | ``` 251 | В браузере заходим `http://your-ip-address:8080` 252 | 253 | Мы должны видеть веб-страницу selenoid-ui. 254 | 255 | ![Selenoid-ui up and running](./img/selenoid-ui-main.png) 256 | 257 | 1. Переходим на вкладку Capabilities 258 | 2. Выбираем браузер 259 | 3. Запускаем ручную сессию 260 | 261 | Чтобы иметь возможность управлять браузером внутри контейнера, нужно его разблокировать (1) и лучше раскрыть VNC окно на максимум (2). 262 | 263 | ![Selenoid-ui up and running](./img/selenoid-manual-session.png) 264 | 265 | Если все работает, то останавливаем docker-compose и переходим к установке Jenkins. 266 | 267 | ### Jenkins 268 | 269 | гуглим конфиг: https://is.gd/LKXZ9k 270 | 271 | 1. Добавляем к `docker-compose.yml` 272 | 273 | ```yaml 274 | jenkins: 275 | image: jenkins/jenkins:lts 276 | user: root 277 | volumes: 278 | - ${PWD}/work/jenkins:/var/jenkins_home 279 | - /var/run/docker.sock:/var/run/docker.sock 280 | ports: 281 | - 8888:8080 282 | network_mode: bridge 283 | ``` 284 | 285 | 2. Запускаем docker-compose 286 | 287 | ```bash 288 | docker-compose up 289 | ``` 290 | Ждём, когда закачается образ и Jenkins стартует. В логах должно появиться следующее сообщение: 291 | 292 | ```bash 293 | jenkins_1 | Jenkins initial setup is required. An admin user has been created and a password generated. 294 | jenkins_1 | Please use the following password to proceed to installation: 295 | jenkins_1 | 296 | jenkins_1 | 32d64223e62945fe8c4c1ed050360700 297 | jenkins_1 | 298 | jenkins_1 | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword 299 | jenkins_1 | 300 | jenkins_1 | ************************************************************* 301 | jenkins_1 | ************************************************************* 302 | jenkins_1 | ************************************************************* 303 | ``` 304 | Этот пароль понадобится для самого первого входа Jenkins, потом про него можно забыть. 305 | 306 | 3. Устанавливаем плагины по умолчанию (потом можно удалить то, что ненужно). 307 | 4. Создаём администратора и переходим к начальной конфигурации Jenkins. 308 | 309 | #### Начальная конфигурация 310 | 311 | ##### Global tool configuration :: JDK > Add JDK 312 | 313 | 1. Убираем галку Install Automatically. 314 | 2. Name: можно написать что угодно, но лучше правду: OpenJDK 11. 315 | 3. JAVA_HOME вставляем ```$JAVA_HOME```. 316 | 4. Жмём APPLY внизу страницы. 317 | 318 | 319 | ##### Global tool configuration :: Gradle 320 | 1. Add gradle 321 | 2. Отмечаем Install Automatically. 322 | 3. Name: что угодно 323 | 4. Install from Gradle.org и выбрать нужную версию. 324 | 325 | ### Запуск стенда в detached режиме. 326 | 327 | Этот режим нужен для того, чтобы вы не видели весь-весь консольный вывод приложений, которые у вас сейчас запущены в докере. 328 | 329 | Останавливаем docker-compose Ctrl+C. 330 | 331 | #### Запускаем в detached 332 | 333 | ```bash 334 | docker-compose up -d 335 | ``` 336 | Вы увидите в консоли только вот это: 337 | 338 | ``` 339 | user@pc:/path$ docker-compose up -d 340 | Starting cm-local-test-bed-wsl_jenkins_1 ... done 341 | Starting cm-local-test-bed-wsl_selenoid_1 ... done 342 | Starting cm-local-test-bed-wsl_selenoid-ui_1 ... done 343 | ``` 344 | Далее вы вернётесь в консоль, а docker-compose продолжит свою работу. 345 | 346 | #### Остановка docker-compose 347 | 348 | Чтобы остановить все запущенные приложения, необходимо выполнить следующую команду: 349 | 350 | ```bash 351 | docker-compose down 352 | ``` 353 | 354 | Вот и всё. -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.4' 2 | 3 | services: 4 | selenoid: 5 | image: aerokube/selenoid:latest-release 6 | volumes: 7 | - "${PWD}/init/selenoid:/etc/selenoid" 8 | - "${PWD}/work/selenoid/video:/opt/selenoid/video" 9 | - "${PWD}/work/selenoid/logs:/opt/selenoid/logs" 10 | - "/var/run/docker.sock:/var/run/docker.sock" 11 | environment: 12 | - OVERRIDE_VIDEO_OUTPUT_DIR=work/selenoid/video 13 | command: ["-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video", "-log-output-dir", "/opt/selenoid/logs"] 14 | ports: 15 | - "4444:4444" 16 | network_mode: bridge 17 | selenoid-ui: 18 | image: "aerokube/selenoid-ui:latest-release" 19 | network_mode: bridge 20 | links: 21 | - selenoid 22 | ports: 23 | - "8080:8080" 24 | command: ["--selenoid-uri", "http://selenoid:4444"] 25 | jenkins: 26 | image: jenkins/jenkins:lts 27 | user: root 28 | volumes: 29 | - ${PWD}/work/jenkins:/var/jenkins_home 30 | - /var/run/docker.sock:/var/run/docker.sock 31 | ports: 32 | - 8888:8080 33 | network_mode: bridge -------------------------------------------------------------------------------- /img/docker-general-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheshi-mantu/cm-local-test-bed-wsl/12be82f2682e1be8c4ac184a9b2010105623c63b/img/docker-general-settings.png -------------------------------------------------------------------------------- /img/docker-settings-resources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheshi-mantu/cm-local-test-bed-wsl/12be82f2682e1be8c4ac184a9b2010105623c63b/img/docker-settings-resources.png -------------------------------------------------------------------------------- /img/linux-distro-start-terminal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheshi-mantu/cm-local-test-bed-wsl/12be82f2682e1be8c4ac184a9b2010105623c63b/img/linux-distro-start-terminal.png -------------------------------------------------------------------------------- /img/selenoid-manual-session.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheshi-mantu/cm-local-test-bed-wsl/12be82f2682e1be8c4ac184a9b2010105623c63b/img/selenoid-manual-session.png -------------------------------------------------------------------------------- /img/selenoid-ui-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheshi-mantu/cm-local-test-bed-wsl/12be82f2682e1be8c4ac184a9b2010105623c63b/img/selenoid-ui-main.png -------------------------------------------------------------------------------- /img/terminal_elevated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheshi-mantu/cm-local-test-bed-wsl/12be82f2682e1be8c4ac184a9b2010105623c63b/img/terminal_elevated.png -------------------------------------------------------------------------------- /init/selenoid/browsers.json: -------------------------------------------------------------------------------- 1 | { 2 | "chrome": { 3 | "default": "88.0", 4 | "versions": { 5 | "87.0": { 6 | "env" : ["LANG=ru_RU.UTF-8", "LANGUAGE=ru:en", "LC_ALL=ru_RU.UTF-8", "TZ=Europe/Moscow"], 7 | "image": "selenoid/vnc:chrome_75.0", 8 | "tmpfs": {"/tmp": "size=512m"}, 9 | "port": "4444" 10 | }, 11 | "88.0": { 12 | "env": ["LANG=ru_RU.UTF-8", "LANGUAGE=ru:en", "LC_ALL=ru_RU.UTF-8", "TZ=Europe/Moscow"], 13 | "image": "selenoid/vnc:chrome_76.0", 14 | "tmpfs": {"/tmp": "size=512m"}, 15 | "port": "4444" 16 | }, 17 | "89.0": { 18 | "env" : ["LANG=ru_RU.UTF-8", "LANGUAGE=ru:en", "LC_ALL=ru_RU.UTF-8", "TZ=Europe/Moscow"], 19 | "image": "selenoid/vnc:chrome_87.0", 20 | "tmpfs": {"/tmp": "size=512m"}, 21 | "port": "4444" 22 | } 23 | } 24 | } 25 | } --------------------------------------------------------------------------------