如何从Visual Studio 2010

如何从Visual Studio 2010

问题描述:

加快天青部署我有Visual Studio 2010溶液与Azure ServiceASP.NET MVC 3解决方案,作为Web Role为Azure的服务。除此之外,没有其他角色附加到该服务。如何从Visual Studio 2010

每次部署到Azure staging(或生产,就此而言)环境最多需要20分钟才能完成,当我单击Visual Studio上的发布时,直到所有实例(2)都启动。

正如你可以想象的那样,这使得它成为一个PITA经常发布,或快速修复一些错误。有没有办法加快这个过程?将包上传到de Blob存储并从那里升级会更快吗?我将如何去实现这一目标?

我觉得Azure上的在线文档有很多不足之处。特别是当涉及到故障排除时。

谢谢。

一个想法(和频率)用于重新部署是将静态内容移动到封装外部的blob存储中。例如,将您的CSS和JavaScript移动到blob存储以及图像。完成此操作后,您只需重新编译/重新部署即可。NET代码更改。您可以随时将更新后的CSS上传到blob存储。如果您想要先在staging中测试此功能,则始终可以为静态内容创建一个staging vs. production容器名称,并将该容器名称存储在配置设置中。

这不会改变部署的时候,你需要重新部署,但至少你可以减少你多长时间去完成这一过程......

+0

我开始越来越喜欢你的方法。但有一个问题:你是否将所有的js文件,图像等与de项目分开(在VS中),或者只是将它们配置为不是发布的包的一部分? – 2010-12-21 22:30:39

+0

我已决定采用这个答案,因为它似乎是最实际的,当最终接受完全部署将是一个缓慢的过程,无论如何。 – 2010-12-31 10:38:40

+0

http://blogs.msdn.com/b/jnak/archive/2010/10/29/rapid-developer-deploy-to-azure.aspx – 2011-02-04 22:11:14

上传本身大部分时间都需要一分多钟。这是大部分时间占用的实例的启动。

你可以做的是将你的修补程序部署到第一位(注意它花钱,所以不要让它在那里太久)。从舞台换到制作只需要几秒钟。所以,当你的应用程序仍在运行时,你可以上传补丁版本,让你的测试人员在分期中进行测试,当他们放弃时,只需将其交换到产品。

我还没有测试过可能的替代方法,首先首先上传到blob存储。但我认为这是开销,因为它不会加速启动实例。

+0

谢谢,这就是我目前的做法,事实上VIP交换的效果很好,而且速度很快,没有停机时间。但是让分段部署运行起来非常慢,我无法想象没有更好的方法:) – 2010-12-19 15:52:35

+1

我刚刚从2天的微软课程中恢复过来。专家提到它也太糟糕了。微软可能会投资未来加快这一进程。但要知道,云平均运行在硬件上,以保持价格便宜和冗余。 – XIII 2010-12-19 15:55:48

尝试将您的项目首先上传到blob存储是一个不错的主意,但不幸的是,这是Visual Studio在幕后为您做的。正如其他地方已经指出的那样,大多数部署时间不是上传本身,而是停止和启动所有更新域。

如果你只是在一个开发环境中运行这个网站,那么我知道加快它的唯一方法就是只运行一个实例。如果这是现场环境,那么......对不起,我认为你运气不好。

为了不必部署到云端来测试微小的更改,我发现的工作相当好,就是设计站点,以便在本地IIS中运行,就像任何其他MVC站点一样。

这项工作的最大障碍是您在云配置中的设置。我们解决这个问题的方法是复制您的云配置中的所有设置,并将它们放入appSettings中的web.config中。然后,而不是使用RoleEnvironment.GetConfigurationSettingValue()创建您调用的包装类。这个包装类检查RoleEnvironment.IsAvailable以查看它是否在Azure结构中运行,如果是,则调用上述通常的配置功能,如果不是,则调用WebConfigurationManager.AppSettings[]

有,你要做到让周围其中希望你可以从下面的代码找出配置设置更改事件一些其他的东西:

减少需要
public class SmartConfigurationManager 
{ 
    private static bool _addConfigChangeEvents; 
    private static string _configName; 

    private static Func<string, bool> _configSetter; 

    public static bool AddConfigChangeEvents 
    { 
     get { return _addConfigChangeEvents; } 
     set 
     { 
      _addConfigChangeEvents = value; 

      if (value) 
      { 
       RoleEnvironment.Changing += RoleEnvironmentChanging; 
      } 
      else 
      { 
       RoleEnvironment.Changing -= RoleEnvironmentChanging; 
      } 
     } 
    } 

