可以从命令行打包Windows Azure云项目,但不能部署到Windows Azure本身

可以从命令行打包Windows Azure云项目,但不能部署到Windows Azure本身,azure,msbuild,build-automation,Azure,Msbuild,Build Automation,我们有一个解决方案,其特点是一个web应用程序项目将作为Windows Azure云服务中的web角色。它还承担一个仅针对云服务的云服务项目(生产槽) SlnRoot\WebApp1\WebApp1.csproj SlnRoot\CloudDeployment\CloudServiceName\CloudServiceName.ccproj 从VisualStudio发布(部署)非常容易;只需选择发布。。。从云项目的上下文菜单中选择,并点击Publish,使用所有预配置的云服务设置 现在,我们将

我们有一个解决方案,其特点是一个web应用程序项目将作为Windows Azure云服务中的web角色。它还承担一个仅针对云服务的云服务项目(生产槽)

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

从VisualStudio发布(部署)非常容易;只需选择发布。。。从云项目的上下文菜单中选择,并点击Publish,使用所有预配置的云服务设置

现在,我们将进一步尝试自动化此过程,因此我将在没有VisualStudio帮助的情况下,从命令行和原始MSBuild中进行尝试

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

但发布目标似乎实际上是VisualStudio中的包选项,只生成必须手动上载到WindowsAzure门户的cspkg文件。这当然不行。是否要指定一个单独的目标来执行Visual Studio如此轻松地执行的附加步骤(不是部署;没有这样的目标?

获取CSPKG和CSCONFIG文件后,您需要“手动”发布项目。MSBuild不发布该项目。您可以使用发布项目。是您正在查找的cmdlet

您还可以在Azure AD租户(每个Azure订阅都有)中配置一个(或多个)用户,并使用PowerShell启用全自动部署,而无需.publishsettings文件和客户端证书。检查我的电脑

更新

非常直接且易于使用的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"
添加AzureAccount
选择AzureSubscription“”
设置AzureSubscription-SubscriptionName“”`
-CurrentStorageAccountName“”
新AzureDeployment-服务名称“”`
-包“D:/tmp/cloud/myservice.cspkg”`
-配置“D:/tmp/cloud/ServiceConfiguration.cloud.cscfg”`
-插槽“暂存”
和升级脚本:

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"
添加AzureAccount
选择AzureSubscription“”
设置AzureSubscription-SubscriptionName“”`
-CurrentStorageAccountName“”
设置AzureDeployment-升级`
-服务名称“”`
-包“D:/tmp/cloud/myservice.cspkg”`
-配置“D:/tmp/cloud/ServiceConfiguration.cloud.cscfg”`
-插槽“暂存”
对于
Slot
,您可以使用
Staging
Production
。对于使用发布设置文件的情况,只需将
添加AzureAccount
替换为
导入AzurePublishSettingsFile


注意,这些都是经过验证的脚本

正如astaykov所指出的,MSBuild本身不知道如何部署到Azure,但您可以进行部署

即使使用publishsettings文件,除了发布命令外,还需要执行一些其他命令来执行部署:

  • -要使用这些设置
  • -用于设置默认存储帐户(您将在其中从msbuild上载包)
  • -用于更新powershell上下文的订阅
  • -获取要将包上载到的容器
  • -如果容器不存在,则非常有用
  • -将包上载到blob存储
  • -阅读关于blob的信息,就像它是Uri一样
  • -获取有关服务插槽中部署的信息-在dpleoyment之前、等待实例启动时非常有用,等等
  • -删除部署-如果发布到暂存并将VIP交换发布到生产中,则非常有用
  • -从服务中的给定包(blob)、配置等创建新部署
  • -VIP交换暂存/生产插槽
  • -可用于更改部署的状态
我在这里发布了一篇关于构建示例发布脚本的帖子:

在构建遵循“部署到登台和VIP交换到生产”路径的部署脚本时,可以更深入地了解使用这些脚本的过程,但许多细节仍然与直接升级部署相关

我对几个项目使用了类似的方法,但更进一步,在msbuild调用和打包之间交换配置项目


关于“发布设置”与凭据,我认为这取决于您将在何处运行这些构建(以及谁有权访问该环境),以及您是否更喜欢基于构建过程中的可移植性和可见性/访问的证书启用访问或一组凭据。不过,很多核心步骤都是相同的。

谢谢您的建议。然而,我的知识差距的真正答案——MSBuild和PowerShell最初是如何结合在一起的——来自我的同事,他编写了一个自定义MSBuild项目文件,以使它们能够一起工作。下面是一个带有注释的基本示例

<?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>

从Build vNext源代码部署到Azure云服务的脚本的一个很好的示例:

提供给MSBuild的发布目标已经准备好了cspkg;无需手动调用cspack.exe。cspkg生产后的部署活动才是这里的关注点。明白了。完全修改了答案。必须使用Azure广告吗?我们没有使用它,只使用我们各自的Microsoft Live ID帐户。我试图在cspkg上应用Publish AzureServiceProject[Publish AzureServiceProject-Package“cloud\u Package.cspkg”-Configuration“ServiceConfiguration.cloud.cscfg”-StorageAccountName“storageaccount”-ForceUpgrade-verbose],但它抛出了错误“在证书存储中未找到指纹为0FA5BC4AC53C1DE3619BFEE0A39B0E89A57E564C的证书”ID
msbuild.exe custom.proj /t:DeployCloud