Предыдущий ролик Следующий ролик  

Видео урок: Deploying to AppHarbor

Основы ASP.NET MVC 5

Еще один вариант размещения приложений на облаке - AppHarbor. В этом видео мы поговорим о том, как настроить аккаунт и развернуть приложение всего за несколько минут. Мы продолжим работать над нашим проектом ATM с того места, на котором остановились в конце предыдущего видео. AppHarbor похож на другие платформы, например, на такие провайдеры, как Heroku или App Engine от компании Google. Его интерфейс намного проще интерфейса Azure, и многим разработчикам он кажется менее напыщенным. Многие из его функций предоставляются бесплатно. Вы даже можете хранить на нем базы данных небольшого размера до тех пор, пока вам не понадобится расширить приложение.

Регистрироваться на AppHarbor очень просто, а если вы уже настроили аккаунт, то можно начать с ввода названия вашего приложения. Развертывать можно с разных сервисов хостинга репозиториев, например, с Bitbucket, CodePlex или GitHub, которые, кстати, можно использовать и при работе с Azure. Для развертывания нашего приложения мы будем использовать Git, установленный на нашем локальном компьютере. Но перед этим нам нужно убедиться в том, что мы используем SQL Server, дополнительный компонент, который нужно установить для нашего приложения.

Поэтому нажмем на ссылку "Add-on Catalog" (Каталог дополнительных компонентов). Прокрутим до конца страницы и найдем в списке Shared Microsoft SQL Server. После этого нажмем на значок или на ссылку "See More" (Подробнее). Итак, если выбрать план Yocto, то получим хранилище объемом 20Мб, конечно, надолго его не хватит, но этого вполне достаточно для того, чтобы немного потренироваться. Итак, установим этот план. После окончания установки нажмите вот сюда, а затем на ссылку "Go To SQL Server" (Перейти на SQL Server).

Внизу этой страницы находится строка подключения, в которой говорится: "Эта строка подключения будет вставлена AppHarbor". Поэтому в файле Web.config мы не будем ничего менять, для того чтобы перейти от локальной базы данных SQL Server к той базе данных, которую предоставляет AppHarbor. Тем не менее, нам нужно указать, куда должна вставляться эта строка. Сделать это можно, присоединив псевдоним этой строки подключения к имени нашей строки подключения в файле Web.config. Имя нашей строки подключения - DefaultConnection.

Итак, нажимаем кнопку "Редактировать конфигурацию базы данных" и задаем псевдоним. Метаданные Entity Framework в нашем случае не используются, потому что мы занимаемся разработкой в режиме Code First, но их можно было бы задать, если бы мы использовали модель данных Entity в рамках режима Database First. Несколько активных результирующих наборов, или режим MARS, подразумевает выполнение нескольких групп инструкций в рамках одного подключения. Можете подробнее изучить эту тему, но на то, что мы делаем сейчас это никак не повлияет. AppHarbor не предложит вам выполнять миграции Code First.

Но мы можем вручную воссоздать то, что Azure выполняет скрытно. В классе ApplicationDbContext переопределим метод под названием OnModelCreating. Код для этого метода находится в файлах упражнений: текстовый файл OnModelCreating в папке Chapter 8 -> Start. Итак, скопируем этот код и вставим его в класс ApplicationDbContext. Таким образом задается определенный тип инициализатора базы данных.

А именно - тип MigrateDatabaseToLatestVersion. Можно использовать еще несколько других типов, которые будут автоматически удалять и воссоздавать базу данных или делать это только в случае изменения модели, или создавать базу данных, только если она еще не существует. Но тип MigrateDatabaseToLatestVersion - это хороший выбор. Его можно использовать и при первом развертывании и в рамках последующих развертываний после изменения модели. Реализация этого метода по умолчанию выполняет некоторые настройки для моделей сущностей ASP.NET, поэтому необходимо вызвать еще и base.OnModelCreating.

Эта ссылка на класс Configuration отправляет нас в папку Migrations, поэтому нужно разрешить это пространство имен, если оно для вас не валидно. Этот инициализатор можно задать и в методе ApplicationStart. Но как и ApplicationStart, вот этот метод будет вызываться всего один раз при первом обращении к контексту, а впоследствии в нем будет храниться вся модель этого контекста. Третий способ, который в случае развертывания на Azure выполняется скрытно, - задать его в файле Web.config: в элементе context, который относится к элементу entityFramework.

