#Контейнеризация и DevOps приложений на примере Docker и Visual Studio Team Services
Илья Зверев
Logrocon Software Engineering
[TOC]
- Docker Toolbox https://www.docker.com/products/docker-toolbox обязательно установить Docker Client for Windows и Docker Machine for Windows
- Putty https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
##Новый проект в VSTS
- Необходимо авторизоваться в VSTS https://app.vsaex.visualstudio.com/me?campaign=o~msft~vscom~signin
- Создать новый проект
- После создания проекта выбрать опцию "or import a repository"
- Импортировать код из github по ссылке https://github.com/aprilix/JavaDemo
- Создадим пустой Build для нашего проекта
- Для построения проекта целиком нам потребуется Bower, Maven
- Сборочный таск для Bower не встроен в базовую поставку - мы установим его из marketplace
- Для этого перейдем по ссылке https://marketplace.visualstudio.com/items?itemName=touchify.vsts-bower
- Выберем Install, укажем аккаунт в VSTS, Confirm
- Теперь добавим таски в Build
- Первым - Bower. Параметры по умолчанию устроят
- Вторым - Maven. Выберем Code Coverage Tool - JaCoCo
- Сохраним и запустим.
- Используем шаблон по ссылке https://github.com/Azure/azure-quickstart-templates/tree/master/sonarqube-azuresql
- Все параметры - по умолчанию
- Подключаем с помощью токена по мере готовности (например в Maven таске)
- В проекте уже есть Docker File, необходимо подготовить окружение для работы с ним
- Нам потребуется:
- Build Agent с Docker для сборки Docker Образа
- Azure Container Registry
- Docker Host для запуска контейнера с приложением
- Выполним команду заполнив параметры:
docker-machine create -d azure --azure-subscription-id {Azure Subscription ID} --azure-resource-group {resource group name} {vm name in all lowercase}
- Идентификатор вашей подписки можно взять по ссылке: https://portal.azure.com/#blade/Microsoft_Azure_Billing/SubscriptionsBlade
- При первом обращении в консоли появится код подтверждения, его необходимо ввести в поле по ссылке https://aka.ms/devicelogin
- Затем процесс продолжится.
- Лайфхак, если процесс подвисает - нажмите пару раз Enter.
- Теперь нужно настроить putty (опционально) – т.к. работать с ssh с ним будет удобнее чем с командой
docker-machine ssh
- Выполним команду:
docker-machine env {vm name in all lowercase}
- Сконвертируем приватный ключ лежащий в папке сертификатов виртуальной машины
C:\Users\{user}\.docker\machine\machines\{vm name in all lowercase}
- для этого откроем puttygen.exe
- загрузим (Load) файл
id_rsa
из папки сертификатов - Сохраним приватный ключ (Save Private Key) в той же папке с именем
id_rsa.ppk
- теперь настроим соединение в putty. Запустим его.
- введем Ip адрес нашего docker host в основную форму.
- По дереву опций перейдем в
Connection -> Data
- укажем имя пользователя:
docker-user
- Теперь перейдем в
Connection -> SSh -> Auth
- укажем private key который мы сохранили на шаге 11.
- По дереву меню вернемся к форме Session. Если планируем сохранить сессию - введем ее имя и нажмем Save
- Откроем сессию.
- В рамках сессии мы установим весь софт, который нам необходим для сборки
- для этого скачаем подготовленный скрипт:
wget https://raw.githubusercontent.com/aprilix/JavaDemo/master/AgentInstall/linuxSetup.sh
- сделаем его запускаемым": ````chmod +x ./linuxSetup.sh```
- запустим его (без sudo!):
./linuxSetup.sh
- скрипт установит весь необходимый софт включая build agent для VSTS
- Настроим build agent:
cd Agents/a1
./config.sh
- Выполняем указания мастера:
- Соглашаемся на EULA
- Указываем ссылку на наш аккаунт VSTS
- Соглашаемся на авторизацию по PAT
- Создаём и вводим PAT (в VSTS меню профиля -> My security -> Add -> Create Tocken)
- Создаём в настройках новый Agent Pool и указываем его
- Задаем имя агенту например
{vm name in all lowercase}-a1
- Теперь настроим запуск Agent как Build Service
sudo ./svc.sh install
sudo ./svc.sh start
- Агент должен стать доступным
- Переключим нашу сборку на нового агента и проверим работоспособность
- Запустим команду на локальной машине:
docker-machine create -d azure --azure-subscription-id {Azure Subscription ID} --azure-open-port 80 --azure-resource-group {resource group name} {other vm name in all lowercase}
- Проследим что команда выполнилась успешно. Она создаст второй хост с открытым портом 80 для нашего приложения
- Выполним команду
docker-machine env {vm name in all lowercase}
- Создадим в VSTS подключение к docker host.
- Откроем https://{account}.visualstudio.com/docker-app/_admin/_services?_a=resources
- Создадим новый endpoint с типом Docker Host
- укажем имя для endpoint
- Адрес - указанный в результатах команды из пункта 3
- Ключи - нужно заполнить по соответствию из .pem файлов в папке с сертификатами машины (можно скопировать из блокнота)
- Настройка завершена
- В Azure создадим новый реестр контейнеров -> https://portal.azure.com/#create/Microsoft.ContainerRegistry
- Укажем имя реестра
- Укажем группу ресурсов
- Создать -> Развернуть
- По окончанию развертывания включим админский доступ (альтернатива - Azure Active Directory)
- Перейдем на созданный ресурс.
- Выберем Ключи доступа
- Пользователь Администратор - включить.
- в VSTS создадим новое подключение к сервису контейнеров (new Docker Registry Connection)
- Укажем имя для реестра.
- Укажем адрес реестра в формате
https://{registry name}.azurecr.io/v1
- Docker Id - имя админской учетной записи.
- Password - один из паролей к ней.
- Обязательно укажем свой email.
- Настройка завершена
- Добавим в нашу сборку два таска для сборки Docker
- Первый таск - сборка нашего образа
- В параметрах укажем наш Docker Registry.
- Указывать можно и как Azure Container Registry, но я предпочитаю указывать как подключенный сервис
- Поменяем Image Name - он везде должен быть в нижнем регистре и одинаковый.
- в Advanced - укажем наш Docker Host
- Второй таск - Action -> Push Image.
- По аналогии с предыдущим таском указываем Image Name, Docker Registry и Docker Host
- Сохраним и запустим наш Build
- Проверим что включена галка CI - если нет - сохраним.
- С формы успешно выполненого Build - Создадим новое определение Release
- Укажем имя нашего определения.
- Укажем имя нашего окружения (например DEV)
- Укажем пустой шаблон и включим CD режим
- Выберем опцию Run on Agent
- В Additional options отключим скачивание артефактов
- Укажем наш пул со сборочным агентом в поле Deployment queue
- добавим два Docker таска
- Первый - запуск команды удаления предыдущего контейнера с хоста, занимающего тоже самое место (опционально)
- Укажем Action - Run a Docker command
- Команда
rm -rf {container name}
- Указываем наш Docker Host
- Второй таск - запуск нашего образа
- Укажем Action -> Run Image
- Укажем имя нашего Image по аналогии с Build
- Укажем имя нашего контейнера
{container name}
- Укажем проброс портов из Host в Container -
80:8080
- Укажем Наш Docker Host
- Сохраним определение
- Запустим и проверим
- CI - CD с Docker Настроен