2014-09-25 3 views
5

У нас есть решение с проектом веб-приложений, предназначенным как веб-роль в облачном сервисе Windows Azure. Он также несет проект облака службы, нацеленные на облачный сервис только (слот производства)Может пакет Windows Azure облачный проект из командной строки, но не развертывается в Windows Azure

SlnRoot \ WebApp1 \ WebApp1.csproj SlnRoot \ CloudDeployment \ CloudServiceName \ CloudServiceName.ccproj

Publishing (развертывание) из Visual Studio является очень просто; просто выберите параметр «Опубликовать ...» в контекстном меню облачного проекта и нажмите «Опубликовать» со всеми предварительно настроенными настройками облачного сервиса.

Теперь мы собираемся сделать еще один шаг, чтобы автоматизировать этот процесс, поэтому я пытаюсь выполнить его из командной строки и raw MSBuild без помощи Visual Studio.

.nuget\nuget.exe restore 
msbuild .\CloudDeployment\CloudServiceName\CloudServiceName.ccproj /t:Publish /p:PublishDir=..\..\pubout\ /fl1 /v:d 

Но, похоже, цель Publish в действительности вариант пакета в Visual Studio, только генерации файла cspkg, который должен быть вручную загружены в Windows Azure портала. Конечно, этого не будет. Есть ли отдельная цель, чтобы указать для выполнения дополнительного шага (Deploy не так ли, нет такой цели), которую Visual Studio выполняет так легко?

ответ

5

Спасибо за ваш совет. Истинный ответ на пробел в моих знаниях - как, собственно, и MSBuild и PowerShell, в первую очередь, - это мой коллега, который создал собственный файл MSBuild proj, чтобы все это работало вместе.Базовый образец следует с комментариями

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" 
     DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<!-- Declare configuration properties for this deployment --> 
<!-- This custom.proj file is in a sub-directory in solution root --> 

    <PropertyGroup> 
    <SolutionDir Condition=" '$(SolutionDir)'=='' ">$(MSBuildThisFileDirectory)..\</SolutionDir> 
    <SolutionPath Condition=" '$(SolutionPath)'=='' ">$(MSBuildThisFileDirectory)..\CloudService.sln</SolutionPath> 
    <OutDir Condition=" '$(OutDir)'=='' ">$(MSBuildThisFileDirectory)\Output\Binaries\</OutDir> 
    <PackageOutDir>$(MSBuildThisFileDirectory)Output\Packages\</PackageOutDir> 
    <TargetCloudService>targetcloudservice</TargetCloudService> 
    <DeployConfig>BuildConfig</DeployConfig> 
    <PubSettingsPath>$(MSBuildThisFileDirectory)subscription.publishsettings</PubSettingsPath> 
    <SubscriptionName>subscription name</SubscriptionName> 
    <StorageAccount>targetstorageaccount</StorageAccount> 
    </PropertyGroup> 


<!-- Target to restore all Nuget packages on a clean repo pull. --> 

    <Target Name="RestorePackages"> 
    <Message Text="Restoring nuget..."/> 
    <Exec Command="&quot;$(SolutionDir).nuget\NuGet.exe&quot; restore &quot;$(SolutionPath)&quot;" /> 
    </Target> 

<!-- 
Target to package the indicated cloud project, 
which will build the referenced web role project first with desired build config. 
--> 

    <Target Name="PackageCloud" DependsOnTargets="RestorePackages"> 
    <Message Text="Creating package for cloud deployment ..."/> 
    <MSBuild 
     Projects="$(MSBuildThisFileDirectory)..\CloudDeployment\$(TargetCloudService)\$(TargetCloudService).ccproj" 
     Properties="OutputPath=$(PackageOutDir)$(TargetCloudService)\;Configuration=$(DeployConfig);" 
     Targets="Publish"/> 
    </Target> 


<!-- 
Target to deploy the package produced by the dependency target. 
This is the part that launches PowerShell to execute custom ps1 script 
with all the cloud service parameters (MSBuild variables above) 
and cspkg package for deployment. 
The custom script uses the Azure module cmdlets to make service checks and publish. 
--> 

    <Target Name="DeployCloud" DependsOnTargets="PackageCloud"> 
    <Message Text="Deploying package to cloud service ..."/> 
    <Exec WorkingDirectory="$(MSBuildThisFileDirectory)" 
     Command="$(windir)\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -f $(MSBuildThisFileDirectory)PublishCloudService.ps1 -packageLocation &quot;$(PackageOutDir)$(TargetCloudService)\app.publish\$(TargetCloudService).cspkg&quot; -cloudConfigLocation &quot;$(PackageOutDir)$(TargetCloudService)\app.publish\ServiceConfiguration.Cloud.cscfg&quot; -subscriptionDataFile &quot;$(PubSettingsPath)&quot; -selectedsubscription &quot;$(SubscriptionName)&quot; -servicename $(TargetCloudService) -storageAccountName $(StorageAccount)" /> 
    </Target> 
</Project> 

Так один выстрел вызов развертывания будет что-то вроде

msbuild.exe custom.proj /t:DeployCloud 
3

