В настоящее время я использую Web Deploy, http://learn.iis.net/page.aspx/346/web-deploy/, чтобы опубликовать мое приложение MVC2. Он работал хорошо, но теперь он дошел до такой степени, что я не могу продолжать его использовать:
Когда приложение MVC было маленьким, и его было легко опубликовать только несколькими пользователями. Просто щелкните правой кнопкой мыши проект в Visual Studio и выберите "Опубликовать" . И поскольку было всего несколько пользователей, было легко найти время, когда никто не использовал сайт для быстрого обновления.
Затем приложение стало больше и у него появилось еще несколько пользователей. Действие "Опубликовать" начало длиться дольше и время от времени. Даже когда я переработал пул приложений перед его развертыванием, все еще требуется много времени.
Также стало труднее найти время, когда никто не использовал сайт, чтобы обновление можно было сделать, не затрагивая никого.
Затем действие "Опубликовать" запускалось с задержкой каждый раз, и мне пришлось переключиться на ручное развертывание в соответствии с этим более ранним неотвеченным вопросом: Visual Studio 2010 - время развертывания в Интернете - что делать?
Теперь ручное развертывание длится дольше и дольше, от 5 до 20 минут. И число пользователей значительно выросло, поэтому развертывание всегда затрагивает кого-то (медленное время отклика, тайм-ауты, недоступность сайта и т.д.).
Так что я могу сделать? Есть ли лучшая альтернатива использованию веб-развертывания?
Edit:
Сегодня развертывание заняло 18 минут, чтобы опубликовать только 49 измененных файлов. Ситуация просто смехотворна и является одной из самых больших недостатков нашего сайта прямо сейчас. Поэтому я начинаю приличную размерную награду в надежде на это.
Еще несколько вопросов, которые могут привести к решению:
- Почему это так долго, когда было изменено только несколько файлов?
- Почему веб-развертывание zip всегда включает всю кодовую базу, а не только измененные файлы?
- Почему бы мне просто не вручную вручную скопировать измененные файлы и не пропустить развертывание всего веб-сайта? Но трудно вручную определить, какие файлы были изменены. Я использую SVN - есть ли способ выводить только файлы, которые изменились между двумя ветвями?
- Какие еще вопросы я должен задавать, но пока не думал?
В ответ на ответы:
Re: http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_24.html Именно так я и выполнял развертывание, и был бы идеальным методом. Веб-развертывание правильно определяет, какие файлы были изменены, однако время истекает и публикация не происходит. В решении около 2500 файлов, возможно, слишком много времени, чтобы определить, какие из них изменены? Или может быть, что публикация имеет короткое значение тайм-аута и что просто загрузка файла zip размером 15 МБ использует все это время.
У меня есть полный контроль над сервером, и он поддерживает развертывание сети. На самом деле есть 2 сервера: основной сервер в реальном времени и резервный сервер, который мы сохраняем в случае первого падения. Поэтому любое решение должно быть легко развертываться на нескольких серверах (развертывание в сети было идеальным, пока оно не перестало работать).
Представление о создании новой папки для каждой версии, а затем просто изменение IIS, чтобы указать на эту новую папку, похоже на то, что это приведет к снижению времени простоя/замедления, когда во время публикации. Но это очень ручной процесс, и я бы предпочел бы что-то более автоматизированное.
Изменить # 2
Мне удалось сузить его и найти, где он медленный, но не почему. Это из журнала развертывания:
[9/02/2011 12:11:56 a.m.] Performing synchronization pass #1.
[9/02/2011 12:11:56 a.m.] Parameter entry 'IIS Web Application Name/1' is applicable to 'iisApp/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp' because of its scope.
[9/02/2011 12:11:56 a.m.] Parameter entry 'IIS Web Application Name/2' is applicable to 'setAcl/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp' because of its scope.
[9/02/2011 12:11:56 a.m.] Parameter entry 'IIS Web Application Name/2' is applicable to 'setAcl/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp' because of its scope.
[9/02/2011 12:11:56 a.m.] Parameter entry 'Add write permission to App_Data Folder/1' is applicable to 'setAcl/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp\App_Data' because of its scope.
[9/02/2011 12:11:56 a.m.] Source createApp (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) does not match destination (Default Web Site/virtual-dir/) differing in attributes (isDest['False','True']). Update pending.
[9/02/2011 12:11:56 a.m.] Update operation on createApp (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) skipped because of rule CreateApplicationRule.
[9/02/2011 12:11:56 a.m.] Source filePath (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp\App_Data\Create.sql) does not match destination (Default Web Site/virtual-dir/App_Data\Create.sql) differing in attributes (size['259691','259697'],lastWriteTime['02/08/2011 10:45:20','02/06/2011 03:48:16']). Update pending.
[400 lines of file updates skipped, time expired 2 seconds ....]
[9/02/2011 12:11:58 a.m.] Delete operation on filePath (Default Web Site/v2/zzz_app_offline.htm) skipped because of rule DoNotDeleteRule.
[9/02/2011 12:11:58 a.m.] Source setAcl (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) does not match destination (Default Web Site/virtual-dir/) differing in attributes (isDest['False','True'],setAclUser,setAclAccess). Update pending.
[9/02/2011 12:11:58 a.m.] Updating setAcl (Default Web Site/virtual-dir/).
[9/02/2011 12:13:47 a.m.] Source setAcl (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) does not match destination (Default Web Site/virtual-dir/) differing in attributes (isDest['False','True'],setAclUser,setAclAccess). Update pending.
[9/02/2011 12:13:47 a.m.] Updating setAcl (Default Web Site/virtual-dir/).
[9/02/2011 12:17:11 a.m.] Source setAcl (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp\App_Data) does not match destination (Default Web Site/virtual-dir//App_Data) differing in attributes (isDest['False','True'],setAclUser,setAclAccess). Update pending.
[9/02/2011 12:17:11 a.m.] Updating setAcl (Default Web Site/virtual-dir//App_Data).
[9/02/2011 12:17:11 a.m.] The dependency check 'DependencyCheckInUse' found no issues.
[9/02/2011 12:17:11 a.m.] The synchronization completed in 1 pass(es).
Причиной замедления является компонент "Updating setAcl"
. Я изучаю списки управления полем разработки и поле сервера, чтобы узнать, что отличает. Однако, кажется, очень плохая идея скопировать ACL из окна dev в серверную коробку! У меня уже был настроен ACL на сервере.