В этой статье я расскажу, как сделать обеспечение непрерывного развертывания (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.
При использовании Dockerfile для разворачивания есть два подхода:
1) Сделать COPY — тогда Dockerfile должен быть в root проекта.
2) Сделать git clone — тогда Dockerfile может быть в любом месте, ssh ключ от репозитория желательно рядом.
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"]
cd /app/repositoryName/ dnx -p project.json kestrel
Делаем commit и push.
Hub.docker.com
У нас есть проект, есть контейнер, все это можно оттестировать локально, следующая задача запустить все это на сервере, автоматически.
Создаем аккаунт или входим на hub.docker.com. После этого надо создать «Create Automated Build», это можно сделать из репозиториев Github или Bitbucket.
Рис.1 — Create Automated Build
Теперь нам надо настроить сборку.
Рис.2 — Build Settings моего проекта
When active, builds will happen automatically on pushes. -если отмечена галочкой — при push в репозиторий в соответствии с настройками будет запущена сборка нового контейнера.
Name — ветка из которой собирать проект, по умолчанию собирает все ветки.
Dockerfile Location — папка в которой лежит Dockerfile, именно папка, не поддерживается возможность указывать свое имя Dockerfile. Именно по этой причине удобно использовать получение кода через репозиторий, а не через команду COPY. На одном приватном репозитории можно собирать несколько проектов имеющих общую кодовую базу, например, api и воркеров обрабатывающих долгие операции.
Docker Tag Name — тэг который потом используется для создания определенного контейнера.
Если выбрана сборка для всех веток то кнопка Trigger не доступна и нам надо сделать push для сборки.
Смотрим в Build Details статусы и лог сборки, если все собралось можем приступать к следующему шагу.
Tutum
Заходим через docker hub на Tutum.
Рис.3 — Добавляем репозиторий на Tutum, для создания сервисов
Repository name — логин/репозиторий на hub.docker.com
Username и Password от hub.docker.com
Теперь настроим Cloud Providers чтобы иметь возможность создавать сервера из панели Tutum.
Рис.4 — Добавляем ссылки на нужные облачные сервисы
Создадим сервер(node) для публикации наших сервисов.
Рис.5 — Добавляем сервер и его параметры, в данном случае это DO
Deploy tags — tag который вы пишите в описание сервера, чтобы соотнести сервисы и машины на которых они разворачиваются.
Нажимаем на Bring your own node — нам дают команду вида:
curl -Ls get.tutum.co | sudo -H sh -s b5730f134e5f4674575c45a65a0ddd84
Ее надо выполнить, подключившись на наш vscale.io сервер по ssh.
Создадим новый Service
Рис.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 сервиса…
asp: image: 'login/reponame:tag' ports: - '80:5004' restart: always tags: - tagdeploy
Теперь мы создали и развернули сервис на наш сервер, по адресу указаному в Endpoints можно посмотреть наш сайт.
Осталось сделать немного магии — чтобы после сборки нового контейнера у нас происходил его автоматический redeploy.
Заходим в наш сервис и выбираем вкладку Triggers.
Рис.7 — Webhook для redeploy на Tutum
Полученный url нам необходимо добавить в docker hub для нашего репозитория.
Рис.8 — Добавляем Webhook из Tutum
Поздравляю — все работает и автоматически будет разворачиваться.
ссылка на оригинал статьи http://habrahabr.ru/post/271477/
Добавить комментарий