在TFS构建上创建Azure包

时间:2014-06-03 06:14:00

标签: .net azure tfs msbuild azure-web-roles

我希望Azure Package文件成为成功签入版本的输出。我们希望能够从放置位置将这些包发布到Azure。

根据this post,我们只需要csdef文件,以便在命令行中使用cspack创建包文件:

cspack “c:\<path to the csdeffile>\servicedefinition.csdef” /role:<Name of the role as defined in the csdef file>;<location of the binaries> /sites:<Name of the role>;<name of the site path>;<location of the website files>

但我想避免使用命令行。我知道可以使用CSPack任务,但我一直在努力寻找更多信息。我无法在线查找任何规范,希望获得有关this Stackoverflow post的一些信息。

如何将上述cspack命令转换为CSPack构建任务?

我基于MSDN spec for cspack.exe提出了以下内容,但我不得不做出很多假设:

<PropertyGroup>
  <VisualStudioVersion Condition=" '$(VisualStudioVersion)' == '' ">10.0</VisualStudioVersion>
  <CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Windows Azure Tools\2.2\</CloudExtensionsDir>
  <Roles></Roles>
</PropertyGroup>
<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
<Target Name="CreatePackage" DependsOnTargets="Build">
  <CSPack 
      ServiceDefinitionFile="MyCloudProject\ServiceDefinition.csdef"
      Output="$(OutDir)Publish\$(ProjectName).cspkg"
      PackRoles="MyRoleName"
      SiteMapping="MyRoleName;MySiteName;MySitePath"
      RoleProperties="MyRoleName;$(OutDir)Publish\MyProject.dll"
      CopyOnly="false">
  </CSPack>
</Target>

我收到以下构建错误:

  

C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ Windows   Azure Tools \ 2.2 \ Microsoft.WindowsAzure.targets(351):无默认值   服务配置&#34; ServiceConfiguration.cscfg&#34;可以找到   该项目。

说实话,我真的不知道自己在做什么。我已经有一段时间了,所以任何指导都会受到赞赏。

复制cspkg文件将是easy enough,但我似乎无法弄清楚如何执行打包。

我们正在使用Visual Studio Online(基于云的TFS)。

修改

我们确实有云项目。这就是我们发布的方式(右键单击 - &gt;发布)。这显然不是理想的,因为它没有遵循&#34; Build Once&#34;战略,它为更大的团队增加了进一步的复杂性。

@Simon Opelt:使用CorePublish目标是否需要更改构建定义?现在,构建定义使用特定的.build文件(为了执行NuGet还原),然后为解决方案中的所有项目运行Build目标:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OutDir>$(MSBuildThisFileDirectory)bin</OutDir>
    <Configuration>Release</Configuration>
    <ProjectProperties>OutDir=$(OutDir);Configuration=$(Configuration);</ProjectProperties>
  </PropertyGroup>
  <ItemGroup>
    <Solution Include="$(MSBuildThisFileDirectory)*.sln" />
  </ItemGroup>
  <Target Name="RestorePackages">
    <Exec Command="&quot;$(MSBuildThisFileDirectory).nuget\NuGet.exe&quot; restore &quot;%(Solution.Identity)&quot;" />
  </Target>
  <Target Name="Clean">
    <MSBuild Targets="Clean" Projects="@(Solution)" Properties="$(ProjectProperties)" />
  </Target>
  <Target Name="Build" DependsOnTargets="RestorePackages">
    <MSBuild Targets="Build" Projects="@(Solution)" Properties="$(ProjectProperties)" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="RestorePackages">
    <MSBuild Targets="Rebuild" Projects="@(Solution)" Properties="$(ProjectProperties)" />
  </Target>
</Project>

这也构建并运行我们的测试项目。将云项目与CorePublish结合使用仍然允许这个吗?

3 个答案:

答案 0 :(得分:1)

在构建中设置以下属性(通过命令行msbuild / p:开关,或属性页,或任何你喜欢的内容):

