Azure:是否有一种方法可以为测试/生产部署不同的实例大小?

20

我有一个部署在两个托管服务上的Windows Azure网站,一个用于测试,一个用于生产。当我们准备推向生产环境时,我们会在生产服务中启动一个临时部署,将代码推送到那里,然后进行VIP交换。一切都很好。

现在的问题是,我们想要升级至更高规格的Web实例,但是在测试部署上花费额外的费用没有意义。有没有办法在测试使用XS实例,在生产中使用中等实例?我知道可以更改每个服务配置的实例数量,但是我只能将所有配置的实例大小更改为相同。

我考虑只在配置文件中保留XS设置,并在部署到生产环境之前记得将其更改为Medium。有没有什么理由不这样做?还有更好的方法吗?

谢谢!


1
您可能还想查看多云配置文件的内置支持:http://www.nickharris.net/2011/08/using-the-new-windows-azure-tools-v1-4-for-vs2010/ 或者更加超级动态的:http://blogs.msdn.com/b/philliphoff/archive/2012/07/02/transform-windows-azure-service-model-files-during-packaging.aspx - codingoutloud
1
另一篇方便的文章在这里:http://blogs.msdn.com/b/microsoft_press/archive/2015/03/12/guest-article-microsoft-azure-dev-test-scenario-considerations.aspx - Rory
5个回答

23
有几种方法可以做到这一点... 更简单的方法是对CCPROJ文件进行一些“黑客”操作:
1)为与配置名称(Release/Debug/QA/UAT等)匹配的每个环境创建CSDEF文件的克隆:ServiceDefinition.Release.csdef,ServiceDefinition.Debug.csdef等。
2)使用记事本编辑器将这些文件手动添加到CCPROJ文件中。
3)定义一个Pre-Build事件命令,将ServiceDefinition.$(ConfigurationName).csdef复制到ServiceDefintion.csdef中。
voila,现在您的ServiceDefintion将适应您正在使用的任何配置。
如果您想变得更加高级或查看更多细节,请查看此博客条目,它可以帮助您同时切换各种设置。

http://www.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other-cloud-based-NET-solution.aspx

编辑:这里有一个可行的配置。请注意,其他文件被包括为“None”类型,而不是“ServiceDefinition”,以避免多个定义错误。
  <ItemGroup>
    <ServiceConfiguration Include="ServiceConfiguration.Local.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.Development 1.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.Development 2.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.Local Dev 1.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.Local Dev 2.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.QA 1.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.QA 2.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.Pre-Production 1.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.Production.cscfg" />
    <ServiceDefinition Include="ServiceDefinition.csdef" />
    <None Include="ServiceDefinition.Local.csdef" />
    <None Include="ServiceDefinition.Development 1.csdef" />
    <None Include="ServiceDefinition.Development 2.csdef" />
    <None Include="ServiceDefinition.Local Dev 1.csdef" />
    <None Include="ServiceDefinition.Local Dev 2.csdef" />
    <None Include="ServiceDefinition.QA 1.csdef" />
    <None Include="ServiceDefinition.QA 2.csdef" />
    <None Include="ServiceDefinition.Pre-Production 1.csdef" />
    <None Include="ServiceDefinition.Production.csdef" />
  </ItemGroup>

非常感谢。我遇到的唯一问题是Azure项目无法使用多个.csdef文件构建。不过,只需省略您解决方案中的第2步,似乎所有问题都可以解决。错误信息为“Microsoft.WindowsAzure.targets(845,5): error : WAT020 : 只能激活一个服务定义。” - ManicBlowfish
@Igorek:你的博客文章缺少图片,能修复一下吗?我也对解决方案很感兴趣。 - DeepSpace101
@Sid:图片已经恢复。感谢您的耐心等待。 - Igorek

15

