2012-06-23 10 views
19

我有一个部署到两个独立托管服务的Windows Azure站点。一个用于测试,一个用于生产。当我们准备推向生产时,我们会在生产服务中启动一个分段部署,推送到那里,然后进行VIP交换。都好。Azure:是否有任何方法为测试/生产部署不同的实例大小

现在的问题是,现在我们想从XS 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 /存档/ 2012/07/02 /变换 - 窗口Azure的服务模式 - 文件 - 中 - packaging.aspx – codingoutloud

+1

这里另一个方便的文章http://blogs.msdn.com/b/microsoft_press/archive/ 2015年/ 03/12 /客的文章,微软Azure的开发,测试情景considerations.aspx – Rory

回答

24

有几个方法可以做到这一点...简单的办法是做一个小的CCPROJ文件的“黑客”:

1)创建CSDEF文件为每个配置相匹配的环境克隆名称(发布/调试/ QA/UAT /等): ServiceDefinition.Release.csdef,ServiceDefinition.Debug.csdef等

2)用记事本编辑器

手动添加这些文件到CCPROJ文件

3)定义一个预生成事件命令,将ServiceDefinition。$(ConfigurationName).csdef复制到ServiceDefintion.cs中高清

瞧,现在你的ServiceDefintion会适应你使用任何配置。

如果你想更大胆的尝试,或是查看更多详细信息,请查看本博客条目,可以帮助您切换各种设置齐声

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

编辑:这是一个可行的配置。请注意,包含其他文件的类型为“无”而不是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> 
+0

谢谢了。唯一的问题是Azure项目不会在其中创建多个.csdef文件。尽管在解决方案中忽略了第2步,并且似乎都行得通。错误是“Microsoft.WindowsAzure.targets(845,5):error:WAT020:只有一个服务定义可以被激活。” – ManicBlowfish

+0

发布编辑配置示例 – Igorek

+0

@Igorek:您的博客文章缺少图像。这可以修复吗?我也对解决方案感兴趣。 – DeepSpace101

1

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

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

14

您可以使用Web发布TransformXml MSBuild任务转换只需要的服务定义的部分(比如你可以用的Web.Config现在做的)。

  • 创建ServiceDefinition.[BuildConfigName].csdef文件旁边ServiceDefinition.csdef中的文件(你可能需要做这在文件管理)
  • 创建转换文件就像你创建一个Web.config变换。我明确地设置根命名空间,以防万一,所以我的根元素是:
<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文件发生变化),并且它不会像使用预构建步骤进行的复制一样对文件进行太多播放。不过,这两个答案都很棒! – mbargiel

+0

这对ServiceDefinition工作正常,但ServiceConfiguration不起作用,因为它仍然使用默认的一个 – user1754675

+0

当你说“在你的项目的底部包含”这是在ServiceDefinition文件或一个单独的文件? – Stephen

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

大卫Faivre提出了good solution。从我谈几点看法:

  1. 如果你的服务定义文件包含链接到一些目录(例如部分),比会有造成的事实,转换文件在中间目录中的错误。对于我使用我通过将转化文件一起原始ServiceDefinition.csdef中解决了这个问题(不要忘记加上* .transformed到的.gitignore):

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

  • $(Configuration)变量对应于生成配置(调试,发布等)。如果你想有(对应于ServiceConfiguration..cscfg)轮廓特定的转换,你需要使用$(TargetProfile)变量:
  • <ServiceDefinitionTransform>ServiceDefinition.$(TargetProfile).csdef</ServiceDefinitionTransform>

    相关问题