PublishDir = [您要将包发布到的文件夹]

PackageForComputeEmulator = true

然后添加一个目标,在构建后打开Publish,如下所示:

  <Target
    Name="BuildPackagesForAzure"
    Condition="'$(DoPackagesInBuild)'=='True'"
    DependsOnTargets="Publish"
    AfterTargets="Build">
      <Message Importance="high" Text="Doing Azure packaging in build." />
  </Target>

答案 1 :(得分:1)

如果您的解决方案包含“云项目”此项目与Azure SDK绑定。如果您编辑项目,您可以看到它导入Microsoft.WindowsAzure.targets文件:

您将在任何.ccproj(云服务)项目中看到对此的引用

<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />

此.targets文件为您执行CSPack:

我的Azure 2.6 SDK中的第3003行目标文件:

 <CSPack
  ServiceDefinitionFile="@(TargetServiceDefinition)"
  Output="@(PublishServicePackage)"
  PackRoles="@(Roles)"
  SiteMapping="@(SiteMapping)"
  RoleProperties="@(RoleProperties)"
  ImportedModules="@(ImportedModules)"
  CopyOnly="false" 
  >
</CSPack>

所以,你只需要正确设置就可以调用这个目标。

默认情况下,它已包含在您的解决方案中的项目中。搜索您的构建输出日志:

CorePublish: PackageWebRole

你应该看看是否正在调用CSPack:

[CorePublish] CorePublish: PackageWebRole = True
[18:56:39] :[CorePublish] Publishing starting...
[18:56:39] :[CorePublish] RolePlugins       is ;
[18:56:39] :[CorePublish] Importedmodules is Diagnostics
[18:56:39] :[CorePublish] Publishing to '...'
[18:56:39] :[CorePublish] MakeDir
[18:56:39] :[MakeDir] Creating directory "...".
[18:56:39] :[CorePublish] TargetServiceDefinition is ...\Deploy\.ReleasePackage\ServiceDefinition.csdef
[18:56:39] :[CorePublish] TargetServiceConfiguration is ...\Deploy\.ReleasePackage\ServiceConfiguration.cscfg
[18:56:39] :[CorePublish] Roles is ...
[18:57:18] :[CorePublish] Copying the service configuration file.
[18:57:18] :[CorePublish] Copy
[18:57:18] :[Copy] Copying file from "...\Deploy\.ReleasePackage\ServiceConfiguration.cscfg" to "...\Deploy\.ReleasePackageapp.publish\ServiceConfiguration.Cloud.cscfg".
[18:57:18] :[CorePublish] Publishing process has completed.

(我删除了特定于我的构建的信息)

在文件中稍早指定输出:

<PublishServicePackage Include="$(PublishDir)$(TrailingSlashChar)$(ProjectName).cspkg" />

因此,如果您拥有SDK,则不必手动调用CSPack。您必须拥有SDK才能创建云项目。只需确保在构建机器上安装SDK!

答案 2 :(得分:0)

我无法使CSPack任务正常工作。我遇到了无数问题,所以我直接执行了cspack.exe

<PropertyGroup>
  <PackageCommand>
    "C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\bin\cspack.exe" $(OutputPath)ServiceDefinition.csdef /role:MyRoleName;$(OutputPath) /sites:MyRoleName;MySiteName;$(OutputPath) /rolePropertiesFile:MyRoleName;$(OutputPath)RoleProperties.txt /out:$(OutputPath)Publish\MyRoleName.cspkg /useCtpPackageFormat
  </PackageCommand>
</PropertyGroup>
<Target Name="CreatePackage" DependsOnTargets="Build" AfterTargets="Build">
  <MakeDir Directories="$(OutputPath)Publish"></MakeDir>
  <Message Text="Using cspack create a package for deployment..."></Message>
  <Exec Command="$(PackageCommand)"></Exec>
</Target>