<ruby id="h6500"><table id="h6500"></table></ruby>
    1. <ruby id="h6500"><video id="h6500"></video></ruby>
          1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>

            持續集成之“自動(dòng)化部署”

            發(fā)表于:2012-12-21來(lái)源:InfoQ作者:?jiǎn)塘?/small>點(diǎn)擊數: 標簽:持續集成
            在前文《依賴(lài)管理》中,我們討論了如何在代碼變得龐大,組件增多的情況下,做好外部庫和內部組件依賴(lài)管理,從而提高構建效率??梢詰玫膶?shí)踐包括:

              在前文《依賴(lài)管理》中,我們討論了如何在代碼變得龐大,組件增多的情況下,做好外部庫和內部組件依賴(lài)管理,從而提高構建效率??梢詰玫膶?shí)踐包括:一次生成,多次復用;建立統一制品庫,外部依賴(lài)庫可以使用像Maven或Ivy這樣的工具進(jìn)行統一管理;對架構進(jìn)行調整,使一個(gè)大的代碼庫分成多個(gè)組件;每個(gè)組件有自己的持續集成體系;對多個(gè)組件做持續集成。然而,解決一個(gè)問(wèn)題后,總會(huì )有另一個(gè)問(wèn)題等在那里,需要你來(lái)解決。這次Joe的團隊遇到了部署問(wèn)題。

              星期一早上,Alice一進(jìn)辦公室,就看到一臉倦意的Joe坐在椅子上,喝著(zhù)咖啡。

              “今天怎么來(lái)得這么早?看樣子,你沒(méi)睡好啊?”Alice問(wèn)道。

              “當然啦,昨天晚上我就來(lái)了。”Joe無(wú)精打采地回答道。

              “怎么啦?”

              “還不是因為新版本上線(xiàn)出了點(diǎn)兒?jiǎn)?wèn)題”,Joe說(shuō)道。“看來(lái)我們要把部署這件事好好討論一下,再這樣下去,不只我要來(lái),你們也要和我一樣啦!呵呵!”

              當天下午,Joe邀請了運維團隊的主要負責人Tom和Steven,召開(kāi)了一個(gè)關(guān)于部署問(wèn)題的討論會(huì )。

              Joe說(shuō)道:“先請運維部門(mén)的Tom介紹一下上周末的新版本上線(xiàn)過(guò)程和發(fā)現的問(wèn)題吧。”

              Tom描述了上線(xiàn)部署全過(guò)程。

              不可重復且不可靠、易出錯的手工部署過(guò)程

              當新版本開(kāi)發(fā)測試完成后,由開(kāi)發(fā)團隊的成員在瀏覽器上登錄運維平臺,填寫(xiě)上線(xiàn)申請單。申請單的內容包括新版本的上線(xiàn)部署步驟。

              測試人員為了保證能夠升級部署成功,首先要復制生產(chǎn)環(huán)境中的程序和數據到本地的測試環(huán)境中,然后根據上線(xiàn)申請單中所描述的上線(xiàn)部署步驟進(jìn)行操作,對上線(xiàn)步驟進(jìn)行驗證。

              運維人員登錄到運維平臺,收到上線(xiàn)申請單后,確認“已收到”。

              運維人員發(fā)現上線(xiàn)部署步驟有問(wèn)題,生產(chǎn)環(huán)境的路徑與上線(xiàn)部署步驟中描述的不一致。于是與開(kāi)發(fā)人員進(jìn)行溝通,讓開(kāi)發(fā)人員修改上線(xiàn)部署步驟。

              開(kāi)發(fā)人員修改后,再次通知測試人員和運維人員查看并確認。

              確認無(wú)誤后,運維人員根據部署計劃,登錄到生產(chǎn)環(huán)境中,依照上線(xiàn)部署步驟,手工操作完成。

              “上周末上線(xiàn)部署時(shí)出現的情況是:在本次部署之前,我們的集群中,有兩臺機器因HotFix,其程序配置被修改過(guò),與其它機器不一致。因此,該機器上的部署失敗,導致部分服務(wù)不可用。運維人員查了很長(cháng)時(shí)間沒(méi)有發(fā)現問(wèn)題,星期日打電話(huà)把Joe叫來(lái)幫助我們查問(wèn)題時(shí),Joe才回憶起有那么一次HotFix,但當時(shí)負責的運維人員已經(jīng)離職,沒(méi)人其它運維人員知道這件事情。”Tom說(shuō)道,“我們對問(wèn)題進(jìn)行了分析,認為應該加強我們的上線(xiàn)流程管理,對于那種HotFix也應該發(fā)起一個(gè)審批流程,并且在該流程中不但要主要負責人審批,而且要對相關(guān)人發(fā)出周知通報。另外,我們的運維人員應該對上線(xiàn)單進(jìn)行嚴格審核,并對部署中所涉及的機器進(jìn)行更詳細的驗證,對生產(chǎn)環(huán)境中的任何修改都要進(jìn)行登記。即使非常緊急,也要在事后補充記錄一下。”

              “這些方法固然很好,但其實(shí)我們可以采用更好的辦法來(lái)解決。”Joe接著(zhù)說(shuō)到,“假如我們在部署運維工作也能夠借鑒持續集成的做法,利用一些最佳實(shí)踐,那么這次部署事故根本就不會(huì )發(fā)生。比如(1)將部署操作腳本化;(2)進(jìn)行持續部署驗證測試;(3)部署腳本通用化,環(huán)境變量等使用配置方式傳入;(4)讓測試環(huán)境盡可能與生產(chǎn)環(huán)境一致,至少在成本條件允許的情況下盡量保持相似;(5)對環(huán)境配置進(jìn)行版本控制;(6)任何人不得直接對生產(chǎn)環(huán)境進(jìn)行直接的手工操作,等等。”

              將部署操作腳本化,并進(jìn)行部署驗證測試

              Bob說(shuō)道:“嗯,其實(shí)那些上線(xiàn)步驟中所描述的內容都可以進(jìn)行腳本化,之前也討論過(guò)這一問(wèn)題。目前上線(xiàn)步驟中的內容基本都可以寫(xiě)成自動(dòng)化腳本,即使現在不行,也可以通過(guò)少量改造,使其可以自動(dòng)化。但問(wèn)題是... ...”Bob猶豫了一下,接著(zhù)說(shuō)道,“如何來(lái)驗證這些腳本是正確的呢?”

              Joe 說(shuō)道:“保證運維人員是如何驗證上線(xiàn)申請單上的上線(xiàn)步驟是正確的呢?同樣,我們也可以做一些部署驗證就行了。這些部署的驗證也可以通過(guò)腳本方式來(lái)進(jìn)行,比如在安裝之前驗證程序所用端口沒(méi)有被占用,安裝之后驗證該端口已被該程序所使用;比如安裝之前驗證程序日志中記錄了該程序已停止運行,在安裝之后驗證程序日志中刻錄該程序已重新啟動(dòng);等等”。

              Alice問(wèn)道:“那我們還要調試這些部署腳本呀?沒(méi)有線(xiàn)上生產(chǎn)環(huán)境,我們怎么調試呢?”

              各類(lèi)環(huán)境盡可能相似,并使部署腳本通用化

              Joe 回答道:“首先我們應該加強基礎設施這方面的投入。在力所能及的情況下,讓測試環(huán)境與生產(chǎn)環(huán)境相似。比如,生產(chǎn)環(huán)境可能有100臺機器的集群,那我們至少要找兩臺機器的集群做測試環(huán)境。生產(chǎn)環(huán)境中使用Tomcat,我們的測試環(huán)境和開(kāi)發(fā)環(huán)境中也應該使用相同的Tomcat,而不用Jetty。”

              Joe 停下來(lái),喝了一口咖啡,接著(zhù)說(shuō)道:“這樣一來(lái),我們的部署腳本就可以在開(kāi)發(fā)環(huán)境、測試環(huán)境進(jìn)行測試了。當開(kāi)發(fā)人員進(jìn)行本地測試時(shí),可以使用這個(gè)腳本進(jìn)行單機的部署。當測試人員進(jìn)行集成測試時(shí),可以使用同樣的腳本進(jìn)行多機部署。與機器數量無(wú)關(guān)的配置可以統一放在某配置文件中。而與機器數量等相關(guān)的配置可以放在另外的配置文件中。由于在真正上線(xiàn)部署之前,開(kāi)發(fā)人員和測試人員已經(jīng)使用同一個(gè)腳本進(jìn)行多次部署,就是對該腳本進(jìn)行的測試。當我們上線(xiàn)部署時(shí),只有與機器相關(guān)的配置文件會(huì )有變化,其它配置基本相同,所以上線(xiàn)部署時(shí)腳本出錯的幾率已經(jīng)比較小了。而且,這種自動(dòng)化沒(méi)有人工干預,也不會(huì )發(fā)生手工誤操作。”

              Tom問(wèn)道:“那這些腳本由誰(shuí)來(lái)寫(xiě)?由誰(shuí)維護呢?”

              Joe回答道:“誰(shuí)最了解情況,就由誰(shuí)來(lái)寫(xiě)。其實(shí),我們也應該像對待產(chǎn)品代碼一樣,來(lái)對待這些腳本和配置文件,把它們放在我們的代碼庫里,進(jìn)行版本控制。無(wú)論是運維人員還是開(kāi)發(fā)人員,或者測試人員,對這些腳本的修改都應該提交到版本控制庫中,除非他所做的修改只是為了測試他自己在本地的程序,那就不用提交了。這樣一來(lái),‘誰(shuí)在什么時(shí)候對什么進(jìn)行了修改,為什么做修改?’這個(gè)審計問(wèn)題就可以直接由版本控制系統來(lái)回答,也就做到了所有內容可追蹤了。”

            原文轉自:http://kjueaiud.com

            老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
              <ruby id="h6500"><table id="h6500"></table></ruby>
              1. <ruby id="h6500"><video id="h6500"></video></ruby>
                    1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>