    public static string Setting(string configName) 
    { 
     if (RoleEnvironment.IsAvailable) 
     { 
      return RoleEnvironment.GetConfigurationSettingValue(configName); 
     } 
     return WebConfigurationManager.AppSettings[configName]; 
    } 

    public static Action<string, Func<string, bool>> GetConfigurationSettingPublisher() 
    { 
     if (RoleEnvironment.IsAvailable) 
     { 
      return AzureSettingsGet; 
     } 
     return WebAppSettingsGet; 
    } 

    public static void WebAppSettingsGet(string configName, Func<string, bool> configSetter) 
    { 
     configSetter(WebConfigurationManager.AppSettings[configName]); 
    } 

    public static void AzureSettingsGet(string configName, Func<string, bool> configSetter) 
    { 
     // We have to store these to be used in the RoleEnvironment Changed handler 
     _configName = configName; 
     _configSetter = configSetter; 

     // Provide the configSetter with the initial value 
     configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); 

     if (AddConfigChangeEvents) 
     { 
      RoleEnvironment.Changed += RoleEnvironmentChanged; 
     } 
    } 


    private static void RoleEnvironmentChanged(object anotherSender, RoleEnvironmentChangedEventArgs arg) 
    { 

     if ((arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>().Any(change => change.ConfigurationSettingName == _configName))) 
     { 
      if ((_configSetter(RoleEnvironment.GetConfigurationSettingValue(_configName)))) 
      { 
       RoleEnvironment.RequestRecycle(); 
      } 
     } 
    } 


    private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) 
    { 
     // If a configuration setting is changing 
     if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))) 
     { 
      // Set e.Cancel to true to restart this role instance 
      e.Cancel = true; 
     } 
    } 
} 
+0

嗨knightpfhor,谢谢你的回答。我可能在这里错过了你的答案,但要检查是否有小的变化(CSS,JavaScript,buigfixes等)woirk我可以将MVC项目设置为启动项目并查看是否一切正常。我的问题是在确定我的修改有效并且真的想把它们放在云中时发生的! :) – 2010-12-19 21:44:28

+0

是的,你是对的。但有时候,网站会与云配置中的内容捆绑在一起,因此这会阻止您在本地运行它。我的回答解决了这个问题。 由于我停止使用开发存储,因此我很难解决云中发生的问题,这并不是与本地配置相关的本地发生的问题。 我也扩大了我的问题的介绍,希望解决您的特定问题。 – knightpfhor 2010-12-20 03:59:26

我对这个问题的解决方案是只推当我改变RoleEntryPoint或服务定义中的代码时,一个新的包。在Azure 1.3中,您现在可以使用远程桌面连接。使用RDC,我将在本地编译我的代码,并使用复制/粘贴将其放置在适当目录中的Azure服务器上。一旦生产代码正确运行,我就可以将完全测试的版本推送到分段,然后进行VIP交换。这限制了我实际上必须部署软件包的次数。

你确实有相当长的窗口,在其中您可以不断修改Azure中你的代码,你必须发布新的包之前。只有在Azure必须关闭/重新启动角色实例的情况下才需要新包。

+0

感谢您的回答,我升级到了Azure 1.3,我以某种方式管理错过。我会尝试RDP,谢谢。 :) – 2010-12-21 22:31:47

+0

在进行性能调整,上传和检查性能时,使用RDP和复制/粘贴.dll文件对我来说是一个巨大的倍频程序。巨大。谢谢。 – pettys 2012-04-27 02:54:27

+6

如果重新启动该工作角色,您的更改是否会丢失?另外,我敢肯定,您无法扩展,因为新的工作人员角色不会有您的更改 – 2012-06-28 16:32:16

你应该在你Azure项目启用Web部署。它的工作原理是这样的:

1 /创建一个RDP帐户(不要忘记,你需要上传的证书及其私钥,这样可以天青破译密码)。这隐藏在Azure部署项目的“部署”对话框中。

2 /启用Web部署 - 同一个地方

一旦你已经发布的应用程序,这样,在Web应用程序(未蔚蓝的部署项目)右键单击并选择发布。除了密码之外,弹出窗口还提供了所有的定义,并输入相关信息,您可以在几秒钟内将更改上传到Azure。

警告:这是为单实例网络应用程序,绝对不会去生产升级策略的方式,已经提到的BLOB存储的答案是在这种情况下最好的选择。

Pierre