Автономное приложение в MSBuild Remote Web Deploy
У меня есть следующая задача в моем сценарии MSBuild для развертывания на удаленном сервере с помощью Web Deploy (служба MSDeploy):
<Target Name="Deploy">
<MSBuild
Projects="$(SolutionFile)"
Properties="Configuration=Release; DeployOnBuild=True;
DeployTarget=MsDeployPublish; MSDeployPublishMethod=WMSvc;
MsDeployServiceUrl=$(DeployServiceUrl);
DeployIisAppPath=$(DeployIisAppPath);
UserName=$(DeployUserName); Password=$(DeployPassword);
CreatePackageOnPublish=True; AllowUntrustedCertificate=True" />
</Target>
Он работает нормально. Тем не менее, я хотел бы разместить app_offline.htm-файл (на удаленном сервере) перед развертыванием приложения и удалением app_offline.HTM файл после развертывания (или при ошибке). Есть ли свойство MSBuild или любая другая настройка скриптов, чтобы это произошло?
спасибо заранее.
2 ответов
Я недавно написал об этом в блоге http://sedodream.com/2012/01/08/HowToTakeYourWebAppOfflineDuringPublishing.aspx. Это сложнее, чем должно быть, и я работаю над упрощением этого для более поздней версии. В любом случае, я вложил все содержимое сюда для вас.
я получил электронное письмо клиента с вопросом, как они могут отключить свое веб-приложение/сайт в течение всего периода публикации из Visual Studio. Простой способ взять сайт в автономном режиме, чтобы удалить app_offline.HTM файл в корневом каталоге сайтов. Для получения дополнительной информации об этом вы можете прочитать сообщение ScottGu, ссылку ниже в разделе ресурсов. К сожалению, Web Deploy сам по себе не поддерживает это . Если вы хотите, чтобы Web Deploy (он же MSDeploy) изначально поддерживал эту функцию, проголосуйте за нее по адресу http://aspnet.uservoice.com/forums/41199-general/suggestions/2499911-take-my-site-app-offline-during-publishing.
поскольку Web Deploy не поддерживает это это будет немного сложнее, и это требует от нас выполнить следующие действия:
- публикации app_offline.НТМ
- опубликуйте приложение и убедитесь, что app_offline.htm содержится внутри публикуемой полезной нагрузки
- удалить app_offline.НТМ
1 будет принимать приложение в автономном режиме до начала процесса публикации.
2 будет гарантировать, что, когда мы публикуем, что app_offline.НТМ не удаляется (и, следовательно, держать приложение в автономном режиме)
3 удалит app_offline.htm и вернуть сайт в онлайн
Теперь, когда мы знаем, что нужно сделать, давайте посмотрим на реализацию. Первая легкая часть. Создайте файл в проекте веб-приложения (WAP) с именем app_offline-template.htm. Это будет файл, который в конечном итоге будет app_offline.htm-файл на целевом сервере. Если вы оставите его пустым, ваши пользователи получат общий сообщение о том, что приложение находится в автономном режиме, но лучше бы для вас место статический HTML (нет ASP.NET разметка) внутри этого файла, давая пользователям знать, что сайт вернется и любая другая информация, которую вы считаете актуальной для ваших пользователей. Когда вы добавляете этот файл, Вы должны изменить действие сборки на None в сетке свойств. Это гарантирует, что сам файл не будет опубликован/упакован. Так как файл заканчивается .htm по умолчанию будет опубликован. Видеть изображение под.
Теперь самое трудное. Для проектов веб-приложений у нас есть крючок в процессе публикации/пакета, который мы называем "wpp.контрольные цели." Если вы хотите расширить процесс публикации / пакета, вы можете создать файл с именем {ProjectName}.АС ТПП.цели в той же папке, что и сам файл проекта. Вот файл, который я создал, вы можете скопировать и вставить содержимое в ваш ВЭС.целевой файл. Я объясню значительные части, но хотел бы опубликовать весь файл для вашего убеждения. Примечание: Вы можете захватить мою последнюю версию этого файла из моего репозитория github, ссылка находится в разделе ресурсов ниже.
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="InitalizeAppOffline">
<!--
This property needs to be declared inside of target because this is imported before
the MSDeployPath property is defined as well as others -->
<PropertyGroup>
<MSDeployExe Condition=" '$(MSDeployExe)'=='' ">$(MSDeployPath)msdeploy.exe</MSDeployExe>
</PropertyGroup>
</Target>
<PropertyGroup>
<PublishAppOfflineToDest>
InitalizeAppOffline;
</PublishAppOfflineToDest>
</PropertyGroup>
<!--
%msdeploy%
-verb:sync
-source:contentPath="C:\path\to\app_offline-template.htm"
-dest:contentPath="Default Web Site/AppOfflineDemo/app_offline.htm"
-->
<!--***********************************************************************
Make sure app_offline-template.htm gets published as app_offline.htm
***************************************************************************-->
<Target Name="PublishAppOfflineToDest"
BeforeTargets="MSDeployPublish"
DependsOnTargets="$(PublishAppOfflineToDest)">
<ItemGroup>
<_AoPubAppOfflineSourceProviderSetting Include="contentPath">
<Path>$(MSBuildProjectDirectory)\app_offline-template.htm</Path>
<EncryptPassword>$(DeployEncryptKey)</EncryptPassword>
<WebServerAppHostConfigDirectory>$(_MSDeploySourceWebServerAppHostConfigDirectory)</WebServerAppHostConfigDirectory>
<WebServerManifest>$(_MSDeploySourceWebServerManifest)</WebServerManifest>
<WebServerDirectory>$(_MSDeploySourceWebServerDirectory)</WebServerDirectory>
</_AoPubAppOfflineSourceProviderSetting>
<_AoPubAppOfflineDestProviderSetting Include="contentPath">
<Path>"$(DeployIisAppPath)/app_offline.htm"</Path>
<ComputerName>$(_PublishMsDeployServiceUrl)</ComputerName>
<UserName>$(UserName)</UserName>
<Password>$(Password)</Password>
<EncryptPassword>$(DeployEncryptKey)</EncryptPassword>
<IncludeAcls>False</IncludeAcls>
<AuthType>$(AuthType)</AuthType>
<WebServerAppHostConfigDirectory>$(_MSDeployDestinationWebServerAppHostConfigDirectory)</WebServerAppHostConfigDirectory>
<WebServerManifest>$(_MSDeployDestinationWebServerManifest)</WebServerManifest>
<WebServerDirectory>$(_MSDeployDestinationWebServerDirectory)</WebServerDirectory>
</_AoPubAppOfflineDestProviderSetting>
</ItemGroup>
<MSdeploy
MSDeployVersionsToTry="$(_MSDeployVersionsToTry)"
Verb="sync"
Source="@(_AoPubAppOfflineSourceProviderSetting)"
Destination="@(_AoPubAppOfflineDestProviderSetting)"
EnableRule="DoNotDeleteRule"
AllowUntrusted="$(AllowUntrustedCertificate)"
RetryAttempts="$(RetryAttemptsForDeployment)"
SimpleSetParameterItems="@(_AoArchivePublishSetParam)"
ExePath="$(MSDeployPath)" />
</Target>
<!--***********************************************************************
Make sure app_offline-template.htm gets published as app_offline.htm
***************************************************************************-->
<!-- We need to create a replace rule for app_offline-template.htm->app_offline.htm for when the app get's published -->
<ItemGroup>
<!-- Make sure not to include this file if a package is being created, so condition this on publishing -->
<FilesForPackagingFromProject Include="app_offline-template.htm" Condition=" '$(DeployTarget)'=='MSDeployPublish' ">
<DestinationRelativePath>app_offline.htm</DestinationRelativePath>
</FilesForPackagingFromProject>
<!-- This will prevent app_offline-template.htm from being published -->
<MsDeploySkipRules Include="SkipAppOfflineTemplate">
<ObjectName>filePath</ObjectName>
<AbsolutePath>app_offline-template.htm</AbsolutePath>
</MsDeploySkipRules>
</ItemGroup>
<!--***********************************************************************
When publish is completed we need to delete the app_offline.htm
***************************************************************************-->
<Target Name="DeleteAppOffline" AfterTargets="MSDeployPublish">
<!--
%msdeploy%
-verb:delete
-dest:contentPath="{IIS-Path}/app_offline.htm",computerName="...",username="...",password="..."
-->
<Message Text="************************************************************************" />
<Message Text="Calling MSDeploy to delete the app_offline.htm file" Importance="high" />
<Message Text="************************************************************************" />
<ItemGroup>
<_AoDeleteAppOfflineDestProviderSetting Include="contentPath">
<Path>$(DeployIisAppPath)/app_offline.htm</Path>
<ComputerName>$(_PublishMsDeployServiceUrl)</ComputerName>
<UserName>$(UserName)</UserName>
<Password>$(Password)</Password>
<EncryptPassword>$(DeployEncryptKey)</EncryptPassword>
<AuthType>$(AuthType)</AuthType>
<WebServerAppHostConfigDirectory>$(_MSDeployDestinationWebServerAppHostConfigDirectory)</WebServerAppHostConfigDirectory>
<WebServerManifest>$(_MSDeployDestinationWebServerManifest)</WebServerManifest>
<WebServerDirectory>$(_MSDeployDestinationWebServerDirectory)</WebServerDirectory>
</_AoDeleteAppOfflineDestProviderSetting>
</ItemGroup>
<!--
We cannot use the MSDeploy/VSMSDeploy tasks for delete so we have to call msdeploy.exe directly.
When they support delete we can just pass in @(_AoDeleteAppOfflineDestProviderSetting) as the dest
-->
<PropertyGroup>
<_Cmd>"$(MSDeployExe)" -verb:delete -dest:contentPath="%(_AoDeleteAppOfflineDestProviderSetting.Path)"</_Cmd>
<_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.ComputerName)' != '' ">$(_Cmd),computerName="%(_AoDeleteAppOfflineDestProviderSetting.ComputerName)"</_Cmd>
<_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.UserName)' != '' ">$(_Cmd),username="%(_AoDeleteAppOfflineDestProviderSetting.UserName)"</_Cmd>
<_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.Password)' != ''">$(_Cmd),password=$(Password)</_Cmd>
<_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.AuthType)' != ''">$(_Cmd),authType="%(_AoDeleteAppOfflineDestProviderSetting.AuthType)"</_Cmd>
</PropertyGroup>
<Exec Command="$(_Cmd)"/>
</Target>
</Project>
1 опубликовать app_offline.НТМ
реализация для #1 содержится внутри целевого объекта PublishAppOfflineToDest. На средства msdeploy.exe команда, которую нам нужно выполнить.
msdeploy.exe
-source:contentPath='C:\Data\Personal\My Repo\sayed-samples\AppOfflineDemo01\AppOfflineDemo01\app_offline-template.htm'
-dest:contentPath='"Default Web Site/AppOfflineDemo/app_offline.htm"',UserName='sayedha',Password='password-here',ComputerName='computername-here',IncludeAcls='False',AuthType='NTLM' -verb:sync -enableRule:DoNotDeleteRule
для этого я буду использовать задачу MSDeploy. Внутри цели PublishAppOfflineToDest вы можете увидеть как это достигается путем создания элемента как для источника, так и для назначения.
2 опубликуйте приложение и убедитесь, что app_offline.htm содержится внутри публикуемой полезной нагрузки
эта часть выполняется фрагмент
<!--***********************************************************************
Make sure app_offline-template.htm gets published as app_offline.htm
***************************************************************************-->
<!-- We need to create a replace rule for app_offline-template.htm->app_offline.htm for when the app get's published -->
<ItemGroup>
<!-- Make sure not to include this file if a package is being created, so condition this on publishing -->
<FilesForPackagingFromProject Include="app_offline-template.htm" Condition=" '$(DeployTarget)'=='MSDeployPublish' ">
<DestinationRelativePath>app_offline.htm</DestinationRelativePath>
</FilesForPackagingFromProject>
<!-- This will prevent app_offline-template.htm from being published -->
<MsDeploySkipRules Include="SkipAppOfflineTemplate">
<ObjectName>filePath</ObjectName>
<AbsolutePath>app_offline-template.htm</AbsolutePath>
</MsDeploySkipRules>
</ItemGroup>
значение элемента для FilesForPackagingFromProject здесь преобразует ваш app_offline-шаблон.htm в app_offline.htm в папке, из которой будет обрабатываться публикация. Также есть условие, чтобы это происходит только во время публикации, а не упаковка. Мы не хотим app_offline-шаблон.htm должен быть в пакете (но это не конец света, если он это делает).
элемент для MsDeploySkiprules будет убедиться, что app_offline-шаблон.сам htm не публикуется. Это может быть не требуется, но это не должно повредить.
3 Удалить app_offline.НТМ
Теперь, когда наше приложение опубликовано, нам нужно удалить app_offline.htm-файл из веб-приложения dest. На средства msdeploy.команда exe будет:
%средства msdeploy% - глагол: удалить - dest: contentPath= " {IIS-Path} / app_offline.htm", computerName="...",имя пользователя."=..",пароль."=.."
это реализовано внутри цели DeleteAppOffline. Эта цель будет автоматически выполняться после публикации, потому что я включил атрибут AfterTargets="MSDeployPublish". В этой цели вы можете видеть, что я создаю msdeploy.команда exe напрямую, она выглядит как Задача MSDeploy не поддерживает команду delete.
Если вы попробуете это, пожалуйста, дайте мне знать, если вы столкнетесь с любым вопросам. Я думаю создать пакет Nuget из этого, чтобы вы могли просто установить этот пакет. Это займет немного работы, поэтому, пожалуйста, дайте мне знать, если вы заинтересованы в этом.
ресурсы
- последняя версия моей AppOffline wpp.файл мишени!--5-->
- ScottGu на app_offline.НТМ
теперь это поддерживается WebDeploy v3.0.. все, что вам нужно сделать, это добавить эту строку в свой профиль публикации в "Properties\PublishProfiles"
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
таким образом, результирующий профиль публикации будет выглядеть примерно следующим образом.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<MSDeployServiceURL>(removed)</MSDeployServiceURL>
<DeployIisAppPath>Default Web Site</DeployIisAppPath>
<AllowUntrustedCertificate>True</AllowUntrustedCertificate>
<SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
<DeployAsIisApp>False</DeployAsIisApp>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
<UserName>sayedha</UserName>
<ExcludeApp_Data>False</ExcludeApp_Data>
<_SavePWD>True</_SavePWD>
</PropertyGroup>
</Project>
я протестировал это, и он принимает мое приложение в автономном режиме во время развертывания, но, к сожалению, я все еще иногда получаю " PrecompiledApp.config находится в used ' ошибка.
более подробную информацию об этом можно найти здесь: http://blogs.msdn.com/b/webdev/archive/2013/10/30/web-publishing-updates-for-app-offline-and-usechecksum.aspx