林帆:構(gòu)建企業(yè)級(jí)私有云持續(xù)交付平臺(tái)
華為開(kāi)發(fā)匯(Huawei Developers Gathering)簡(jiǎn)稱(chēng)“HDG”,旨在為廣大開(kāi)發(fā)者分享華為內(nèi)部、合作伙伴以及社區(qū)成員的干貨,營(yíng)造一個(gè)自由、開(kāi)放、分享的技術(shù)交流平臺(tái)。是華為今年一個(gè)重要的技術(shù)交流活動(dòng),計(jì)劃將在全國(guó)各個(gè)地區(qū)舉辦。
9月,HDG成都站如期舉行,林帆是HDG成都站***一位發(fā)言的講師,他作為T(mén)houghtWorks高級(jí)DevOps技術(shù)顧問(wèn),帶來(lái)的是《構(gòu)建企業(yè)級(jí)私有云持續(xù)交付平臺(tái)》的主題演講,講解了如何通過(guò)整合開(kāi)源社區(qū)中的優(yōu)秀軟件,使其匹配企業(yè)級(jí)應(yīng)用的場(chǎng)景。其中涉及的一些方案細(xì)節(jié)等都是***次在外部活動(dòng)中進(jìn)行展示。
現(xiàn)場(chǎng)實(shí)錄如下:
我今天的話(huà)題主要有下面幾個(gè)部分,首先我想簡(jiǎn)單過(guò)一下關(guān)于持續(xù)交付概念基本的價(jià)值,和它的主要內(nèi)容。然后再說(shuō)一說(shuō)在企業(yè)級(jí)的應(yīng)用當(dāng)中能夠使用開(kāi)源的工具,做這種交付的話(huà),哪些事情是可以做的,哪些事情是具有缺陷的。***一點(diǎn)是想用一些開(kāi)源的工具做一個(gè)全流程的持續(xù)交付平臺(tái)的話(huà),我們應(yīng)該怎么去做。
持續(xù)交付的概念到現(xiàn)在也有五六年的歷史了,在座的多少都聽(tīng)過(guò)持續(xù)交付這個(gè)概念吧,大家半數(shù)以上都聽(tīng)過(guò)。持續(xù)交付,這本書(shū)是在2010年時(shí)候英文版就已經(jīng)出來(lái)了,國(guó)內(nèi)的中文版稍微晚一些。持續(xù)交付的想法是,我們始終將我們已經(jīng)開(kāi)發(fā)好的工具保持在一個(gè)可交付、可上線(xiàn)的狀態(tài)上,當(dāng)我們支持的人說(shuō)這部分完成了,是沒(méi)問(wèn)題的,可以立馬上線(xiàn),這樣就以最快的速度來(lái)實(shí)現(xiàn)這部分的功能價(jià)值,并且在***時(shí)間把我們的軟件功能走到一個(gè)反饋,它是不是我們想要的。
到現(xiàn)在來(lái)說(shuō)很多時(shí)候我們對(duì)軟件交付周期比較有要求的企業(yè),特別是互聯(lián)網(wǎng)創(chuàng)業(yè)企業(yè),對(duì)持續(xù)交付理念的追求度是比較高的。因?yàn)樗粋€(gè)主要的特點(diǎn)是,它從實(shí)踐層面上去提出一些工具和方法,能夠?qū)⑦@種快速迭代的方式實(shí)踐落地。這些方法包括我們更加頻繁的做交付,更加頻繁的做周期反饋,相關(guān)情況的具化,主要是關(guān)于自動(dòng)化的工具。通過(guò)這些持續(xù)交付的工具能夠很好的幫助開(kāi)發(fā)者,包括幫助團(tuán)隊(duì)去實(shí)現(xiàn)更好的交付流程的自動(dòng)化,交付流程的打通。當(dāng)流通出問(wèn)題的時(shí)候,能夠***時(shí)間把出問(wèn)題的地方反饋出來(lái),比如說(shuō)代碼出問(wèn)題了,提交了一個(gè)有問(wèn)題的功能之后,***時(shí)間進(jìn)行自動(dòng)化設(shè)置,這樣可以最快的得到問(wèn)題反饋,最快的把問(wèn)題解決。
通過(guò)這種開(kāi)源的工具,是不是能夠真正的幫企業(yè)解決所有這個(gè)過(guò)程中所需要解決的問(wèn)題呢,答案是不一定,這個(gè)要看我們實(shí)際團(tuán)隊(duì)的規(guī)模和我們團(tuán)隊(duì)對(duì)持續(xù)交付概念的訴求。如果是對(duì)一個(gè)比較小的團(tuán)隊(duì)來(lái)說(shuō)的話(huà),很多小團(tuán)隊(duì)是一個(gè)互聯(lián)網(wǎng)團(tuán)隊(duì),基本的交付***的訴求就是我能夠多快的把這個(gè)軟件,通過(guò)一個(gè)穩(wěn)定可控的方式把它上線(xiàn)。因?yàn)閷?duì)于這樣企業(yè)來(lái)說(shuō)的話(huà),軟件交付的速度不單單是軟件的價(jià)值回饋的速度,更重要的它直接決定了一個(gè)產(chǎn)品,甚至是一個(gè)公司生與死的問(wèn)題。像這樣子的產(chǎn)品它主要幫助解決的是,我怎樣去構(gòu)建這樣一條可視化的通路,我把代碼編譯之后,***時(shí)間對(duì)代碼進(jìn)行檢查,***時(shí)間進(jìn)行反饋,沒(méi)有問(wèn)題之后我會(huì)***時(shí)間把這個(gè)功能上線(xiàn),給用戶(hù)使用,得到用戶(hù)的反饋。對(duì)于這種需求點(diǎn)的話(huà),大部分的開(kāi)源工具已經(jīng)能夠比較好的滿(mǎn)足小團(tuán)隊(duì)、個(gè)人開(kāi)發(fā)這樣的一些需求。
當(dāng)我們把產(chǎn)品放到一個(gè)更大的團(tuán)隊(duì),對(duì)于一個(gè)企業(yè)級(jí)的用戶(hù)來(lái)說(shuō),企業(yè)級(jí)的用戶(hù)是比較大的,所以它的交付周期會(huì)比較長(zhǎng),它的交付團(tuán)隊(duì)是跨團(tuán)隊(duì)進(jìn)行合作的。從任何一個(gè)點(diǎn)上都很難一眼看出所有團(tuán)隊(duì)的交付狀況,在這種情況下我們需要很多的指標(biāo),來(lái)告訴我們這個(gè)項(xiàng)目當(dāng)中的哪一個(gè)部門(mén),哪一個(gè)部分的地方有問(wèn)題。不像是我們很輕松的一眼望盡所有的上面有幾百個(gè)路線(xiàn),幾百個(gè)項(xiàng)目,很大型的一個(gè)產(chǎn)品。這樣的話(huà)我們會(huì)需要對(duì)這個(gè)產(chǎn)品提出很多指標(biāo)性的訴求,從上層往下看的時(shí)候能清楚的看到整個(gè)產(chǎn)品交付的狀態(tài)。這個(gè)指標(biāo)就包括我們?cè)诖a提交之后,可以看某個(gè)子項(xiàng)目上面代碼提交的頻率,代碼成功的比例,以及進(jìn)行代碼掃描,進(jìn)行測(cè)試的時(shí)候,測(cè)試的夠不夠。進(jìn)行代碼掃描的時(shí)候,掃描出來(lái)的問(wèn)題多不多。這些問(wèn)題都可以反映出這個(gè)產(chǎn)品的質(zhì)量是否會(huì)延遲交付,是否會(huì)有一些問(wèn)題。同樣的當(dāng)我們把這個(gè)項(xiàng)目進(jìn)行布置的時(shí)候,同樣也可以獲得很多,包括每個(gè)子產(chǎn)品部署的周期,這個(gè)子模塊或者這個(gè)子項(xiàng)目是否匹配,是否會(huì)存在一些潛在的問(wèn)題。這些東西都需要通過(guò)一些指標(biāo)性的東西才能提供出來(lái)。除此以外,除了指標(biāo)還有一方面就是我們需要很多的實(shí)踐,就是更多的實(shí)踐的東西,去配合這些溝通合作。比如我們需要一些統(tǒng)一的分制策略,怎么去管理我們代碼的分解。怎么去通過(guò)一些文件的機(jī)制,去保證非常差的提交,不能夠進(jìn)入正常的運(yùn)行,在做測(cè)試的時(shí)候,一旦有其中一個(gè)模塊出現(xiàn)問(wèn)題,會(huì)影響整個(gè)測(cè)試的結(jié)果。這個(gè)保證如果代碼掃描出現(xiàn)非常嚴(yán)重的問(wèn)題的時(shí)候,這個(gè)提交整個(gè)會(huì)部署。部署打包的時(shí)候我們也需要通過(guò)一些實(shí)踐來(lái)保證它怎樣***進(jìn)行自動(dòng)化,并且是一個(gè)比較統(tǒng)一的自動(dòng)化的關(guān)系,去完成整個(gè)產(chǎn)品的部署,這樣對(duì)于后續(xù)的運(yùn)維和運(yùn)營(yíng)有比較大的收益。
所有這些事情不單單是一個(gè)單純的工具能夠解決的問(wèn)題,可能需要一些國(guó)外的指標(biāo),國(guó)外的實(shí)踐,來(lái)保證我們大型企業(yè)項(xiàng)目的交付過(guò)程。包括后面從正常運(yùn)營(yíng)到延遲需求的回饋,這部分已經(jīng)超出了持續(xù)交付要解決的問(wèn)題,但是我們確實(shí)也是從企業(yè)級(jí)交付的時(shí)候必須要做的一個(gè)部分。
剛剛提到的這些是說(shuō)我們這些開(kāi)源的持續(xù)交付工具,可能不能非常好的滿(mǎn)足企業(yè)級(jí)需求當(dāng)中所需要的這么多,包括有指標(biāo)性的,包括有實(shí)踐性的東西。
第二個(gè)問(wèn)題是關(guān)于數(shù)據(jù)的集成,剛才說(shuō)在企業(yè)的應(yīng)用當(dāng)中我們更需要關(guān)注一些指標(biāo)性的東西。因?yàn)閷?duì)小團(tuán)隊(duì)來(lái)說(shuō)的話(huà),可能我們***眼就能看到這個(gè)項(xiàng)目當(dāng)中每一部分的狀態(tài)是什么樣的,是不是現(xiàn)在已經(jīng)部署過(guò)了,這個(gè)我們都能計(jì)算出來(lái)。但是對(duì)于大型項(xiàng)目的時(shí)候,我們可能需要一些額外的數(shù)據(jù)進(jìn)行支撐,這些數(shù)據(jù)的整合,對(duì)于開(kāi)元的工具來(lái)說(shuō)也是沒(méi)有的。這些數(shù)據(jù)就包括過(guò)去的數(shù)據(jù),包括我們做代碼測(cè)試,做產(chǎn)品測(cè)試時(shí)候的測(cè)試數(shù)據(jù),包括我們對(duì)項(xiàng)目進(jìn)行部署的時(shí)候會(huì)有一個(gè)部署周期,兩點(diǎn)要匹配模塊之間的部署的API的性能。假設(shè)我做了hos相關(guān)的,一般從1.0到2.0之后會(huì)升級(jí),是否會(huì)存在問(wèn)題,這些問(wèn)題是通過(guò)數(shù)據(jù)可以暴露出來(lái)的。但是對(duì)于開(kāi)源組建來(lái)說(shuō)的話(huà),它對(duì)數(shù)據(jù)這塊的集成是缺失的,這是第二個(gè)問(wèn)題。
第三個(gè)問(wèn)題,剛才說(shuō)到對(duì)于小型團(tuán)隊(duì)來(lái)說(shuō)的話(huà),它的關(guān)注點(diǎn)主要在于交付,我們把這個(gè)軟件開(kāi)發(fā)出來(lái)之后,把代碼提交,我用自動(dòng)化工具,把所有的東西進(jìn)行測(cè)試,測(cè)試沒(méi)問(wèn)題之后,把測(cè)試內(nèi)容看一下,沒(méi)問(wèn)題就自動(dòng)化的部署上線(xiàn),這樣就是一個(gè)非常流暢的過(guò)程。但是如果對(duì)于比較大型的企業(yè)級(jí)應(yīng)用,需要對(duì)軟件質(zhì)量,對(duì)軟件的一些部署流程做更多的控制。這時(shí)候我們需要去集成很多額外的第三方工具,幫我們完成這些事情。對(duì)于這種開(kāi)源社區(qū)里面,現(xiàn)在其實(shí)有非常多的工具,能夠把這一點(diǎn)點(diǎn)的,逐個(gè)逐個(gè)的綁定,我們不需要去重新做連接,我們需要把這些一個(gè)個(gè)的能夠平衡起來(lái),并且用戶(hù)體驗(yàn)上有可能不一致,能夠接入一些企業(yè)級(jí)的系統(tǒng),有的可能是單獨(dú)一個(gè)系統(tǒng),需要一些賬號(hào),本身能夠接入的一些東西,我們直接就接入了,沒(méi)有問(wèn)題。但是上面沒(méi)有插件的話(huà),我們還接入不進(jìn)來(lái),就有這些問(wèn)題,這是第三個(gè)比較大的問(wèn)題。
除此以外還有很多很多,當(dāng)我們做比較大型的軟件應(yīng)用的時(shí)候,我們可能需要考慮它的軟件高可用,是不是一個(gè)崩潰掉了,我們?nèi)康钠脚_(tái)都不可以用了,這樣整個(gè)團(tuán)隊(duì)的研發(fā)進(jìn)度一耽擱就不是錢(qián)的問(wèn)題了。
現(xiàn)在除了剛才講的開(kāi)源的工具以外,我們還有很多企業(yè)級(jí)的持續(xù)交付的工具,比較常見(jiàn)的話(huà)像teamcity、bamboo這些比較常見(jiàn)的,一些比較老牌企業(yè)的話(huà)可能還會(huì)用過(guò)IBM的Bluemix,Cloudbees是一個(gè)企業(yè)級(jí)方案,這套方案我個(gè)人認(rèn)為不是特別好。這些工具就是解決了一些開(kāi)源工具里面存在的一些問(wèn)題,特別是性能的問(wèn)題。但是當(dāng)我們?nèi)ナ褂眠@些工具做一些web集成的時(shí)候,可能它里面已經(jīng)內(nèi)置一些我們常用東西的集成,但是有的東西是我們企業(yè)用過(guò)的,每個(gè)企業(yè)都會(huì)有一些特殊的東西,比如說(shuō)資源審查的時(shí)候需要切入一些企業(yè)內(nèi)部的東西,這時(shí)候你會(huì)發(fā)現(xiàn)這些企業(yè)級(jí)產(chǎn)品在解決開(kāi)源產(chǎn)品問(wèn)題的時(shí)候,也引入了更大的封閉性。如果我發(fā)現(xiàn)一個(gè)問(wèn)題不能解決的話(huà),它就真的不能解決。它是開(kāi)源工具的話(huà),可能有一些社區(qū)方案,社區(qū)會(huì)提供一些插件,你不用干活,你拿過(guò)來(lái)用就可以。當(dāng)你使用企業(yè)級(jí)方案的時(shí)候,它這個(gè)支持沒(méi)有。我們有一個(gè)想法是,如果我們現(xiàn)在想要選擇企業(yè)級(jí)的平臺(tái),但是我們又想讓它能夠具有這個(gè)定制性,具有這個(gè)性能的話(huà),我們能夠通過(guò)一些開(kāi)源的工具,組合起來(lái),讓這個(gè)工具變成一個(gè)平臺(tái),變成一個(gè)企業(yè)級(jí)的平臺(tái)。
剛才王老師講的就是集成了各種各樣華為內(nèi)部開(kāi)發(fā)者工具的云,包括持續(xù)交付,包括代碼的構(gòu)建、打包、部署等等這一系列的平臺(tái)。答案肯定是可以的,包括像現(xiàn)在華為應(yīng)該也是使用了一些開(kāi)源組建,沒(méi)有必要把數(shù)據(jù)全部重新存,這樣會(huì)造成很大的完全沒(méi)有必要的消耗。如果要做這件事情的話(huà)可能會(huì)遇到什么問(wèn)題,剛才講到各種各樣的問(wèn)題。首先是性能問(wèn)題,數(shù)據(jù)的集成問(wèn)題,集成工具的問(wèn)題,還有剛才提到的很多很多其他需要解決高可用、審計(jì)、權(quán)限、登錄等等,這些都是需要去解決的,它確實(shí)是有這個(gè)麻煩。以及一點(diǎn)我們信息要考慮現(xiàn)在比較流行的現(xiàn)代化的部署方式,我們也把它作為一個(gè)方案考慮進(jìn)去。
我們現(xiàn)在看要解決這些問(wèn)題的話(huà)有什么比較簡(jiǎn)單的方式,或者是不會(huì)太費(fèi)事的方式,把這個(gè)問(wèn)題解決過(guò)去。首先說(shuō)性能問(wèn)題,由于大部分開(kāi)源工具本身都不是為了這種大規(guī)模應(yīng)用設(shè)計(jì)的,它本身是確定存在的,但是它的規(guī)模上來(lái)之后,就會(huì)出現(xiàn)這種響應(yīng)速度慢,不可用的問(wèn)題。我們要么去改原代碼,把它變成高可用的。
剛才提到的第二個(gè)問(wèn)題是數(shù)據(jù)的集成,數(shù)據(jù)集成很簡(jiǎn)單,所有的構(gòu)建,所有的測(cè)試,所有的部署,都在平臺(tái)上面做的,什么數(shù)據(jù)都有。但是從實(shí)際實(shí)踐來(lái)說(shuō)的話(huà)我們可能會(huì)有多種思路,怎么去算這個(gè)數(shù)據(jù)。***種最簡(jiǎn)單的,我們?cè)诖a里面寫(xiě)一個(gè)服務(wù),每小時(shí)算一次,每天算一次,把報(bào)表算出來(lái)。這樣實(shí)現(xiàn)非常簡(jiǎn)單,但是它的一個(gè)缺陷是,我們預(yù)定要算什么樣的數(shù)據(jù)就算什么樣的數(shù)據(jù)。它的數(shù)據(jù)算出來(lái)只是在你的數(shù)據(jù)庫(kù)里面的,如果持續(xù)算的話(huà),對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō)的,這種大量計(jì)算的壓力很大,真正來(lái)做的話(huà)肯定是提前算好,大家讓我查誰(shuí)就去查誰(shuí),提前做成一個(gè)表。第二個(gè)方式,我現(xiàn)在知道這兩年大數(shù)據(jù)這一塊的生態(tài)是非常多的,有很多這方面的高手,每個(gè)企業(yè)多少都會(huì)有一些做數(shù)據(jù)的人。我們也可以把這個(gè)數(shù)據(jù)接入到平臺(tái)來(lái),無(wú)非就是一些數(shù)據(jù)表,我們可以分析具體到每一個(gè)人,具體到每一個(gè)子團(tuán)體的變化,***可能是一個(gè)比較邪惡的平臺(tái),講出來(lái)就不行了。但是這個(gè)方式成本會(huì)比較高,它能夠?qū)崿F(xiàn)的是實(shí)時(shí)的預(yù)算,也能夠提供一個(gè)基于這個(gè)數(shù)據(jù)深層次的挖掘,提供很多從外面很難看出來(lái)的一些存在的問(wèn)題。
下面一個(gè)方式是我們?cè)谧渲幸粋€(gè)嘗試當(dāng)中去做的方法,在數(shù)據(jù)庫(kù)里面進(jìn)行操作性是比較低的,但是我們可能通過(guò)一些專(zhuān)門(mén)做檢索,專(zhuān)門(mén)做搜索的工具,去做做搜索。
第三個(gè)是平臺(tái)集成,平臺(tái)集成對(duì)于開(kāi)源來(lái)說(shuō)是最最友好的事情,開(kāi)源為什么叫開(kāi)源,我們現(xiàn)在有大量可用的東西,是社區(qū)其他人開(kāi)發(fā)出來(lái)貢獻(xiàn)出來(lái)的,我們可能只需要找到這個(gè)組建能夠用的。但是這個(gè)集成,如果這些東西我們?cè)谶@個(gè)環(huán)境里面***都是一個(gè),都是來(lái)自一些開(kāi)發(fā)者,你去用,這個(gè)相當(dāng)于增加了開(kāi)發(fā)者的學(xué)習(xí)困難,他需要知道每個(gè)工具里面怎么用,甚至他可能會(huì)對(duì)這個(gè)不滿(mǎn)意。
這邊一般來(lái)說(shuō)推薦一個(gè)做法,在我們真正的項(xiàng)目溝通需要集成的平臺(tái)之間做一個(gè)服務(wù)的索引,這樣的好處主要是為了方便升級(jí),在這個(gè)上面可以做很多的事情?,F(xiàn)在這種做法是比較推薦的接入第三方工具的一個(gè)做法。
其他的話(huà),剛才提到的還有我們考慮高可用,需要考慮操作審計(jì),權(quán)限等問(wèn)題。高可用剛才提到了如果本身這個(gè)開(kāi)源工具設(shè)置上就是高可用,我們要去做到高可用的話(huà),就必須代到源代碼。我們現(xiàn)在有一個(gè)團(tuán)隊(duì)在做這個(gè)事情,但是這個(gè)事情并不是沒(méi)有人都去嘗試的,因?yàn)閺某杀旧虾軇澆粊?lái)。如果說(shuō)我們把每個(gè)項(xiàng)目都做了一個(gè)性能之后,我們系統(tǒng)本身做的是統(tǒng)一的,但是對(duì)于高可用的點(diǎn),我們可以把它的,比如說(shuō)每個(gè)(32:02),和具體的項(xiàng)目進(jìn)行對(duì)應(yīng)。當(dāng)我們出現(xiàn)故障的時(shí)候,可能是單個(gè)的項(xiàng)目發(fā)生了問(wèn)題,快速的重啟一個(gè)(32:17),這樣只要把故障在一定程度上進(jìn)行隔離,不會(huì)把這個(gè)故障延伸。這樣從使用的組織方式來(lái)避免這種故障發(fā)生,故障出問(wèn)題了,我把它鎖定在一個(gè)項(xiàng)目組里面,或者鎖定在一個(gè)子項(xiàng)目組里面,把它做一個(gè)關(guān)聯(lián),這是我們的事。
單點(diǎn)登錄的話(huà),如果我們前端做一個(gè)界面,去屏蔽比較復(fù)雜的其他軟件的話(huà),前端盡可能的把細(xì)節(jié)都屏蔽掉,屏蔽不掉的時(shí)候,當(dāng)它暴露集成系統(tǒng)的時(shí)候,盡可能實(shí)現(xiàn)它的維護(hù)。就是它能夠不用(34:00%,或者如果不能單點(diǎn)登錄的話(huà),就要賬號(hào)統(tǒng)一。構(gòu)建產(chǎn)物管理主要是為了部署做準(zhǔn)備的,就是每個(gè)構(gòu)建出來(lái)的包我們需要把它管理起來(lái),需要知道這些管理的包是不是一個(gè)。當(dāng)我們?nèi)ミM(jìn)行后續(xù)部署的時(shí)候,才知道是這一個(gè)包,這樣就能夠?qū)崿F(xiàn)部署。這些功能確切要求我們知道去布哪個(gè)包,但是對(duì)于用戶(hù)來(lái)說(shuō)的話(huà),如果讓用戶(hù)來(lái)選擇哪個(gè)包是你要做回購(gòu),他是找不出來(lái)的,就需要平臺(tái)進(jìn)行管理,這樣比較節(jié)約時(shí)間,得到構(gòu)建的序號(hào),能夠追溯這個(gè)東西。***這個(gè)東西是測(cè)試報(bào)告管理,測(cè)試報(bào)告主要是提供數(shù)據(jù),提供后面的報(bào)表,或者是提供一些跟指標(biāo)相關(guān)東西的內(nèi)容。
***一點(diǎn)是關(guān)于部署的邏輯化,這個(gè)邏輯化展開(kāi)說(shuō)的話(huà)會(huì)有很多,但是普遍上來(lái)說(shuō)使用邏輯化的思路就在于,對(duì)于企業(yè)級(jí)的這種產(chǎn)品我們肯定不會(huì)單獨(dú)的使用,會(huì)在一個(gè)集群上使用。
我今天講的主要就是一個(gè)純技術(shù)的東西,不涉及到任何產(chǎn)品,也不涉及推薦任何東西的使用。這邊順便說(shuō)一下,這個(gè)大家要做的話(huà)成本會(huì)比較高,雖然是我們低成本的開(kāi)元工具的組合,但是如果你想要用這套工具的話(huà),可以考慮剛才王老師提到的平臺(tái)劃分。謝謝大家,大家有什么問(wèn)題。