Использование Robocopy для развертывания сайтов

Я хочу иметь возможность быстро развертывать обновления на довольно загруженном сайте. Для небольших сайтов я бы просто отправил новые файлы по FTP поверх старых. Однако у этого есть несколько больших dll, которые регулярно обновляются, и пока они копируют сайт, фактически не работает (плюс есть хлопоты с их резервным копированием на случай, если что-то пойдет не так.

Я планирую использовать TortoiseHg для синхронизации с промежуточной копией на сервере через FTP (используя netdrive или что-то подобное). Затем я могу проверить, что все работает нормально, и как только это будет завершено, я хотел бы запустить файл .bat (или что-то еще), который создаст резервную копию живого сайта (желательно только файлы, которые собираются измениться, но это не критично), а затем скопируйте недавно измененные файлы на работающий сайт.

Если возможно, я также хочу, чтобы копия игнорировала определенные каталоги (например, загрузки пользователей), чтобы она не перезаписывала эти файлы на действующем сайте?

Я слышал, что RoboCopy - это лучший способ, но я не уверен, с чего начать. Нужно ли мне вызывать 2 команды (1 для первоначальной резервной копии и одна для копии)? Есть ли способ восстановить работающий сайт до его предыдущего состояния, если что-то пойдет не так?

Сайт находится в ASP.NET и будет скопирован на сервер Windows 2003.

РЕДАКТИРОВАТЬ: становится немного сложно, когда элементы web.config были изменены и должны быть объединены, чтобы настройки промежуточных серверов (настройки приложений, строки подключения и т. Д.) Не развертывались на действующем сайте. Как с этим справиться?


person William Hurst    schedule 12.09.2010    source источник


Ответы (9)


Мы используем следующее

  • сначала создайте веб-сайт с помощью msbuild в cruisecontrol.net, чтобы собрать двоичные файлы
  • заархивируйте развернутые в данный момент файлы в папке с отметкой времени, чтобы избежать потери данных в случае возникновения проблемы

    C:\DevTools\Robocopy\robocopy.exe /R:1 /W:10 /mir "D:\WebSite\Files" "D:\Webarchive\ArchivedFiles\Documents.%date:~0,-8%.%date:~3,-5%.%date:~6%.%time:~0,-9%.%time:~3,-6%.%time:~6,-3%" /XF *.scc

  • остановить сайт

  • развернуть веб-сайт, скопировав все, кроме файлов, которые мы заархивировали (/ XD - это eXclude Directory)

    C:\DevTools\Robocopy\robocopy.exe /R:1 /W:10 /mir "c:\dev\site" "D:\WebSite" /XF *.scc /XD "D:\WebSite\Files"

  • скопируйте и переименуйте (на этот раз с помощью xcopy) release.config с правильной информацией в d: \ Website \ web.config (на самом деле, это то, что мы делали раньше, теперь у нас есть механизм преобразования homebrew для изменения частей dev web.config на лету).

  • перезапустить сайт
  • (необязательно) удалите архив, созданный на втором шаге

В вашем случае вам нужно будет добавить флаги / XD для любого каталога, который вы хотите игнорировать, например для загрузки пользователей. И если производственный файл web.config не является сложным, я бы действительно рекомендовал просто скопировать release.config, который вы поддерживаете как часть проекта, рядом с web.config.

person samy    schedule 21.09.2010

Robocopy - сложное требование? Почему бы не использовать MSBuild? Все, что вы перечислили, можно безболезненно выполнить в MSBuild.

<!-- Attempt to build new code -->
<MSBuild Projects="$(BuildRootPath)\ThePhotoProject.sln" Properties="Configuration=$(Environment);WebProjectOutputDir=$(OutputFolder);OutDir=$(WebProjectOutputDir)\" />

<!-- Get temp file references -->
<PropertyGroup>
  <TempConfigFile>$([System.IO.Path]::GetTempFileName())</TempConfigFile>
  <TempEnvironmentFile>$([System.IO.Path]::GetTempFileName())</TempEnvironmentFile>
</PropertyGroup>

<!-- Copy current web configs to temp files -->
<Copy SourceFiles="$(OutputFolder)\web.config" DestinationFiles="$(TempConfigFile)"></Copy>
<Copy SourceFiles="$(OutputFolder)\web.$(Environment).config" DestinationFiles="$(TempEnvironmentFile)"></Copy>
<ItemGroup>
  <DeleteConfigs Include="$(OutputFolder)\*.config" />
</ItemGroup>

<Delete Files="@(DeleteConfigs)" />

...

<!-- Copy app_offline file -->
<Copy SourceFiles="$(CCNetWorkingDirectory)\Builder\app_offline.htm"  DestinationFiles="$(DeployPath)\app_offline.htm"  Condition="Exists('$(CCNetWorkingDirectory)\Builder\app_offline.htm')"  />

<ItemGroup>
  <DeleteExisting Include="$(DeployPath)\**\*.*" Exclude="$(DeployPath)\app_offline.htm" />      
</ItemGroup>

<!-- Delete Existing files from site -->
<Delete Files="@(DeleteExisting)"  />
<ItemGroup>
  <DeployFiles Include="$(OutputFolder)\**\*.*" />
</ItemGroup>

<!-- Deploy new files to deployment folder. -->
<Copy SourceFiles="@(DeployFiles)"  DestinationFiles="@(DeployFiles->'$(DeployPath)\%(RecursiveDir)%(Filename)%(Extension)')"  />

<!-- Delete app_offline file -->
<Delete Files="$(DeployPath)\app_offline.htm" Condition="Exists('$(DeployPath)\app_offline.htm')"  />

person Chuck Conway    schedule 18.09.2010
comment
Разве это не удалило бы все файлы с действующего сайта? Это загруженные файлы, которые существуют только на действующем сайте. - person William Hurst; 18.09.2010
comment
С MsBuild вы можете выбрать папку или тип файла, которые нужно игнорировать. - person Chuck Conway; 22.09.2010

На серверах на базе Nix я бы использовал RSYNC, и я понимаю, что в Windows вы можете использовать DeltaCopy который является портом RSYNC и является открытым исходным кодом (никогда не использовал DeltaCopy, поэтому внимательно проверьте его). В любом случае, если он работает как RSYNC, он работает быстро и обновляет только те файлы, которые были изменены.

Вы можете использовать различные параметры конфигурации для удаления файлов на цели, которые были удалены в источнике, и вы также можете использовать добавление в файл, которое исключит файлы или каталоги, то есть локальную конфигурацию, которую вы не хотите копировать. и Т. Д.

У вас должна быть возможность объединить все это в один скрипт для запуска при необходимости, что означает, что вы можете тестировать и рассчитывать время, чтобы знать, что происходит.

person PurplePilot    schedule 12.09.2010

Ознакомьтесь с этими ссылками, чтобы узнать, помогают ли они:

Вы обнаружите, что robocopy.exe /? чрезвычайно полезен. В частности, вам понадобится переключатель /XF для исключения файлов и /XD для исключения папок.

Однако вам нужно будет написать сценарий (например, bat, powershell, cscript), чтобы решить проблемы с web.config.

person nithins    schedule 18.09.2010

Сами Microsoft использует robocopy для развертывания обновлений на некоторых сайтах.

Я не знаю, есть ли у вас несколько серверов, но наш сценарий развертывания выглядел примерно так: 1) Остановить IIS (что выведет сервер из ротации балансировщика нагрузки, 2) RoboCopy / MIR из \ STAGING \ path \ to \ webroot to \ WEB ## \ path \ to \ webroot, где ## - номер сервера, 3) Запустите IIS. Это было сделано после дымового тестирования сайта на промежуточном сервере.