Пример реализации такого подхода можно посмотреть в файле AzureWeb.config из папки Chapter 8 -> Start. Внутри элемента entityFramework есть элемент context. В нем мы видим инициализатор базы данных, который обращается к типу MigrateDatabaseToLatestVersion. И мне кажется, что с помощью такого кода делать это намного приятнее. Теперь мы готовы к развертыванию, осуществлять которое мы будем с помощью Git. Если вы еще не установили Git, скачайте его с сайта git-scm.com.

Я не буду подробно останавливаться на Git. На сайте lynda.com, да и в целом в интернете есть много обучающих ресурсов, посвященных Git. Итак, чтобы настроить AppHarbor, мы выполним самое простое из всех развертываний Git. В комплект Git входит командная строка, инструменты графического интерфейса, а также Git Bash, небольшая Bash-оболочка под UNIX, которую я люблю использовать для фиксации и публикации кода. А поскольку мы собираемся опубликовать код на AppHarbor, давайте убедимся, что все эти изменения сохранены.

Теперь можно перейти в директорию нашего решения. Кстати, в этой директории должно быть только одно решение, в противном случае AppHarbor не поймет, что мы пытаемся развернуть. Затем вводим "git init", чтобы инициализировать новый репозиторий Git, а затем - "git add .", чтобы добавить в этот репозиторий все наши файлы. Сейчас мы не будем обсуждать эти строки, но позвольте заметить, что в реальных сценариях нужно настроить Git таким образом, чтобы он игнорировал некоторые файлы Visual Studio и сгенерированные папки, а пока я просто продемонстрирую вам текущее развертывание.

Далее выполним нашу первую фиксацию с помощью команды "git commit -m". Параметр -m используется для задания комментария. Мы введем комментарий "init" для начальной фиксации. Последнее, что нужно сделать перед развертыванием, - связать этот репозиторий с нашим удаленным репозиторием AppHarbor. Получим этот URL со страницы моего приложения, нажав кнопку "Repository URL" (URL репозитория), и скопируем его в буфер обмена. Чтобы можно было вставить этот URL в Git Bash или командную строку Windows, нужно нажать правой кнопкой мыши на строке заголовка, выбрать пункт "Свойства" и проверить, включен ли режим быстрой вставки (Quick Edit).

После этого вводим команду "git remote add appharbor", appharbor - это имя будущего репозитория, а затем нажимаем правую кнопку мыши и вставляем URL. И наконец-то, можно выполнить команду "git push appharbor master", чтобы опубликовать нашу локальную ветку Master в удаленной ветке Master репозитория AppHarbor. Здесь я ввожу тот пароль, который я использовал для регистрации на AppHarbor. Если теперь зайти на страницу нашего приложения MVC ATM на AppHarbor и обновить ее, то можно увидеть, что оно действительно находится в процессе построения.

Во время построения будут также запущены наши модульные тесты, поэтому после завершения построения мы увидим этот грустный смайлик, потому что один из наших тестов выполнился неудачно. И тут указано, какой именно. Тест ContactFormSaysThanks. Если нажать на него, то мы увидим и саму ошибку, что я считаю довольно наглядным, хотя есть вероятность, что мы не сможем точно определить, что произошло, пока не заглянем в код. Давайте же туда заглянем. Проблема заключается в том, что в рамках наших экспериментов с AJAX и частичными обновлениями страницы в классе нашего модульного теста мы изменили метод ContactForm таким образом, чтобы он возвращал частичное представление.

поэтому давайте и здесь заменим тип возвращаемого результата на PartialViewResult. Сохраним изменения и вернемся в Git Bash. Добавим эти изменения, зафиксируем их с помощью комментария "fixed unit test" (фиксация модульного теста), а затем опубликуем их снова на AppHarbor. Вернемся на страницу состояния построения. После окончания построения на этот раз мы увидим значок успеха.

И если обновить страницу, то мы увидим ссылку, в которой говорится "Go To Your Application" (Перейти к приложению). Давайте нажмем на нее, чтобы увидеть результат. Если я смогу войти в систему под своим аккаунтом администратора, то узнаю, что база данных обновилась должным образом и метод Seed выполнился. Итак, благодаря AppHarbor мы увидели еще один способ быстрого развертывания приложения на расширяемой облачной платформе.