# 開發運營 - 為 Microsoft 堆棧啟用開發運營
作者:[Michael Learned](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Michael+Learned)?| September 2015
現在,對于開發運營有很多討論。對于向組織的業務用戶提供豐富的體驗和有用的數據來說,組織的自定義軟件至關重要。快速交付高質量的軟件不再是一種選擇,而是一項要求。耗時較長的規劃會議和開發迭代的情形已經一去不復返了。Microsoft Azure 等云平臺已經摒棄了傳統瓶頸,并且有助于基礎結構的商品化。軟件作為業務成果的關鍵分水嶺和因素,盛行于各行各業。任何組織、開發人員或 IT 工作人員都無法避免,而且也不應該避免開發運營的趨勢。
雖然對開發運營進行了各種定義,但通常大部分定義都涉及到移除開發和運營團隊之間的文化和技術障礙,從而使軟件盡可能高效地投入生產。軟件在生產環境中運行之后,需要確保可以捕獲豐富的使用情況數據,并向開發團隊和決策制定者反饋該數據。
有很多技術和工具可為開發運營提供幫助。這些工具和流程支持對生產應用程序實施快速發布周期和數據收集。對于 Microsoft 堆棧,有推動快速可預測發布的 Release Management 工具,以及有助于捕獲豐富的應用使用情況數據的 Application Insights 工具。本文將探索并介紹開發運營中使用的重要工具和技術以及開發運營的各個方面(如圖 1?中所示)。
?
圖 1 開發運營的各個方面
## 開發運營的角色
大多數組織希望在以下幾個方面提高他們的開發運營能力:
* 自動執行發布管道(您可以在更短的周期內執行可靠的測試和發布操作)。
* 應用程序在生產環境中運行之后,您需要能夠快速響應以更改請求和修復缺陷。
* 您必須從運行的生產應用程序中捕獲遙測和使用情況數據,并利用這些數據做出數據驅動的決策與“水晶球”決策。
您組織中是否存在阻止開發運營的這些方面的真空區? 這些真空區以多種形式存在,例如不同的工具、腳本語言、政治和部門界限。他們想要提供職責分離,并在生產中保持安全控制和穩定性。
不管他們的意圖是什么,這些真空區有時會妨礙組織實現很多開發運營目標,如快速可靠的發布和處理,以及對生產缺陷的響應。在很多情況下,此類真空區結構會造成大量浪費。開發人員和運營工作人員一直以來都在不同的團隊為不同的目標而奮斗。這些團隊花費多個周期來解決這些障礙造成的問題,而專注于推動業務發展的時間卻很少。
企業決策者需要以新的視角看待各種界限,以評估這些真空區可能提供的實際 ROI 或好處。很明顯,消除的障礙越多,就越容易實施開發運營解決方案并減少浪費。
維護適當的安全、控制和合規性,同時平衡靈活性需求是一項挑戰。企業安全團隊必須確保數據的安全性和隱私性。毫無疑問,安全性與組織開展的其他活動具有同等的重要性。
但是,您構建的所有安全性界限都會產生相關的費用。如果安全性界限會造成團隊的浪費以及產生沖突,則需要以新的視角來查看這些界限以確保它們能產生 ROI。您可能成為全球最安全的組織,但是如果您無法及時發布軟件,則會在競爭上處于劣勢。
平衡這些優先級并非是新的挑戰,但也應該重新坦誠地看待各種流程以及您組織已存在的真空區。團隊應著眼于企業價值,而不只是關注單個目標。
## 發布管道
發布管道是生成代碼、進行版本控制,然后經過各種環境并最終發布到生產的地方。在此過程中,您可以執行自動生成和測試。管道應處于這樣一種狀態:以透明的、可重復的、可信賴的以及快速的方式將更改內容應用到生產。這無疑會涉及到自動化。發布管道可能還包括設置應用程序主機環境。
如果存在以下因素,則無法優化發布管道:
* 工具和流程不匹配,即每個環境中包含不同的工具和流程。(例如,開發團隊使用一種工具進行部署,而運營團隊使用另一種工具進行部署)。
* 手動步驟可能出現錯誤,因此避免手動步驟。
* 重新生成只是為了部署到下一個環境。
* 缺少可跟蹤性,并且在了解已發布版本方面存在問題。
* 發布周期過長,即使對于修補程序也是如此。
## 部署
有時,部署容器會被視為發布管道的可選部分。傳統的本地方案通常存在于為了托管 Web 應用程序而運行的環境中。IIS Web 服務器或其他主機和后端 SQL Server 已通過大量迭代運行。快速發布到這些環境僅部署應用程序代碼、后續 SQL 架構以及移動相應更新級別所需的數據更改。在這種情況下,您并未部署新的基礎結構(IIS 和 SQL)來托管應用程序。您使用的是不考慮部署而僅注重應用程序代碼本身的發布管道。
您可能還希望通過一些其他方案來更改各種容器配置設置。您可能需要調整 IIS 中的部分應用池設置。您可以將其作為發布管道的一部分來實現,或手動進行處理。然后,您可能選擇在某些類型的版本控制系統中通過基礎結構即代碼 (IaC) 策略來跟蹤這些更改內容。
您可能希望通過一些其他方案來作為自動發布管道的一部分進行部署。例如,在開發周期的早期,您可能想要關閉并為每個版本重新生成新的 SQL 數據庫,完全以自動化方式測試環境。
借助 Azure 等云計算平臺,您只需對所需內容支付即可。使用自動化的設置和關閉非常經濟有效。通過自動化部署和環境更改,您可以避免錯誤并控制整個應用程序環境。類似情況使得加入部署作為整體發布管理系統的一部分極具吸引力。
有很多選項和技術可用于將部署添加為發布管道的一部分。具體因您要托管的應用程序類型和托管應用程序的位置而異。例如,托管傳統的 ASP.NET Web 應用程序、Azure Web 應用或某些其他平臺即服務 (PaaS) 應用程序(例如,Azure 云服務)。這些應用程序的容器各不相同,需要不同的工具技術來支持部署步驟。
## 基礎結構即代碼
一個常用的部署技術是 IaC。應用程序是可執行文件,可以是編譯后的代碼、腳本等,可與運營環境結合。您會發現此環境會帶來很多優勢。
最近,Microsoft 委托 Forrester Research Inc. 對IaC 產生的影響進行研究(請參閱?[bit.ly/1IiGRk1](http://bit.ly/1IiGRk1))。研究顯示 IaC 是一個關鍵的開發運營組件。此外,研究還表明部署和配置是團隊交付軟件的主要沖突點。如果您要完全實現自己的開發運營目標,則需要利用自動化和 IaC 技術。
傳統的運營挑戰之一是自動化提供適當環境的功能,從而在環境中執行應用程序和服務,并使這些環境保持已知的的良好狀態。雖然虛擬化和其他自動化技術非常有用,但是在同步中保留節點以及管理配置偏差方面仍然存在問題。運營和開發團隊在使用不同的工具集、專業知識和流程方面仍感到非常很困難。
利用 IaC 的前提是,我們應能夠通過自動化發布管道對基礎結構代碼進行描述、版本控制、執行和測試。例如,利用簡單的 Windows PowerShell 腳本,您可以輕松地創建配置 IIS 的 Windows 虛擬機 (VM)。運營部門應可以使用相同的 ALM 工具為基礎結構編寫腳本、執行版本控制和測試。
其他好處包括能夠啟動和關閉環境的已知版本。由于開發和生產環境存在差異,您可以避免很多繁瑣的問題。您可以在代碼中表達應用程序特定于環境的依賴關系,并將它們沿用到版本控制中。簡言之,您可以消除手動流程,并確保為您的應用程序測試了可靠的自動化環境容器。開發和運營團隊可以使用常見的腳本語言和工具,從而提高效率。
應用程序類型和目標主機位置將決定執行您的基礎結構代碼所涉及到的工具。有幾種工具在支持這些技術方面頗受歡迎,其中包括 Desired State Configuration (DSC)、Puppet 和 Chef 等。根據手頭的方案,每種工具都可以幫助您實現類似的目標。
IaC 的代碼部分可能是以下內容之一。可能只是部署資源的 Windows PowerShell 腳本。同樣,應用程序類型和托管環境將決定您的選擇。
對于 Azure,您可以使用利用 Azure 資源管理 API 的云部署項目來創建和管理 Azure 資源組。這樣您就可以使用 JSON 來描述您的環境。借助 Azure 資源組,您還可以同時管理與組相關的資源,如網站和 SQL 數據庫。通過云部署項目,您可以在版本控制中存儲部署要求,并執行作為自動發布管道的一部分的 Azure 部署。以下是組成部署模板的基本結構的各部分:
~~~
{
? "$schema": "http://schema.management.azure.com/schemas2015-01-01/
??? deploymentTemplate.json#",
? "contentVersion": "",
? "parameters" { },
? "variables": { },
? "resources": [ ],
? "outputs": { }
}
~~~
有關模板的更多信息,請轉到?[bit.ly/1RQ3gvg](http://bit.ly/1RQ3gvg);有關云部署項目的更多信息,請參閱?[bit.ly/1flDH3m](http://bit.ly/1flDH3m)。
腳本語言和工具是成功采用 IaC 策略所需更改的唯一部分。開發和運營團隊必須相互協作,為共同的一組目標整合工作流。這極具挑戰性,因為一直以來,運營團隊都注重保持環境的穩定性,而開發團隊更注重將新功能引入這些環境。雖然各種復雜的技術不斷涌現,但是成功實施 IaC 的基礎將取決于運營和開發團隊之間有效合作的能力。
## 發布安排
Release Management 是 Visual Studio ALM 堆棧中的一項技術。實際上,它在更大程度上是一個概念,您可以安排包含軟件發布的各種項目和任務。其中一些項目包括生成系統生成的有效負載或程序包、作為發布管道一部分的自動化測試、審批工作流以及控制接近生產的環境的通知和安全管理。
您可以使用 DSC、Windows PowerShell 腳本、Azure 資源管理器和 Chef 等技術來管理環境狀態,并將軟件和依賴項安裝到運行環境中。就 Visual Studio ALM 提供的工具而言,將 Release Management 視為囊括您執行部署所需的任何技術和工具的服務。Release Management 可利用簡單的命令行或 Windows PowerShell 腳本,使用 DSC 甚至執行您自己的自定義工具。您的目標應該是盡可能使用最簡單的解決方案來執行發布。
依賴于 Windows PowerShell 也是一種很好的做法,因為它非常普遍。例如,您可以將 Windows PowerShell 腳本用作發布管道的一部分,以便部署 Azure 云服務。雖然有很多現成的工具可與 Release Management 結合使用(請參閱圖 2),但您也可以靈活地創建自己的工具。

圖 2 適用于 Release Management 的工具和選項
Release Management 可以幫助您完美地創建自動化發布管道,并生成可靠的自動化應用程序版本。您還可以選擇加入部署。Release Management 工具與 Visual Studio 和 Team Foundation Server 可以幫助您將這些項目安排到整個發布事務中。它還提供豐富的儀表板樣式的視圖,可查看當前狀態和歷史狀態。此外還與 Team Foundation Server 和 Visual Studio Online 完美集成。
## DSC 適用于何處?
最近發布了大量與 DSC 有關的內容。但是,DSC 并非可處理所有內容的包羅萬象的工具。您可以將 DSC 用作開發運營結構中的一個工具,但不是唯一的工具。
您可以在請求或推送模式下使用 DSC。然后,您可以使用“執行此設置”狀態來控制服務器狀態。控制該狀態可以非常簡單,類似于確保文件或目錄存在,或者是修改注冊表、停止或啟動服務或運行腳本以部署應用程序等更加復雜的操作。您可以重復執行此操作,不會出現錯誤。此外,您可以定義自己的 DSC 資源或使用大量的內置資源。
DSC 作為本地配置管理器 (LCM) 來實現,在目標節點上運行,接受管理對象文件 (MOF) 配置文件并使用該文件將配置應用到該節點本身。因此,沒有硬性結合的工具。您甚至無需使用 Windows PowerShell 來生成 MOF。
若要開始使用 DSC,直接生成 MOF 文件即可。這將最終會描述要執行的各種資源,大部分都是在 Windows PowerShell 中編寫的。基于 Windows 服務器系統上的 DSC 的主要優勢之一是,LCM 是操作系統的原生程序,這為您提供了內置代理的概念。還有一些通過 Linux 利用 DSC 的方案。請參閱圖 3,查看分離 DSC 腳本的配置數據的示例。
圖 3 分離 DCS 腳本中的配置數據
~~~
Configuration InstallWebSite
{
??Node $AllNodes.NodeName
??{
????WindowsFeature InstallIIS
????{
??????Ensure = "Present"
??????Name = "Web-Server"
????}
??}
}
InstallWebSite –ConfigurationData .\config.ps1
Where config.ps1 contains
$ConfigData = @{
??AllNodes = @(
??@{
????NodeName = “localhost”
??})
}
~~~
如果 DSC 具有可用的資源來幫助支持您的部署,則它是發布管道的重要部分。對于本地或 IaaS 應用程序,DSC 是一個極佳的選擇,可幫助控制環境配置并支持您的部署方案。
同樣,DSC 并非適用于每種方案。因此,如果您部署的是 Azure PaaS 資源,則建議您使用 Azure 資源管理器來啟動虛擬機并配置網絡。這并非 DSC 的主旨。運行虛擬機之后,您可以使用 DSC 按照您希望的方式獲取本地配置,并確保您關心的配置元素不會更改。
## 使用 Application Insights 進行監視
應用程序和環境投入生產后,收集數據和監視運行狀況是非常重要的。您還需要了解使用情況模式。此類數據對于管理運行狀況服務非常重要。收集和監視此類數據是開發運營的重要部分。例如,Microsoft 使用生產數據對 Visual Studio Online 團隊進行提升。此類豐富的數據可以幫助 Visual Studio Online 團隊確保服務可用性,向他們演示開發人員是如何按照功能優先順序使用服務并通知決策的。您可以訪問[bit.ly/1AzDL9V](http://bit.ly/1AzDL9V)?詳細了解 Microsoft 開發運營歷程。
Visual Studio Application Insights 將 SDK 添加到您的應用程序并將遙測發送到 Azure 門戶。它支持多種平臺和語言,包括 iOS、Android、ASP.NET 和 Java。您可以捕獲性能數據、應用程序正常運行時間和各種使用情況分析。您可以向決策制定者和利益干系人展示此類豐富的數據,這有助于做出更好的決策,檢測問題并持續改進您的應用程序。您可以訪問?[bit.ly/1IbRnrF](http://bit.ly/1IbRnrF)?詳細了解 Application Insights。
圖 4?和圖 5?顯示了Application Insights 收集的數據類型的示例。

圖 4 Application Insights 可提供有關用戶和頁面視圖的數據

圖 5 Application Insights 還可以監視 Web 測試
## 總結
開發運營幫助團隊推動連續交付,并利用運行的應用程序中的數據來幫助做出更明智的決策。本文已檢查可用于實現這些目標的各種主要的 Microsoft 技術:
* Release Management 可讓您使用任何技術來推動部署。這些技術包括簡單的 Windows PowerShell 腳本、DSC 配置、甚至是 Puppet 等第三方工具。
* 基礎結構即代碼策略可幫助開發和運營團隊高效地進行合作。
* Visual Studio Application Insights 為您提供了一種機制,可用于從運行的應用程序中捕獲豐富的數據,從而幫助利益干系人了解應用程序運行狀況,并檢查使用情況模式來推動做出更明智的決策。
這些技術可幫助您顯著提高開發運營的成熟度。您還需要融合一些適當的技術,同時努力克服文化障礙。
### 更多資源
* 若要了解基礎結構即代碼的更多信息,請在?[bit.ly/1IiNqmr](http://bit.ly/1IiNqmr)?中的第 9 頻道收聽 Brian Keller 的討論。
* 若要了解 Azure 資源組部署項目的更多信息,請參閱?[bit.ly/1flDH3m](http://bit.ly/1flDH3m)。
* 若要了解 TFS 規劃、災難避免和恢復以及 Azure IaaS 上的 TFS 的更多信息,請參閱[vsarplanningguide.codeplex.com](http://vsarplanningguide.codeplex.com/)?中的指南。
* 若要了解適合開發運營和 ALM 從業人員的配置即代碼的更多信息,請參閱[vsardevops.codeplex.com](http://vsardevops.codeplex.com/)。
* * *
Micheal Learned?*是一位 Visual Studio ALM Ranger,目前側重于開發運營和 Microsoft Azure。在超過 15 年的時間里,他負責 Microsoft 內部和外部的很多軟件項目。他居住在伊利諾斯州中部,將自己的空余時間用于為社區提供幫助,并與妻子、女兒和兩個兒子一起度過閑暇時光。通過 Twitter 與他聯系:[twitter.com/mlhoop](http://twitter.com/mlhoop)。*
- 介紹
- 云連接移動應用 - 借助身份驗證和離線支持構建 Xamarin 應用
- 崛起 - 自由 Internet 廣播
- Microsoft Azure - 云中的容錯問題和解決方法
- 最前沿 - 適合常見應用程序的事件源
- Azure 深入了解 - 跨云平臺創建統一的 Heroku 式工作流
- 借助 C++ 進行 Windows 開發 - Windows 運行時中的高級類型
- 編譯器優化 - 借助按本機配置優化來簡化代碼
- 數據點 - 再探 JavaScript 數據綁定(現在包含 Aurelia)
- 云安全 - 借助 Azure 密鑰保管庫保護敏感信息的安全
- 測試運行 - 借助人工尖峰神經元進行計算
- 開發運營 - 在 Microsoft 堆棧上啟用開發運營
- 孜孜不倦的程序員 - 如何成為 MEAN: Node.js
- 新型應用 - 提升新型應用的易用性的做法
- 別讓我打開話匣子 - Darwin 的照相機
- 編輯寄語 - 汽車 Internet 發生故障