關(guān)于持續(xù)交付你準(zhǔn)備好了嗎?
分享人:鄭云龍 時間:2016-8-25 睿云智合持續(xù)交付產(chǎn)品負(fù)責(zé)人,在敏捷和DevOps領(lǐng)域有豐富經(jīng)驗的實踐,過去作為敏捷和DevOps技術(shù)教練向多家大型企業(yè)提供咨詢和培訓(xùn)服務(wù)。 持續(xù)交付理論要解決的最重要的問題就是,如何以最快的方式將我們的軟件交付到客戶手上;如何實現(xiàn)可靠,迅速并且低風(fēng)險的軟件發(fā)布。 在傳統(tǒng)的軟件開發(fā)方法中我們更多的關(guān)注軟件研發(fā)環(huán)節(jié),而DevOps運動則將軟件研發(fā)活動的視角從傳統(tǒng)的需求,開發(fā),測試等活動延伸到了部署,發(fā)布以及運維過程中。 軟件的核心價值是為軟件的使用者帶來收益,在過去我們經(jīng)常聽到開發(fā)人員說這個功能已經(jīng)開發(fā)完成了。?但是在持續(xù)交付中我們認(rèn)為之后將特性真正的發(fā)布到用戶手上才以為則完成。 持續(xù)支付 而要想達(dá)到持續(xù)交付的目標(biāo)即實現(xiàn)可靠,迅速并且低風(fēng)險的軟件交付需要所有相關(guān)人員(需求,開發(fā),測試,運維)的協(xié)同工作才能保證這一目標(biāo)的實現(xiàn)。 在持續(xù)交付過程中我們希望一個團(tuán)隊是能夠充分自治的,能夠完成從軟件的需求,設(shè)計,開發(fā),部署以及運維的端到端所有工作。 全功能團(tuán)隊 本文將以持續(xù)交付的8個原則來闡述在持續(xù)交付過程中的那些方法和實踐: 原則一:為軟件的發(fā)布創(chuàng)建一個可重復(fù)且可靠的過程 在傳統(tǒng)的軟件研發(fā)模式中瀑布式的工作方式深入到軟件研發(fā)的各個環(huán)境。 在軟件的發(fā)布過程中充滿了各種等待: 構(gòu)建和運維人員在等待說明文檔或者缺陷修復(fù) 測試人員等待“好的”版本構(gòu)建出來 研發(fā)團(tuán)隊可能在新功能發(fā)布幾周后才收到缺陷報告 最終的結(jié)果就是軟件產(chǎn)品遲遲不能發(fā)布甚至延期,同時由于開發(fā)與測試,開發(fā)和運維之間的過長的反饋周期直接導(dǎo)致軟件產(chǎn)品的質(zhì)量低下,同時可能并不能真正的為使用者帶來價值 同時如果管理者想要對整個軟件交付過程進(jìn)行改善將會很容易陷入到局部優(yōu)化的惡性循環(huán)當(dāng)中,很難真正了解交付的問題瓶頸 而持續(xù)部署流水線則是解決這一問題的最佳方式,建立持續(xù)部署流水線即建立了一套端到端的軟件交付流程,同時在持續(xù)部署流水線的流程當(dāng)中參與到軟件交付的各個角色都能各司其職,形成一套高效的“拉動系統(tǒng)” 開發(fā)人員持續(xù)的查看代碼度量數(shù)據(jù)以及測試失敗等問題,測試人員自助部署測試環(huán)境,同時運維人員也可以通過一鍵方式將軟件部署到預(yù)生產(chǎn)環(huán)境以及生產(chǎn)環(huán)境。同時對于管理人員也可以通過度量持續(xù)部署流水線的各個環(huán)境來分析交付問題,通過合理的方式優(yōu)化軟件交付流程當(dāng)中存在的問題。 而將持續(xù)部署流水線中的各個環(huán)節(jié)可以劃分為如下幾個不同的階段 提交階段 該階段主要從技術(shù)層面證明軟件系統(tǒng)是可以工作的,該階段會進(jìn)行軟件的編譯,以及以單元測試為主的自動化測試,以及代碼分析 自動化驗收測試階段 該階段主要從功能和非功能需求角度正面軟件是能夠滿足用戶的需求以及相關(guān)的需求驗收條件 手動測試階段 該階段主要試圖發(fā)現(xiàn)那些自動化驗收測試不能覆蓋的缺陷,同時證明系統(tǒng)是否能夠真正的為用戶提供價值,所以在該階段中通常需要由測試人員完成相關(guān)的探索性測試,集成測試以及用戶驗收測試 發(fā)布階段 發(fā)布階段則旨在將軟件產(chǎn)品發(fā)布到用戶手中包括軟件包發(fā)布或者是直接將軟件部署到生產(chǎn)環(huán)境 原則二:將幾乎所有事情自動化 為了搞笑的支持持續(xù)部署流水線,我們需要將除了探索性測試以外幾乎所有的事情都自動化。 在軟件交付過程中對于自動化我們可以分為兩個方面,一方面是指在產(chǎn)生軟件包過程中的如:編譯,打包,單元測試,集成測試,自動化驗收測試等活動。 自動化構(gòu)建 在這個過程中我們使用例如maven,gradle這樣的構(gòu)建工具可以幫助自動化的完成軟件的構(gòu)建以及解決軟件依賴問題 自動化測試 同時借助諸如robotframework,以及cucumber這樣的自動化測試工具,以及采用BDD或者ATDD的開發(fā)實踐能夠幫助我們產(chǎn)生高質(zhì)量的自動化驗收測試集 基礎(chǔ)設(shè)施及代碼 在虛擬化技術(shù)和容器化技術(shù)盛行的今天,通過諸如AWS的CloudFormation以及Docker的Dockerfile等我們可以將我們的基礎(chǔ)設(shè)施也變成自動化的 另一方面則涉及到與軟件運行相關(guān)的自動化如包括基礎(chǔ)設(shè)施的自動化管理,運行環(huán)境的自動化配置,軟件本身的安裝與配置等等 自動化配置管理 自動化配置管理工具如ansible,puppet,chef等相比傳統(tǒng)的腳本。通過dsl環(huán)境描述的過程將服務(wù)器環(huán)境的準(zhǔn)備過程變成自動化的,可重復(fù)的,并且能夠支持大規(guī)模的集群管理 原則三:把所有東西納入版本控制 在過去通常而言我們的svn或者git當(dāng)中只存在我們源代碼本身,而在持續(xù)交付過程當(dāng)中我們認(rèn)為任何會對軟件的行為,質(zhì)量產(chǎn)生影響的部分都應(yīng)該要做版本化的,并且這些任何部分的每一次變更都應(yīng)該通過持續(xù)部署流水線的形式來進(jìn)行自動化的驗證。確保任何的變更,如代碼變更,測試用例變更,環(huán)境配置變更都能得到快速的驗證,以及反饋 這些相關(guān)的“變更集”包括:基礎(chǔ)設(shè)施描述文件,源代碼,測試腳本,自動化測試用例,環(huán)境配置腳本,部署腳本,以及數(shù)據(jù)庫的創(chuàng)建,升級,以及回滾腳本等。 從上面的“變更集”也可以看出,持續(xù)交付是一個團(tuán)隊所有人員和角色都應(yīng)該參與的事情,并且每一個人都對軟件交付富有責(zé)任 原則四:提前并頻繁的做讓你感到痛苦的事情 “如果集成是讓你感到痛苦的,那么每一次代碼提交都應(yīng)該進(jìn)行集成,而且應(yīng)該從項目一開始就開始這么做;如果發(fā)布軟件過程前測試是一件痛苦的事情,那么就應(yīng)該從項目一開始就不斷的進(jìn)行測試;如果軟件發(fā)布是一件痛苦的事情,那么每一次代碼提交在完成自動化驗收測試之后都應(yīng)該進(jìn)行發(fā)布,或者至少發(fā)布到類生產(chǎn)環(huán)境” 原則五:內(nèi)建質(zhì)量 在持續(xù)交付過程中持續(xù)交付流水線定義了一套標(biāo)準(zhǔn)的,可重復(fù)的軟件交付流程;同時借助大量的工具我們可以將這個流程中的機會所有事情都進(jìn)行自動化。但是另外一個點就是軟件質(zhì)量。 根據(jù)原則四,其實我們也可以推斷出如果對代碼進(jìn)行測試是一件痛苦的事情,那么在編寫實現(xiàn)代碼之前我們就應(yīng)該寫測試,TDD,ATDD,BDD等軟件研發(fā)實踐正是體現(xiàn)了這一基本原則。 內(nèi)建質(zhì)量是戴明提出的名言之一。越早的發(fā)現(xiàn)缺陷,修復(fù)它們的成本越低。 根據(jù)內(nèi)建質(zhì)量的原則我們可以知道在軟件交付過程中,測試并不是一個階段,所以并不應(yīng)該在開發(fā)介紹之后才開始。同時測試也不應(yīng)該主要是測試人員的職責(zé),參與交付的所有人都應(yīng)該對軟件的質(zhì)量負(fù)責(zé) 其中測試四象限很好的闡述了為了確保軟件質(zhì)量而應(yīng)該做的各種類型的測試建模 原則六:“Done”意味著“已發(fā)布” 在持續(xù)交付過程中認(rèn)為一個特性的交付在理想狀態(tài)下應(yīng)該是已經(jīng)發(fā)布到用戶手中,或者至少已經(jīng)向用戶進(jìn)行了演示。 相應(yīng)的在敏捷開發(fā)中,我們每一個迭代結(jié)束后都應(yīng)該想"用戶代表"進(jìn)行演示,并且在“用戶代表”試用認(rèn)為是完成了之后才意味則“Done” 其中“用戶代表”可以是正在的用戶,也可以是相關(guān)的業(yè)務(wù)人員 原則七:交付過程是每個成員的責(zé)任 在現(xiàn)實情況下,測試部門總是抱怨研發(fā)交付的軟件質(zhì)量差,運維總是抱怨軟件不夠穩(wěn)定,開發(fā)總是抱怨缺陷反饋周期太長,解決問題的成本過高。 而在持續(xù)交付當(dāng)中我們知道,對于交付團(tuán)隊而言最終目標(biāo)是確保軟件能夠交付到用戶手中,并且產(chǎn)生相應(yīng)的價值。 而通過持續(xù)部署流水線,我們將所有參與到軟件交付中的角色都聯(lián)合成了一個整體,并且各個部分之間是能夠快速的產(chǎn)生反饋,促成各個成員和角色之間的交流,并且快速的解決問題 原則八:持續(xù)改進(jìn) 在任何一個充滿生機的組織當(dāng)中持續(xù)改進(jìn)是這個組織保持活力的基本要素之一。 參與軟件交付的成員需要定期對過去一段時間內(nèi)的交付工作進(jìn)行回顧,去發(fā)現(xiàn)在這個流程當(dāng)中的做的好的方面,以及做的不好的方面,并且提出解決方案。 為了持續(xù)交付組織應(yīng)該做好哪些準(zhǔn)備? 交付團(tuán)隊而非部門 根據(jù)康威定律“設(shè)計系統(tǒng)的組織,其產(chǎn)生的設(shè)計和架構(gòu)等價于組織間的溝通結(jié)構(gòu)” 由于存在部門墻的存在,導(dǎo)致開發(fā),測試,運維之間的大量溝通成本,嚴(yán)重影響效率。甚至嚴(yán)重時部門和部門之間甚至?xí)浅H菀灼饹_突。 開發(fā)人員只管完成既定的功能缺乏系統(tǒng)整體性思考;測試人員根據(jù)需求文檔完成測試用例,但是卻不思考需求本身的合理性;運維人員則缺少對軟件架構(gòu)本身的理解。各個部門看似各司其職進(jìn)井有條,但是卻很難對軟件交付的效率和質(zhì)量做出太多實質(zhì)性的貢獻(xiàn)。正如開篇所述, 而通過“交付團(tuán)隊”從項目一開始讓所有項目成員能夠參與到軟件的交付過程中,確保各個角色的人員能夠頻繁的進(jìn)行交流,并且為了一致的目標(biāo)而共同努力,這也是DevOps運動核心價值 而相同角色之間的溝通交流通過社團(tuán)COP的形式來進(jìn)行領(lǐng)域知識的交流和提升是一個不錯的方式 充分授權(quán)團(tuán)隊 確保持續(xù)交付實踐的成功,賦能團(tuán)隊,授權(quán)團(tuán)隊也是整個組織應(yīng)該思考的問題。在持續(xù)交付中我們知道一個團(tuán)隊是一個應(yīng)該是以做產(chǎn)品而非做項目為目標(biāo),需要充分授權(quán)團(tuán)隊,使得團(tuán)隊能夠完成從需求,開發(fā),測試,上線的端到端過程。 當(dāng)然在實際情況中,組織會有更多的因素需要考慮,比如最典型的場景比如由于落后的基礎(chǔ)設(shè)施管理方式導(dǎo)致運維團(tuán)隊往往是被動的響應(yīng)研發(fā)團(tuán)隊的需求,并且存在大量手動的操作環(huán)節(jié)導(dǎo)致時間和資源的浪費 平臺化,服務(wù)化 公有云,私有云,容器云 通過組織級別引入虛擬化或者容器化技術(shù)以及相應(yīng)的管理平臺如OpenStack,Rancher,Ks8等工具可以大大減少Ops團(tuán)隊的運維團(tuán)隊,在過去需要大量手工操作的過程都可以通過虛擬化平臺或者容器化平臺完成,研發(fā)團(tuán)隊或者資源的周期從之前的幾天縮短到幾分鐘。 基礎(chǔ)設(shè)施自服務(wù) 同時對于Ops團(tuán)隊則專注于提供底層的基礎(chǔ)設(shè)施資源,包括網(wǎng)絡(luò),安全等相關(guān)管理。并將相關(guān)的資源以服務(wù)的形式暴露給團(tuán)隊,各個產(chǎn)品團(tuán)隊管理自己的基礎(chǔ)設(shè)施環(huán)境,維護(hù)持續(xù)部署流水線,以及軟件運行環(huán)境的變更 平臺化服務(wù) 同時對于企業(yè)和組織而言通過引入統(tǒng)一的平臺化服務(wù),可以完成對所有產(chǎn)品團(tuán)隊的統(tǒng)一管理,和監(jiān)控。這些關(guān)鍵的平臺化服務(wù)可能包括:統(tǒng)一的日志管理平臺,持續(xù)交付平臺,以及監(jiān)控和運營平臺等。 ...
Read More