【问题标题】:Create Azure package on TFS build在 TFS 构建上创建 Azure 包
【发布时间】:2014-07-23 09:09:50
【问题描述】:

我希望 Azure 包文件成为成功签入构建的输出。我们希望能够从放置位置将这些包发布到 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 工具\2.2\Microsoft.WindowsAzure.targets (351):无默认值 服务配置“ServiceConfiguration.cscfg”可以在 项目。

说实话,我真的不知道自己在做什么。我已经有一段时间了,所以任何指导将不胜感激。

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

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

编辑:

我们确实有云项目。这就是我们发布的方式(右键单击 -> 发布)。这显然并不理想,因为它没有遵循“一次构建”的策略,并且会在更大的团队中增加更多的复杂性。

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

<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 结合使用是否仍然允许这样做?

【问题讨论】:

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


【解决方案1】:

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

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

PackageForComputeEmulator = true

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

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

【讨论】:

  • 但是我究竟如何获得要构建的包?如何编写CSPack 任务,以便在构建解决方案后创建我的包?
  • @davenewza 尝试更新您的 CsPack 目标以包含 AfterTargets 属性
  • @Nicodemeus:谢谢,但我仍然收到错误“项目中找不到默认服务配置“ServiceConfiguration.cscfg”。”
  • @davenewza:这是您需要在构建过程中指定某个位置的设置(Visual Studio 在该环境中为您执行此操作,但在 MSBuild- 和 TFS- 构建中您必须指定它)。对我们来说,我们在 CCProj 文件的顶部设置了默认的“TargetProfile”,类似于默认平台和配置的设置方式:&lt;TargetProfile Condition=" '$(TargetProfile)' == '' "&gt;Cloud&lt;/TargetProfile&gt;。当然,在命令行中,您可以使用 /p:TargetProfile=Production 覆盖它。
【解决方案2】:

如果您的解决方案包含“云项目”此项目与 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!

【讨论】:

    【解决方案3】:

    我无法让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>
    

    【讨论】:

    • 这个部分属于哪个文件?它是 .ccproj 文件吗? (Azure 服务项目文件)
    • 不,我不使用.ccproj 文件来创建包。以上是我的主要 MSBuild 构建文件。
    • 保持构建文件与 Visual Studio 项目文件同步不是额外的工作吗?
    • 并非如此。其他 VS 项目文件仍然参与构建。此构建文件只是在构建解决方案中的所有项目之前协调某些事情(例如 Auto NuGet Restore 和此 cspack 过程)。请注意,此构建文件仅由我们在 TFS 上的 CI 构建使用。
    猜你喜欢
    • 2015-07-31
    • 2012-04-21
    • 2018-05-24
    • 2015-12-02
    • 2017-10-16
    • 1970-01-01
    • 2015-04-13
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多