20

我有一个部署到两个独立托管服务的 Windows Azure 站点。一种用于测试,一种用于生产。当我们准备好推送到生产环境时,我们在生产服务中启动一个暂存部署,推送到那里,然后进行 VIP 交换。都好。

问题是,现在我们想从 XS Web 实例升级,但是将额外的钱花在测试部署上并没有什么意义。有没有办法使用 XS 实例进行测试,然后说中型实例用于生产?我知道我可以更改每个服务配置的实例数量,但我只能更改所有配置的实例大小。

我正在考虑将其 XS 留在配置中,然后记住在部署到生产之前将其切换到 Medium。有什么理由我不应该这样做吗?有没有更好的办法?

干杯!

4

5 回答 5

23

有几种方法可以做到这一点......更简单的方法是对 CCPROJ 文件进行一点“黑客攻击”:

1) 为每个与配置名称(Release/Debug/QA/UAT/etc)匹配的环境创建 CSDEF 文件的克隆:ServiceDefinition.Release.csdef、ServiceDefinition.Debug.csdef 等。

2) 使用记事本编辑器将这些文件手动添加到 CCPROJ 文件中

3) 定义一个 Pre-Build Event 命令,将 ServiceDefinition.$(ConfigurationName).csdef 复制到 ServiceDefintion.csdef

瞧,现在您的 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>
于 2012-06-23T16:23:33.070 回答
15

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

  • 在 ServiceDefinition.csdef 文件旁边创建一个ServiceDefinition.[BuildConfigName].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

于 2014-04-03T16:56:07.490 回答
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>
于 2015-10-19T14:24:07.260 回答
1

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

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

于 2012-06-23T15:47:55.667 回答
1

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

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

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

  1. $(Configuration)变量对应于构建配置(调试、发布等)。如果要进行配置文件特定的转换(对应于 ServiceConfiguration..cscfg),则需要使用$(TargetProfile)变量:

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

于 2017-04-27T08:58:04.220 回答