您可以使用Web Publishing的TransformXml MSBuild任务来仅转换您想要的ServiceDefinition部分(就像您现在可以使用Web.Config一样)。

  • 在ServiceDefinition.csdef文件旁边创建一个ServiceDefinition.[BuildConfigName].csdef文件(您可能需要在文件资源管理器中执行此操作)
  • 像创建Web.config transform一样创建转换文件。我明确设置了根命名空间,以防万一,所以我的根元素是:
  <ServiceDefinition name="Cloud.JobsWorker" 
          xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" 
          xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"
          schemaVersion="2013-10.2.2">
  • 手动将其添加到您的ccproj中,使用:
  <ServiceDefinition Include="ServiceDefinition.csdef" />
  <None Include="ServiceDefinition.Release.csdef" />
  • 在您的项目底部包含:
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <PropertyGroup>
    <ServiceDefinitionTransform>ServiceDefinition.$(Configuration).csdef</ServiceDefinitionTransform>
  </PropertyGroup>
  <Target Name="TransformServiceDefinition" BeforeTargets="ResolveServiceDefinition" Condition="exists('$(ServiceDefinitionTransform)')">
    <!-- Generate transformed service config in the intermediate directory -->
    <TransformXml Source="@(ServiceDefinition)" Destination="$(IntermediateOutputPath)%(Filename)%(Extension)" Transform="$(ServiceDefinitionTransform)" />
    <!--Force build process to use the transformed configuration file from now on.-->
    <ItemGroup>
      <ServiceDefinition Remove="ServiceDefinition.csdef" />
      <ServiceDefinition Include="$(IntermediateOutputPath)ServiceDefinition.csdef" />
    </ItemGroup>
  </Target>
当您打包或发布云应用程序时,根据您使用的构建配置,应转换您的 csdef。
这是从这里改编的:http://blogs.staykov.net/2011/06/windows-azure-configuration-settings.html

1
相对于被接受的答案,设置略微繁琐些,但我更喜欢这个答案,有几个原因:它是一种自愿选择的解决方案,最大程度地减少了重复和维护工作量(例如,您不必在添加或删除设置时更改大量 csdef 文件),并且它不会像使用 Pre-Build 步骤复制文件那样玩弄文件。尽管如此,两个答案都很好! - mbargiel
这对于ServiceDefinition工作得很好,但是ServiceConfiguration不起作用,因为它仍在使用默认值。 - user1754675
当你说“在项目底部包括”时,这是在ServiceDefinition文件中还是一个单独的文件中? - Stephen
你的项目文件底部是ServiceDefinition文件所在的位置。 - David Faivre
好的解决方案。请查看我的答案以获取一些评论。 - Oleksii Iaroshchuk

2
使用转换,就像David Faivre建议的那样,更加简洁,而且不需要在添加单个属性后更新所有文件的开销。
这是更改 VM 大小的转换 XML:
<?xml version="1.0"?>
<ServiceDefinition name="CloudServiceName" 
                   xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6" 
                   xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <WorkerRole name="WorkerRoleName.Role" vmsize="Medium" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
</ServiceDefinition>

1

David Faivre提出了一个好的解决方案。我有一些评论:

  1. 如果您的ServiceDefinition文件包含对某些目录(例如section)的链接,则由于转换后的文件位于中间目录中,将会导致错误。为了我的使用,我通过将转换后的文件放置在原始的ServiceDefinition.csdef旁边来解决了这个问题(不要忘记将*.transformed添加到.gitignore):

<TransformXml Source="@(ServiceDefinition)" Destination="ServiceDefinition.csdef.transformed" Transform="$(ServiceDefinitionTransform)" />

  1. $(Configuration)变量对应于构建配置(Debug、Release等)。如果您想要具有特定于配置文件的转换(对应于ServiceConfiguration..cscfg),则需要使用$(TargetProfile)变量:

<ServiceDefinitionTransform>ServiceDefinition.$(TargetProfile).csdef</ServiceDefinitionTransform>


感谢提供额外信息。使用“TargetProfile”而不是“Configuration”让我节省了很多时间。 - Cornel

1

VM大小是在ServiceDefinition.csdef文件中处理的,这是您无法在运行或部署时编辑的内容。您需要更改.csdef中的设置,重新打包解决方案,然后重新部署。

一个解决方案可能是设置多个Windows Azure部署项目。一个项目将是您的“测试”项目,其中.csdef配置为使用XS。另一个项目将是“生产”项目,它使用较大的实例。这将允许您使用标准的Windows Azure / Visual Studio工具来管理项目-这取决于您的流程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接