После получения файлов CSPKG и CSCONFIG вам необходимо «вручную» опубликовать проект. MSBuild не публикует проект. Вы можете использовать Azure PowerShell, чтобы опубликовать проект. Publish-AzureService - это командлет, который вы ищете.

Вы также можете настроить одного (или более) пользователя в вашем арендаторе Azure AD (что у каждой подписки Azure) и включить полностью автоматическое развертывание с помощью PowerShell без необходимости .publishsettings файлов и клиентских сертификатов. Проверьте мой Non-interactive login with Azure PowerShell and Azure AD blog post.

UPDATE

Справедливо Прямой вперед и простой в использовании PowerShell скрипт для создания нового развертывания на существующих облачных услуг и существующий счет хранения:

Add-AzureAccount 
Select-AzureSubscription "<subscription name>" 
Set-AzureSubscription -SubscriptionName "<subscription name>" ` 
         -CurrentStorageAccountName "<storage_account_name>" 
New-AzureDeployment -ServiceName "<cloud_service_name>" ` 
        -Package "D:/tmp/cloud/myservice.cspkg" ` 
        -Configuration "D:/tmp/cloud/ServiceConfiguration.Cloud.cscfg" ` 
        -Slot "Staging" 

и обновить сценарий:

Add-AzureAccount 
Select-AzureSubscription "<subscription name>" 
Set-AzureSubscription -SubscriptionName "<subscription name>" ` 
         -CurrentStorageAccountName "<storage_account_name>" 
Set-AzureDeployment -Upgrade ` 
        -ServiceName "<cloud_service_name>" ` 
        -Package "D:/tmp/cloud/myservice.cspkg" ` 
        -Configuration "D:/tmp/cloud/ServiceConfiguration.Cloud.cscfg" ` 
        -Slot "Staging" 

Для Slot вы можете использовать Staging или Production. Для случая, когда вы используете файл настроек публикации, просто замените Add-AzureAccount на Import-AzurePublishSettingsFile.

Обратите внимание, что это проверенные сценарии.

+0

Публикация цели, поставляемой в MSBuild, уже готовит cspkg; нет необходимости вручную вызывать cspack.exe. Это активность _deployment_ после создания cspkg, которая здесь интересна. – icelava

+0

получил. полностью пересмотренный ответ. – astaykov

+0

Должен Azure AD использоваться? Мы не используем это и используем только отдельные учетные записи Microsoft Live ID. – icelava

3

Как отметил Астайков, MSBuild сам по себе не знает, как развернуть на Azure, но вы можете install the Azure Powershell SDK выполнить развертывание.

Даже используя файл publishsettings, есть еще некоторые дополнительные команды, которые необходимо выполнить, чтобы сделать развертывание за просто опубликовать один:

  • Import-AzurePublishSettingsFile - использовать настройки
  • Set-AzureSubscription - используется для установки счет для хранения по умолчанию (там, где вы будете загружать пакет из MSBuild)
  • Select-AzureSubscription - используется для обновления подписки для контекста Powershell
  • Get-AzureStorageContainer - получить контейнер вы собираетесь загрузить пакет
  • New-AzureStorageContainer - полезно, если контейнер не существует
  • Set-AzureStorageBlobContent - Загрузить пакет в хранилище больших двоичных объектов
  • Get-AzureStorageBlob - Читайте информацию о сгустка, любит это Uri
  • Get-AzureDeployment - Получить информацию о развертывании в слоте вашей службы - полезно, прежде чем dpleoyment, во время ожидания экземпляров, чтобы начать, и т.д.
  • Remove-AzureDeployment - Удаляет развертывание - полезно, если вы опубликуете для постановки и VIP свопа в производство
  • New-AzureDeployment - Создание нового развертывания из данного пакета (BLOB), конфигурации и т.д. в службе
  • Move-AzureDeployment - VIP своп постановка/производство слотов
  • Set-AzureDeployment - Может быть использован для изменения статуса развертывания

у меня есть пост вокруг построения сценария образец публикации здесь: Automated Deployment to Azure Hosted Services

Она проходит через процесс более подробно, чтобы использовать эти сценарии в построении сценария развертывания, который следует «развернуть на устроив nd VIP swap in production ", но многие детали по-прежнему актуальны для прямого развертывания обновления.

Я использую аналогичный метод для нескольких проектов, но сделайте еще один шаг и замените проекты конфигурации между вызовом msbuild и упаковкой.

В отношении «настроек публикации» и учетных данных я думаю, что это сводится к тому, что вы собираетесь запускать эти сборки (и у кого есть доступ к этой среде), и чувствуете ли вы более комфортно с сертификатом, обеспечивающим доступ или набор учетных данных, основанный на переносимости и видимости/доступе в процессе сборки. Однако многие основные шаги будут одинаковыми.

0

Хороший пример сценария, который развертывает к Cloud Service Azure от сборки vNext исходного кода: Publish-AzureCloudDeployment.ps1

+0

У вас есть пример использования скрипта? У меня есть ошибки с Import-VstsLocStrings и все вещи Vsts – user2088807

+0

Извините, на данный момент у меня его нет. Я предполагаю, что есть модуль powershell или оснастка lib, в которой есть эти недостающие зависимости. – vezenkov

Смежные вопросы