2010-12-19 131 views
7

加快天青部署我有Visual Studio 2010溶液與Azure ServiceASP.NET MVC 3解決方案,作爲Web Role爲Azure的服務。除此之外,沒有其他角色附加到該服務。如何從Visual Studio 2010

每次部署到Azure staging(或生產,就此而言)環境最多需要20分鐘才能完成,當我單擊Visual Studio上的發佈時,直到所有實例(2)都啓動。

正如你可以想象的那樣,這使得它成爲一個PITA經常發佈,或快速修復一些錯誤。有沒有辦法加快這個過程?將包上傳到de Blob存儲並從那裏升級會更快嗎?我將如何去實現這一目標?

我覺得Azure上的在線文檔有很多不足之處。特別是當涉及到故障排除時。

謝謝。

回答

7

一個想法(和頻率)用於重新部署是將靜態內容移動到封裝外部的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

0

上傳本身大部分時間都需要一分多鐘。這是大部分時間佔用的實例的啓動。

你可以做的是將你的修補程序部署到第一位(注意它花錢,所以不要讓它在那裏太久)。從舞臺換到製作只需要幾秒鐘。所以,當你的應用程序仍在運行時,你可以上傳補丁版本,讓你的測試人員在分期中進行測試,當他們放棄時,只需將其交換到產品。

我還沒有測試過可能的替代方法,首先首先上傳到blob存儲。但我認爲這是開銷,因爲它不會加速啓動實例。

+0

謝謝,這就是我目前的做法,事實上VIP交換的效果很好,而且速度很快,沒有停機時間。但是讓分段部署運行起來非常慢,我無法想象沒有更好的方法:) – 2010-12-19 15:52:35

+1

我剛剛從2天的微軟課程中恢復過來。專家提到它也太糟糕了。微軟可能會投資未來加快這一進程。但要知道,雲平均運行在硬件上,以保持價格便宜和冗餘。 – XIII 2010-12-19 15:55:48

1

嘗試將您的項目首先上傳到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

3

我對這個問題的解決方案是隻推當我改變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

4

你應該在你Azure項目啓用Web部署。它的工作原理是這樣的:

1 /創建一個RDP帳戶(不要忘記,你需要上傳的證書及其私鑰,這樣可以天青破譯密碼)。這隱藏在Azure部署項目的「部署」對話框中。

2 /啓用Web部署 - 同一個地方

一旦你已經發布的應用程序,這樣,在Web應用程序(未蔚藍的部署項目)右鍵單擊並選擇發佈。除了密碼之外,彈出窗口還提供了所有的定義,並輸入相關信息,您可以在幾秒鐘內將更改上傳到Azure。

警告:這是爲單實例網絡應用程序,絕對不會去生產升級策略的方式,已經提到的BLOB存儲的答案是在這種情況下最好的選擇。

Pierre