Это не сильно помогает с вашей проблемой конфигурации, но наши промежуточные и производственные файлы конфигурации были одинаковыми.

person Jason    schedule 18.09.2010

Что вам нужно (а мне нужно), так это программа синхронизации с возможностью создавать резервные копии файлов на сервере и делать быстрое копирование по ftp файлов сразу, возможно, сначала скопировав их во временный каталог, или путем частичного обновления.

Это одна программа, которую я нашел: http://www.superfflexible.com/ftp.htm

person Aristos    schedule 22.09.2010

WebDeploy - гораздо лучший способ справиться с развертыванием (см. Скотт Х. http://www.hanselman.com/blog/WebDeploymentMadeAwesomeIfYoureUsingXCopyYoureDoingItWrong.aspx)

Но Robocopy - отличный недорогой инструмент для развертывания, который я до сих пор использую на некоторых сайтах (у меня нет времени изменить их на webdeploy). Robocopy похож на xcopy, но с гораздо более богатым набором опций. Таким образом, вам понадобятся 2 команды Robocopy (1 для резервного копирования и 1 для развертывания). Обычно я выполняю команду резервного копирования, когда файлы размещаются.

Управление файлами конфигурации всегда сложно (и это большая причина для использования webdeploy). Один из подходов - сохранить копию файлов конфигурации для каждой среды в исходном элементе управления (например, web.dev.config, web.uat.config, web.prod.config и т. Д.). Промежуточный (или сценарий развертывания) захватит и переименует необходимый файл конфигурации.

person Jim Ecker    schedule 22.09.2010

Вероятно, вам понадобится комбинация инструментов.

Я бы посмотрел на DFSR (роль файлового сервера) с папкой только для чтения на вашем действующем сайте (так что это односторонняя репликация).

Его очень легко настроить, он имеет приятный графический интерфейс, возможность исключать файлы на основе местоположения и / или масок, а с включенным теневым копированием тома вы можете запускать его по установленному вами расписанию и обновлять только те файлы, которые изменяются (или имеют его запускать по расписанию или даже запускать вручную). Прелесть этого заключается в том, что после настройки вам не нужно к нему снова прикасаться.

Как только у вас будет репликация основной части ваших файлов, вы сможете получить помощь в автоматизации возможного слияния в web.config, если вы хотите, чтобы это было автоматизировано.

person J.A.G    schedule 22.09.2010

MSBuild великолепен, за исключением одного незначительного (или серьезного, в зависимости от вашей точки зрения) недостатка. Он перестраивает двоичные файлы каждый раз, когда вы запускаете сборку. Это означает, что для развертывания от ТЕСТА к ПРОИЗВОДСТВУ или ОТ ЭТАПА к ПРОИЗВОДСТВУ (или как там называется ваша предварительная среда), если вы используете MSBuild, вы не продвигаете существующие двоичные файлы из одной среды в другую, вы их перестраиваете. . Это также означает, что вы с уверенностью полагаетесь, что НИЧЕГО не изменилось в репозитории исходного кода с тех пор, как вы выполнили MSBuild в своей предпроизводственной среде. Допуск даже малейшего шанса на изменение чего-либо, серьезного или незначительного, означает, что вы не будете продвигать полностью протестированный продукт в свою производственную среду. Там, где я работаю, это недопустимый риск.

Войдите в Robocopy. Используя Robocopy, вы копируете (надеюсь) полностью протестированный продукт в свою производственную среду. Затем вам нужно будет либо вручную изменить файл web.config / app.config, чтобы он отражал производственную среду, либо использовать для этого инструмент преобразования. Для этой цели я использовал «Инструмент преобразования конфигурации», доступный на SourceForge - он работает так же, как преобразования MSBuild web / app.config.

person Doug H    schedule 24.08.2012