Создание тестовых виртуальных машин через GitLab CI
- Подготовьте облако к работе
- Создайте виртуальную машину для тестового приложения
- Подготовьте виртуальную машину с тестовым приложением
- Проверьте работу тестового приложения
- Подготовьте снимок диска виртуальной машины
- Создайте виртуальную машину с GitLab
- Настройте GitLab
- Настройте Runner
- Настройте CI
- Проверьте работу приложения на виртуальной машине, созданной с помощью CI
С помощью Yandex Cloud вы можете автоматизировать рутинные действия, например, запускать определенный скрипт после каждого коммита в ветку master
репозитория Git. В примере ниже после каждого коммита создается и тестируется ВМ.
Чтобы настроить непрерывную интеграцию (Continuous Integration, CI) для снимков дисков ВМ:
- Создайте ВМ для тестового приложения — создайте новую ВМ, снимок диска которой будет использоваться для создания новых ВМ с помощью CI.
- Подготовьте ВМ с тестовым приложением — установите на ВМ веб-сервер и набор компонентов для работы тестового приложения. Напишите тестовое приложение, которое будет переворачивать слова в переданном на сервер тексте.
- Проверьте работу приложения — проверьте настройки сервера и работу приложения с помощью пробного запроса.
- Создайте снимок диска ВМ — создайте снимок диска ВМ из которого CI будет создавать новые ВМ.
- Создайте ВМ с GitLab — создайте ВМ с GitLab
, где в репозитории будут храниться настройки CI и скрипт функционального тестирования. - Настройте GitLab — создайте репозиторий для файлов и получите необходимые для конфигурации параметры.
- Настройте Runner — инструмент для выполнения задач.
- Настройте CI — задайте конфигурацию CI, указав необходимые параметры для команд и тестирования.
- Проверьте работу приложения на ВМ, созданной с помощью CI — убедитесь, что создающиеся с помощью CI и снимка ВМ создаются, а тестовое приложение работает.
Если созданные ВМ больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Перед тем, как создавать ВМ:
- Перейдите в консоль управления
Yandex Cloud и выберите каталог, в котором будете выполнять операции. - Убедитесь, что в выбранном каталоге есть сеть с подсетью, к которой можно подключить ВМ. Для этого на странице каталога выберите сервис Virtual Private Cloud. Если в списке есть сеть — нажмите на нее, чтобы увидеть список подсетей. Если ни одной подсети или сети нет, создайте их.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- Плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud).
- Плата за хранение созданных образов (см. тарифы Compute Cloud).
- Плата за использование динамических публичных IP-адресов (см. тарифы Yandex Virtual Private Cloud).
Создайте виртуальную машину для тестового приложения
Создайте ВМ, на которой будут установлены тестовое приложение, набор необходимых для его работы компонентов и веб-сервер:
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
В блоке Образ загрузочного диска выберите публичный образ Ubuntu 18.04.
-
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Вычислительные ресурсы перейдите на вкладку Своя конфигурация и укажите параметры:
- Платформа —
Intel Ice Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
20%
. - RAM —
1 ГБ
.
- Платформа —
-
В блоке Сетевые настройки выберите, к какой подсети необходимо подключить ВМ при создании.
-
В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:
-
В поле Логин введите имя пользователя, который будет создан на виртуальной машине, например
yc-user
.Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
-
-
В блоке Общая информация задайте имя ВМ:
ci-tutorial-test-app
. -
Нажмите кнопку Создать ВМ.
Создание ВМ может занять несколько минут. Когда ВМ перейдет в статус RUNNING
, вы можете перейти к ее настройке.
При создании ВМ назначаются IP-адрес и имя хоста (FQDN). Эти данные можно использовать для доступа по SSH.
Подготовьте виртуальную машину с тестовым приложением
На созданную ВМ нужно установить набор необходимых для работы тестового приложения компонентов и веб-сервер для обработки запросов. Само приложение будет написано на языке Python 2.
-
В блоке Сеть на странице ВМ в консоли управления
найдите публичный IP-адрес ВМ. -
Подключитесь к ВМ по протоколу SSH. Для этого можно использовать утилиту
ssh
в Linux и macOS и программу PuTTY для Windows.ssh <логин>@<публичный_IP-адрес_ВМ>
-
Выполните команду
apt update
, чтобы обновить списки доступных для установки пакетов. -
Установите необходимые пакеты: JSON-процессор jq, Git-клиент, менеджер пакетов PIP, систему управления виртуальными средами virtualenv, набор заголовочных файлов для Python C API и веб-сервер Nginx:
sudo apt-get --yes install jq git python-pip virtualenv python-dev nginx-full
-
Создайте директорию, в которой будет находиться приложение. Также сделайте пользователя, от имени которого вы подключились к ВМ, владельцем директории:
sudo mkdir /srv/test-app sudo chown -R $USER /srv/test-app
-
Перейдите в директорию и создайте в ней виртуальное окружение
virtualenv
:cd /srv/test-app virtualenv test-venv
-
Запустите виртуальное окружение:
. test-venv/bin/activate
-
Установите в виртуальное окружение фреймворк Flask и веб-сервер uWSGI:
pip install flask uwsgi
-
Деактивируйте виртуальное окружение:
deactivate
-
Создайте в директории
/srv/test-app
файлapi.py
:touch api.py
-
Откройте файл
api.py
любым текстовым редактором и скопируйте в него код на языке Python, который:- Принимает на вход текстовую строку в параметре
text
. - Записывает каждое слово из переданной строки наоборот.
- Возвращает ответ:
- В формате JSON, если клиентское приложение может принимать JSON.
- Обычный текст, если клиентское приложение не может принять JSON.
# api.py import json from flask import Flask, request, make_response as response app = Flask(__name__) @app.route("/") def index(): text = request.args.get('text') json_type = 'application/json' json_accepted = json_type in request.headers.get('Accept', '') if text: words = text.split() reversed_words = [word[::-1] for word in words] if json_accepted: res = response(json.dumps({'text': reversed_words}), 200) else: res = response(' '.join(reversed_words), 200) else: res = response('text not found', 501) res.headers['Content-Type'] = json_type if json_accepted else 'text/plain' return res
- Принимает на вход текстовую строку в параметре
-
Создайте в директории
/srv/test-app
файлwsgi.py
:touch wsgi.py
-
Откройте файл
wsgi.py
любым текстовым редактором и скопируйте в него код, запускающий тестовое приложение:# wsgi.py from api import app if __name__ == "__main__": app.run()
-
Создайте в директории
/srv/test-app
файлtest-app.ini
:touch test-app.ini
-
Откройте файл
test-app.ini
любым текстовым редактором и скопируйте в него конфигурацию сервера uWSGI:#test-app.ini [uwsgi] module = wsgi:app master = true processes = 1 socket = test-app.sock chmod-socket = 660 vacuum = true die-on-term = true
-
Назначьте пользователя
www-data
владельцем директории/srv/test-app
и файлов в ней:sudo chown -R www-data:www-data /srv/test-app
-
Подготовьте сервис для запуска вашего uWSGI-сервера. Для этого приведите файл
/etc/systemd/system/test-app.service
к следующему виду:#/etc/systemd/system/test-app.service [Unit] Description=uWSGI instance to serve test API After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/srv/test-app Environment="PATH=/srv/test-app/test-venv/bin" ExecStart=/srv/test-app/test-venv/bin/uwsgi --ini test-app.ini [Install] WantedBy=multi-user.target
-
Укажите настройки нового виртуального сервера в конфигурации Nginx, приведя файл
/etc/nginx/sites-available/test-app.conf
к следующему виду:#/etc/nginx/sites-available/test-app.conf server { #server_name test-app.yandex www.test-app.yandex; listen 80; location /test/ { include uwsgi_params; uwsgi_param SCRIPT_NAME /test; uwsgi_modifier1 30; uwsgi_pass unix:/srv/test-app/test-app.sock; } }
-
Создайте символическую ссылку, указывающую на конфигурационный файл Nginx
test-app.conf
:sudo ln -s /etc/nginx/sites-available/test-app.conf /etc/nginx/sites-enabled/
-
Удалите символическую ссылку, указывающую на конфигурацию Nginx по умолчанию:
sudo unlink /etc/nginx/sites-enabled/default
-
Добавьте сервис в список автозапуска системы:
sudo systemctl enable test-app.service
Проверьте работу тестового приложения
Чтобы убедиться, что тестовое приложение работает, а веб-сервер настроен верно, выполните простой запрос.
-
В строке браузера введите URL для проверки работы веб-сервера и приложения:
http://<публичный_IP-адрес_ВМ>/test/?text=hello_world
-
Если все выполнено верно, на экране отобразится текст с перевернутыми словами из параметра
text
.
Подготовьте снимок диска виртуальной машины
Чтоб легко переносить созданное приложение и конфигурацию веб-сервера на создаваемые с помощью CI ВМ, нужно сделать снимок диска тестовой ВМ.
- В консоли управления
Yandex Cloud выберите каталог, в котором создана ВМ. - Выберите сервис Compute Cloud.
- Найдите ВМ
ci-tutorial-test-app
и выберите ее. - Нажмите кнопку Остановить.
- В открывшемся окне нажмите кнопку Остановить.
- После остановки ВМ выберите вкладку Диски.
- В строке диска нажмите кнопку
и выберите пункт Создать снимок. - В открывшемся окне введите имя снимка:
test-app-snap
. - Нажмите кнопку Создать.
Создайте виртуальную машину с GitLab
Один из способов настроить CI в Yandex Cloud — воспользоваться публичным образом с предустановленной системой GitLab. В GitLab входит набор инструментов для управления репозиториями Git и средства для настройки CI.
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
В блоке Образ загрузочного диска перейдите на вкладку Marketplace, нажмите кнопку Показать все продукты Marketplace и выберите образ GitLab.
-
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Вычислительные ресурсы перейдите на вкладку Своя конфигурация и укажите параметры:
- Платформа —
Intel Ice Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
100%
. - RAM —
2 ГБ
.
- Платформа —
-
В блоке Сетевые настройки выберите, к какой подсети необходимо подключить ВМ при создании.
-
В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:
-
В поле Логин введите имя пользователя, который будет создан на виртуальной машине, например
yc-user
.Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
-
-
В блоке Общая информация задайте имя ВМ:
ci-tutorial-gitlab
. -
Нажмите кнопку Создать ВМ.
Создание ВМ может занять несколько минут. Когда ВМ перейдет в статус RUNNING
, вы можете перейти к ее настройке.
При создании ВМ назначаются IP-адрес и имя хоста (FQDN). Эти данные можно использовать для доступа по SSH.
Настройте GitLab
Чтобы настроить GitLab и подготовить процесс CI, создайте новый проект и введите параметры для авторизации в CI:
-
На странице сервиса Compute Cloud выберите созданную ВМ и скопируйте ее публичный IP-адрес.
-
Подключитесь к ВМ по протоколу SSH.
-
Получите пароль администратора GitLab с помощью команды ВМ:
sudo cat /etc/gitlab/initial_root_password
-
Скопируйте пароль из строки
Password
(исключая пробелы) в буфер обмена или отдельный файл. -
Откройте в браузере ссылку
http://<публичный_IP-адрес_ВМ>
. Откроется веб-интерфейс GitLab. -
Войдите в систему с учетной записью администратора:
- Username or email —
root
. - Password — пароль, скопированный ранее.
Если вы не можете войти, сбросьте пароль учетной записи администратора
. - Username or email —
-
Повторно войдите в систему с учетной записью администратора, используя новый пароль.
-
Выберите Create a project.
-
Задайте имя проекта:
gitlab-test
. -
Нажмите кнопку Create project.
-
Получите OAuth-токен в сервисе Яндекс OAuth. Для этого перейдите по ссылке
и нажмите Разрешить. -
Откройте в браузере ссылку вида
http://<публичный_IP-адрес_ВМ>/root
. -
Выберите проект
gitlab-test
. -
На открывшемся экране выберите слева вкладку Settings, а во всплывающем меню — CI/CD.
-
В разделе Variables нажмите кнопку Expand.
-
Создайте новую переменную:
- В качестве имени переменной укажите
YC_OAUTH
. - В качестве значения переменной укажите полученный OAuth-токен.
- Нажмите кнопку Save variables.
- В качестве имени переменной укажите
-
В разделе Runners нажмите кнопку Expand.
-
В разделе Set up a specific Runner automatically указан адрес сервера для подключения и токен для регистрации сервера в проекте. Используйте эти значения при регистрации Runner.
Настройте Runner
Runner — это инструмент для выполнения задач, которые создает пользователь. Runner необходимо установить на ВМ и зарегистрировать его в GitLab. Чтобы Runner мог выполнять задачи, подготовьте дополнительные компоненты — установите CLI Yandex Cloud и создайте тест для проверки созданной ВМ.
-
Подключитесь к ВМ с GitLab по SSH:
ssh <логин>@<публичный_IP-адрес_ВМ_с_GitLab>
-
Добавьте новый репозиторий в менеджер пакетов:
curl --location https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
-
Установите Runner, который будет выполнять скрипты вашего CI:
sudo apt-get -y install gitlab-runner
-
Зарегистрируйте Runner:
- На шаге
Please enter the gitlab-ci coordinator URL
укажите IP-адрес сервера GitLab. - На шаге
Please enter the gitlab-ci token for this runner
укажите токен Runner. - На шаге
Please enter the gitlab-ci description for this runner
введите описаниеgitlab test runner
. - На шаге
Please enter the gitlab-ci tags for this runner
не вводите ничего, нажмите Enter. - На шаге
Please enter the executor
укажитеshell
.
sudo gitlab-runner register Runtime platform arch=amd64 os=linux pid=8197 revision=3afdaba6 version=11.5.0 Running in system-mode. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): http://<IP-адрес_CI_GitLab>/ Please enter the gitlab-ci token for this runner: <токен_Runner> Please enter the gitlab-ci description for this runner: [ci-tutorial-gitlab]: gitlab test runner Please enter the gitlab-ci tags for this runner (comma separated): Registering runner... succeeded runner=wZqzyy9s Please enter the executor: virtualbox, docker+machine, docker-ssh+machine, kubernetes, docker, docker-ssh, shell, ssh, parallels: shell Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
- На шаге
-
Чтобы скрипт CI мог создавать ВМ, установите CLI Yandex Cloud:
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh --output install.sh sudo bash install.sh -n -i /opt/yc
-
Для проведения функционального тестирования установите пакет
pytest
:sudo apt-get install python-pytest
-
Создайте файл
test.py
со скриптом для функционального тестирования:-
Откройте главную страницу репозитория
gitlab-test
. -
Нажмите кнопку + и выберите пункт New file.
-
В открывшемся окне дайте файлу имя
test.py
. -
В тело файла скопируйте следующий код:
# test.py import pytest import json import socket as s @pytest.fixture def hostname(request): with open("instance-creation.out", "r") as fd: fqdn = json.loads(fd.read()).get("fqdn") return fqdn @pytest.fixture def socket(request): _socket = s.socket(s.AF_INET, s.SOCK_STREAM) def socket_teardown(): _socket.close() request.addfinalizer(socket_teardown) return _socket def test_server_connect(socket, hostname): socket.connect((hostname, 80)) assert socket
-
Напишите любое сообщение коммита и нажмите кнопку Commit changes.
-
Настройте CI
Для CI необходимо задать конфигурацию.
-
Откройте главную страницу репозитория
gitlab-test
:http://<публичный_IP-адрес_ВМ_c_GitLab>/root/gitlab-test
-
Нажмите кнопку Set up CI/CD. Откроется экран добавления нового файла.
-
GitLab автоматически даст файлу имя
.gitlab-ci.yml
— не изменяйте его. Скопируйте в файл следующую конфигурацию:#.gitlab-ci.yml stages: - build - test build: stage: build variables: snapshot_name: test-app-snap folder_id: <идентификатор_каталога> subnet_name: <имя_подсети> script: - export instance_name="ci-tutorial-test-app-$(date +%s)" - export PATH="/opt/yc/bin:${PATH}" - yc config set token $YC_OAUTH - yc compute instance create --format json --name $instance_name --folder-id $folder_id --zone ru-central1-a --network-interface subnet-name=$subnet_name,nat-ip-version=ipv4 --create-boot-disk name=$instance_name-boot,type=network-ssd,size=15,snapshot-name=$snapshot_name,auto-delete=true --memory 1 --cores 1 --hostname $instance_name > instance-creation.out - sleep 30 artifacts: when: on_success paths: - instance-creation.out expire_in: 10 mins test_external: stage: test script: - py.test test.py > pytest-external.out artifacts: paths: - pytest-external.out expire_in: 1 hour
-
В поле
snapshot_name
укажите имя снимка первой ВМ.
В полеfolder_id
укажите идентификатор каталога, в котором создаются ВМ.
В полеsubnet_name
укажите имя подсети, к которой будут подключаться ВМ — имя можно получить в консоли управления, открыв нужный каталог и перейдя на страницу сервиса Virtual Private Cloud. -
Нажмите кнопку Commit changes.
Проверьте работу приложения на виртуальной машине, созданной с помощью CI
После коммита необходимо убедиться в том, что CI отработал корректно. В нужной директории должна появиться новая ВМ, на которой развернуты тестовое приложение и веб-сервер.
Чтобы проверить созданную ВМ:
-
Откройте консоль управления Yandex Cloud.
-
В каталоге, где создавались ВМ, выберите сервис Compute Cloud.
-
Если все было настроено верно, в списке ВМ должна появиться новая ВМ с именем вида
ci-tutorial-test-app-1543910277
. -
Выберите созданную ВМ и скопируйте публичный IP-адрес созданной ВМ.
-
В браузере откройте ссылку вида:
http://<публичный_IP-адрес_созданной_ВМ>/test/?text=hello_world
-
Созданное на предыдущих шагах приложение должно работать и на созданной ВМ: возвращать перевернутые слова из параметра
text
.
Удалите созданные ресурсы
Если вам больше не нужны ВМ и образы: