Pull to refresh

Готовим ASP.NET 5: Continuous Deployment с Docker и Tutum

Reading time 4 min
Views 9.3K
В этой статье я расскажу, как сделать обеспечение непрерывного развертывания (Continuous Deployment) для ASP.NET 5 (Vnext) приложения на базе Docker контейнера, Tutum, сервера или облака.

При изучении материалов по Docker наибольшее количество вопросов у меня вызвало развертывание моего приватного репозитория на сервер и автоматизация этого процесса, причем сделать это хотелось не только решением для Azure, но иметь такую возможность для Digital Ocean или Vscale.
Принципиальная схема


Репозиторий


Сначала необходимо создать приватный репозиторий на Bitbucket, тип репозитория можно выбрать любой, но мы будем использовать в примере Git, как наиболее популярный. Можно создать приватный репозиторий и на Github (платно) и на GitLab (бесплатно, но не поддерживается https://hub.docker.com), но так исторически сложилось, что я в основном использовал bitbucket и mercurial, а сейчас перехожу на git.

Для возможности скачивания репозитория через ssh с докер контейнера нам нужно добавить ключ в нашу учетную запись (manage Account->SSH Keys-Add key).

Теперь нам необходимо клонировать наш репозиторий на свою машину — я делаю это с помощью Source Tree, добавить туда новый проект Vnext, добавить ssh ключ и Dockerfile.

про beta-8, iis и vs
При работе в vs используя beta-8 нельзя восстановить пакеты из студии надо делать dnu restore из консоли.
По поводу IIS — RaveNoX написал ответ, то есть kestrel наше всё, хотя на mac и linux другого варианта и не было, так что проблема не велика.

При использовании Dockerfile для разворачивания есть два подхода:

1) Сделать COPY — тогда Dockerfile должен быть в root проекта.
2) Сделать git clone — тогда Dockerfile может быть в любом месте, ssh ключ от репозитория желательно рядом.

Dockerfile
FROM microsoft/aspnet:1.0.0-beta8
#Установим рабочую папку
WORKDIR /app
#Обновимся и поставим git
RUN apt-get update && apt-get install -y git

#Добавим ключ
RUN mkdir -p /root/.ssh
ADD yourkey /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN echo "Host yourkey "$'\n'"HostName bitbucket.org"$'\n'"IdentityFile /root/.ssh/id_rsa" >> /root/.ssh/config

#Создадим known_hosts
RUN touch /root/.ssh/known_hosts
#Добавим bitbuckets key
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
#копируем репозиторий
RUN git clone git@bitbucket.org:login/repositoryName.git

# добавим в наш контейнер настройку NuGet - шаг не обязательный
RUN mkdir -p ~/.config/NuGet
RUN cd repositoryName
RUN cp /app/repositoryName/NuGet.config ~/.config/NuGet/
#восстановим зависимости
RUN dnu restore

EXPOSE 5004
#точка входа в контейнер
ENTRYPOINT ["sh", "/app/repositoryName/init.sh"]


init.sh
cd /app/repositoryName/
dnx -p project.json kestrel


Делаем commit и push.

Hub.docker.com


У нас есть проект, есть контейнер, все это можно оттестировать локально, следующая задача запустить все это на сервере автоматически.

Создаем аккаунт или входим на hub.docker.com. После этого надо создать «Create Automated Build», это можно сделать из репозиториев Github или Bitbucket.

Create Automated Build

Рис.1 — Create Automated Build

Теперь нам надо настроить сборку.

Build Settings моего проекта

Рис.2 — Build Settings моего проекта

When active, builds will happen automatically on pushes. — если установлено свойство, то при push в репозиторий будет запущена сборка нового контейнера в соответствии с настройками.
Name — ветка из которой собирать проект, по умолчанию собирает все ветки.
Dockerfile Location — папка в которой лежит Dockerfile, именно папка, не поддерживается возможность указывать свое имя Dockerfile. Именно по этой причине удобно использовать получение кода через репозиторий, а не через команду COPY. На одном приватном репозитории можно собирать несколько проектов имеющих общую кодовую базу, например, api и воркеров обрабатывающих долгие операции.
Docker Tag Name — tag, который впоследствии используется для создания определенного контейнера.
Если выбрана сборка для всех веток, то кнопка Trigger не доступна и нам надо сделать push для сборки.
Смотрим в Build Details статусы и лог сборки, если все собралось можем приступать к следующему шагу.

Tutum


Заходим через docker hub на Tutum.

Добавляем репозиторий на Tutum

Рис.3 — Добавляем репозиторий на Tutum для создания сервисов

Repository name — логин/репозиторий на hub.docker.com
Username и Password от hub.docker.com

Теперь настроим Cloud Providers чтобы иметь возможность создавать сервера из панели Tutum.

Account info

Рис.4 — Добавляем ссылки на нужные облачные сервисы

Создадим сервер(node) для публикации наших сервисов.

Create a node cluster

Рис.5 — Добавляем сервер и его параметры, в данном случае это DO

Deploy tags — tag который вы пишите в описание сервера, чтобы соотнести сервисы и машины на которых они разворачиваются.
Vscale.io
Как добавить машину Vscale.io:
Нажимаем на Bring your own node — нам дают команду вида:
curl -Ls get.tutum.co | sudo -H sh -s b5730f134e5f4674575c45a65a0ddd84

Ее надо выполнить, подключившись на наш vscale.io сервер по ssh.

Создадим новый Service

image

Рис.6 — Создаем Service на Tutum

Image tag — tag который вы назначили в hub.docker.com, если нет tag'ов — значит вы скорее всего неправильно ввели login\password при добавлении репозитория.
Deploy tags — tag который вы пишите в описание сервера, чтобы соотнести сервисы и машины на которых они разворачиваются.
Ports — нужно сделать Published наш порт 5004 и назначить на него 80-ый порт.
Нажимаем create and deploy

Сервисы можно создать через Stack файл — очень удобная вещь, позволяет охватить взглядом сразу несколько сервисов и быстро править их параметры, у меня сейчас 10 сервисов и это только начало, как минимум я добавлю еще 3 сервиса…

Stack файл
asp:
image: 'login/reponame:tag'
ports:
- '80:5004'
restart: always
tags:
- tagdeploy


Теперь мы создали и развернули сервис на наш сервер, по адресу указаному в Endpoints можно посмотреть наш сайт.
Осталось сделать немного магии — чтобы после сборки нового контейнера у нас происходил его автоматический redeploy.

Заходим в наш сервис и выбираем вкладку Triggers.

Add trigger

Рис.7 — Webhook для redeploy на Tutum

Полученный url нам необходимо добавить в docker hub для нашего репозитория.

Add webhook

Рис.8 — Добавляем Webhook из Tutum

Поздравляю — все работает и автоматически будет разворачиваться.
P.S. www.tutum.co сворачивается, теперь это будет cloud.docker.com
Цены довольно печальны: $0.02 Node/hour
Tags:
Hubs:
+12
Comments 4
Comments Comments 4

Articles