天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

持續(xù)集成之“依賴管理”

  在前文《分支策略(續(xù))》中,我們討論了多組件應(yīng)用程序的持續(xù)集成策略,即:為相對(duì)獨(dú)立的組件創(chuàng)建自己專(zhuān)屬的代碼庫(kù),然后通過(guò)現(xiàn)代持續(xù)集成工具進(jìn)行組件間的持續(xù)集成。Joe的團(tuán)隊(duì)在首次發(fā)布之后,開(kāi)始使用這種方式。然而,沒(méi)有多久,他們就遇到了一個(gè)問(wèn)題:一次提交構(gòu)建所花費(fèi)的時(shí)間太長(zhǎng)。

  一天,Joe就早早地來(lái)到了辦公室。因?yàn)樗耙惶煜掳嗲?,他開(kāi)發(fā)的用戶故事還有一小點(diǎn)就完事兒了。他想利用早上這點(diǎn)兒時(shí)間把它搞完,交給測(cè)試人員進(jìn)行測(cè)試。他修改了某個(gè)模塊的一段代碼,在本地構(gòu)建測(cè)試通過(guò)以后,就提交了, 然后起身去樓下買(mǎi)些早點(diǎn)。十五分鐘后,他回到了電腦前,令他沮喪的是,這次構(gòu)建還在進(jìn)行最后的階段,即所有模塊集成測(cè)試和系統(tǒng)級(jí)測(cè)試。他只好又起身去沖了杯咖啡。然后,一邊看著屏幕上的構(gòu)建進(jìn)度條,一邊喝著咖啡。七分鐘后,構(gòu)建終于成功結(jié)束了。雖然這是一次成功的構(gòu)建,但總是覺(jué)得不爽,花了二十多分鐘才做完提交構(gòu)建。于是,他開(kāi)始仔細(xì)地查看起構(gòu)建腳本和構(gòu)建日志。

  一、一次生成,多次復(fù)用

  中午吃過(guò)午飯,他把Bob和Alice叫到一起,開(kāi)始討論早上他遇到的問(wèn)題。

  “的確是非常煩人,現(xiàn)在構(gòu)建時(shí)間太長(zhǎng)了。”Alice說(shuō)道。

  “我今天早上查看了一下我們的構(gòu)建日志,發(fā)現(xiàn)構(gòu)建時(shí)間長(zhǎng)的原因之一是:每種測(cè)試開(kāi)始之前都要更新代碼,再重新編譯一次。”Joe說(shuō)道。

  Bob提出了一個(gè)解決方案,并畫(huà)在了白板上。“我們是否可以建立統(tǒng)一的產(chǎn)物庫(kù),每次構(gòu)建的產(chǎn)物都以一定的規(guī)則放在其中?這樣,后續(xù)的測(cè)試需要使用這些二進(jìn)制產(chǎn)物的話,直接從產(chǎn)物庫(kù)中獲取即可。”(如圖1所示)

  “聽(tīng)上去不錯(cuò)。然而,我們是否需要把每次構(gòu)建中產(chǎn)生的內(nèi)容都放入產(chǎn)物庫(kù),這會(huì)非??斓爻缘粑覀兊拇疟P(pán)空間。”Alice不無(wú)擔(dān)心的說(shuō)。

  “目前構(gòu)建完成以后,所有的產(chǎn)物都放在那臺(tái)構(gòu)建機(jī)器上。我們也遇到過(guò)因構(gòu)建機(jī)器硬件問(wèn)題或誤操作將所有重要?dú)v史信息都丟失的事情。所以,我們至少需要備份。”Bob回答道,“另外,將每次構(gòu)建的產(chǎn)物放在統(tǒng)一產(chǎn)物庫(kù)中,我們就可以解決Joe剛才提出的重復(fù)編譯問(wèn)題。當(dāng)然,我們需要有選擇地將重要的構(gòu)建產(chǎn)物放到統(tǒng)一產(chǎn)物庫(kù)中,而不是所有內(nèi)容。通過(guò)在每次構(gòu)建后增加一個(gè)上傳任務(wù),讓各小組將其認(rèn)為有用的信息上傳到產(chǎn)物庫(kù),比如構(gòu)建日志、測(cè)試報(bào)告、構(gòu)建后的二進(jìn)制文件等。但一些臨時(shí)文件就沒(méi)有必要了。當(dāng)然,這只能緩解產(chǎn)物庫(kù)膨脹的速度。盡管持續(xù)構(gòu)建的次數(shù)非常多,但我們并不是需要一直保持所有構(gòu)建的產(chǎn)物,所以,可以定期刪除那些沒(méi)有保留價(jià)值的構(gòu)建產(chǎn)物,比如對(duì)那些重要構(gòu)建的產(chǎn)物進(jìn)行標(biāo)記,其它的就可以刪除了。”

  Alice和Joe都點(diǎn)了點(diǎn)頭,表示同意。但Joe的眉頭馬上又皺了起來(lái)。“嗯,好象這里還有點(diǎn)兒?jiǎn)栴}。”

  “什么問(wèn)題?”Alice和Bob同時(shí)問(wèn)道。

  Joe說(shuō)道:“對(duì)于我們平臺(tái)中的一些小游戲組件來(lái)說(shuō),這沒(méi)有什么問(wèn)題。因?yàn)樗鼈兊臉?gòu)建產(chǎn)物都不太大,網(wǎng)絡(luò)傳輸帶寬和速度都不是問(wèn)題。但是,對(duì)于那些很大的二進(jìn)制文件或測(cè)試數(shù)據(jù)來(lái)說(shuō),這么做的話,可能就有問(wèn)題了。”大家都點(diǎn)了點(diǎn)頭,并開(kāi)始思考這個(gè)問(wèn)題。

  忽然,Joe叫道:“不好意思,其實(shí)這不是個(gè)真正的問(wèn)題。首先,我們的測(cè)試數(shù)據(jù)變化就不頻繁,原來(lái)也沒(méi)有放在產(chǎn)物庫(kù)中,而是放在了一個(gè)共享目錄中進(jìn)行版本管理。所以,這部分在構(gòu)建中的做法與之前沒(méi)有什么不同。其次,對(duì)于較大的二進(jìn)制文件,只要在需要它的構(gòu)建機(jī)器上把它緩存起來(lái)。那么在下一次構(gòu)建時(shí),構(gòu)建腳本可以對(duì)這個(gè)本地版本進(jìn)行驗(yàn)證,如果版本正確且沒(méi)有被破壞(比如通過(guò)MD5驗(yàn)證)就可以繼續(xù)使用。否則,就再?gòu)慕y(tǒng)一產(chǎn)品庫(kù)取出正確的文件將其覆蓋就行了。”

  “這么做還有一個(gè)好處,而且是非常重要的好處。”Alice補(bǔ)充道,“我們的手工測(cè)試版本也可以從統(tǒng)一的產(chǎn)物庫(kù)中拿到,這就保證了自動(dòng)化測(cè)試所有的二進(jìn)制文件與部署到手工測(cè)試環(huán)境中的二進(jìn)制文件是同一個(gè)文件了,也就不會(huì)出現(xiàn)因重新編譯時(shí)的環(huán)境不同而導(dǎo)致的不一致問(wèn)題了。而當(dāng)我們做上線部署時(shí),也從這個(gè)統(tǒng)一產(chǎn)品庫(kù)中獲取,從而做到自編譯開(kāi)始直到上線部署的二進(jìn)制包的一致性啦。”

  于是,Joe與團(tuán)隊(duì)一起對(duì)其持續(xù)集成平臺(tái)和所有構(gòu)建進(jìn)行了改造,將其打造成了一個(gè)具有組織級(jí)產(chǎn)物庫(kù)的持續(xù)集成和發(fā)布管理平臺(tái)。他們不但有效地縮短了每次構(gòu)建的時(shí)間,還可以輕松地通過(guò)產(chǎn)物庫(kù)追蹤到每個(gè)上線版本在代碼版本控制庫(kù)中的對(duì)應(yīng)代碼,讓問(wèn)題追查變得更容易了。

  二、依賴管理

  一個(gè)月后,根據(jù)市場(chǎng)的需求反饋,他們開(kāi)發(fā)的一個(gè)游戲升級(jí)了,反應(yīng)速度非常快,效果非常好。但引申出來(lái)的一個(gè)問(wèn)題是:游戲和平臺(tái)的升級(jí)頻率不一致,持續(xù)集成應(yīng)該怎么做。對(duì)于Joe的團(tuán)隊(duì)來(lái)說(shuō),是一個(gè)非常大的問(wèn)題,因?yàn)樗麄兊拈_(kāi)發(fā)流程嚴(yán)重地依賴于持續(xù)集成平臺(tái)。于是,Joe和團(tuán)隊(duì)的核心成員打算討論一下,如何應(yīng)對(duì)目前這種情況。

  在會(huì)議室的白板前,Joe畫(huà)出了當(dāng)前所用的持續(xù)集成策略(如前圖所示)。

  Bob說(shuō)道:“到目前為止,我們已經(jīng)發(fā)布了幾次,而且最近一次只發(fā)布了一個(gè)游戲應(yīng)用。我們?nèi)绾喂芾砦覀兊陌l(fā)布流程呢?在我之前工作過(guò)的公司中,產(chǎn)品會(huì)有幾個(gè)版本,包括穩(wěn)定版本、已對(duì)外發(fā)布或即將發(fā)布的版本、最新版本:用于公司內(nèi)部測(cè)試。每當(dāng)將要發(fā)布新版本時(shí),就拉出一個(gè)分支,進(jìn)行內(nèi)部測(cè)試,并修復(fù)嚴(yán)重的缺陷。當(dāng)沒(méi)有嚴(yán)重缺陷時(shí),才能作為穩(wěn)定版本公開(kāi)發(fā)布。”

  Alice答道:“對(duì)于單個(gè)的軟件交付產(chǎn)品來(lái)說(shuō),通常可以通過(guò)“按發(fā)布拉分支” 的方式進(jìn)行開(kāi)發(fā),正如我們最開(kāi)始所使用的持續(xù)集成策略。但是,現(xiàn)在我們的游戲平臺(tái)與單個(gè)交付產(chǎn)品不同。我們有自己的服務(wù)器集群,只要測(cè)試覆蓋率及測(cè)試質(zhì)量足夠好,測(cè)試速度足夠快,我們就可以通過(guò)小流量試驗(yàn)部署后再大規(guī)模上線的方式進(jìn)行發(fā)布?,F(xiàn)在,我們的問(wèn)題是由于各個(gè)游戲組件的發(fā)布頻率各不相同,組件存在依賴關(guān)系,導(dǎo)致很難決定在持續(xù)集成過(guò)程中,到底應(yīng)該使用哪個(gè)依賴版本。尤其是我們現(xiàn)在還有一個(gè)公共庫(kù),被多個(gè)組件使用。”

  Joe說(shuō)道:“我們先梳理一下整個(gè)平臺(tái)上的依賴關(guān)系吧。通常來(lái)說(shuō),軟件中的依賴關(guān)系通常包括編譯時(shí)依賴、測(cè)試時(shí)依賴和運(yùn)行時(shí)依賴。而從依賴形式上可以分為庫(kù)依賴和組件依賴。所謂庫(kù)依賴,是指依賴于那些不受控的庫(kù)文件,比如我們使用了一些開(kāi)源或者付費(fèi)的的類(lèi)庫(kù)文件或工具,這些庫(kù)文件的特點(diǎn)是更新較慢,甚至基本不需要更新。而組件依賴是指依賴于那些由自己團(tuán)隊(duì)或公司內(nèi)的其它團(tuán)隊(duì)開(kāi)發(fā)的組件,這類(lèi)依賴的特點(diǎn)是更新頻率相對(duì)高,有些甚至非常頻繁。對(duì)于庫(kù)文件依賴,我們可以在代碼庫(kù)中建立一個(gè)目錄,叫做lib,并在其下建立build、test、run三個(gè)子目錄,把我們所依賴的庫(kù)文件放到相應(yīng)的子目錄中。同時(shí),每個(gè)庫(kù)文件的文件名中最好包含它的版本號(hào),如nunit-2.6.0.11089.bin。這樣,就很容易看出依賴了哪些庫(kù)文件。”

    Bob接道:“可惜我們不是用Java平臺(tái),否則我們可以用象MavenIvy這樣的工具來(lái)管理這些外部庫(kù)依賴了。而且,同時(shí)可以在公司內(nèi)部利用Artifactory或Nexus這樣的開(kāi)源工具建立一個(gè)內(nèi)部統(tǒng)一服務(wù)器,專(zhuān)門(mén)管理公司內(nèi)部所用的這些庫(kù)依賴。”

    Alice說(shuō)道:“我們也可以自己做一個(gè)簡(jiǎn)單的依賴管理系統(tǒng)。比如使用Key-value的格式用文本文件來(lái)描述所用到的庫(kù)文件名及版本號(hào)及存放位置,然后再寫(xiě)個(gè)通用腳本讀取信息下載到本地使用。”

    Bob接著問(wèn)道:“對(duì)于這種庫(kù)文件的依賴管理相對(duì)容易一些。而我們面臨的重要問(wèn)題好象是組件依賴管理。有什么好辦法嗎?”

    Joe想了想,說(shuō)道:“方法倒是有幾個(gè),各有優(yōu)缺點(diǎn)。一種方法是將組件依賴轉(zhuǎn)成庫(kù)依賴。其適用的場(chǎng)景是該組件經(jīng)過(guò)一段時(shí)間的開(kāi)發(fā)的維護(hù)后已趨于穩(wěn)定,變化不太多。此時(shí)就可以將這個(gè)組件打包后與其它外部依賴庫(kù)放在一起,并加入正確的描述,以便依賴于它的所有組件都可以正確地拿到正確的版本。還有一種方法是我們目前所用的方法。即每個(gè)組件各自進(jìn)行持續(xù)構(gòu)建,然后再做集成構(gòu)建。其中存在的問(wèn)題是我們?nèi)绾喂芾砀鹘M件不同版本之間的組合關(guān)系。我們一直使用的策略是無(wú)論哪次提交,都會(huì)觸發(fā)整個(gè)構(gòu)建。目前要做的有兩件事:一是將公共庫(kù)獨(dú)立出來(lái),進(jìn)行單獨(dú)構(gòu)建,并且一旦構(gòu)建成功,自動(dòng)觸發(fā)那些依賴于它的其它組件構(gòu)建,最后進(jìn)行集成構(gòu)建。只要我們記錄每次構(gòu)建后的版本及源代碼的revision就行,以便可以追蹤。二是將游戲平臺(tái)的持續(xù)構(gòu)建觸發(fā)其它游戲組件的持續(xù)集成。所以,觸發(fā)關(guān)系應(yīng)該是這樣的。”Joe拿起筆,在白板上重新畫(huà)了一下觸發(fā)關(guān)系圖(圖2)。

    Bob搖了搖頭,說(shuō)道:“這樣還是解決不了我們之前說(shuō)過(guò)的問(wèn)題,即我們的發(fā)布頻率不一致,如何來(lái)管理這些發(fā)布之間的關(guān)系。”

    “噢,這個(gè)問(wèn)題是這樣的。”Joe回答道:“我認(rèn)為,我們之前單獨(dú)發(fā)布一個(gè)游戲組件是不對(duì)的。我們因市場(chǎng)壓力而將該游戲組件直接部署到生產(chǎn)環(huán)境中,盡管在發(fā)布前的評(píng)估認(rèn)為,該游戲所依賴的平臺(tái)接口沒(méi)有發(fā)生變化。正確的做法有兩種:(方案A)將平臺(tái)作為一個(gè)整體一同發(fā)布,因?yàn)槲覀儗?duì)平臺(tái)也做了修改,當(dāng)時(shí),所有的持續(xù)集成測(cè)試都是基于主干的最新版本所做的。(方案B)讓所有游戲組件依賴于游戲平臺(tái)的最新發(fā)布的穩(wěn)定版本進(jìn)行開(kāi)發(fā)。由于平臺(tái)的新功能開(kāi)發(fā)較慢,所以只要平臺(tái)接口不發(fā)生變更,各游戲應(yīng)用都可以基于平臺(tái)的穩(wěn)定發(fā)布版本進(jìn)行快速更新。但只要某個(gè)游戲需要修改平臺(tái)的接口,就必須與平臺(tái)的最新代碼進(jìn)行持續(xù)集成,并一同發(fā)布。”

    Alice皺了皺眉,說(shuō)道:“這么看來(lái),對(duì)于整個(gè)軟件來(lái)說(shuō),能夠保持主干隨時(shí)可以發(fā)布才更容易管理組件依賴。因?yàn)槊慨?dāng)需要發(fā)布時(shí),直接做主干發(fā)布就行了。實(shí)在不行的話,只要將所有組件在同一時(shí)間點(diǎn)拉出一個(gè)發(fā)布分支,然后統(tǒng)一上線就行了。”

    Bob說(shuō)道:“這樣也有問(wèn)題。我們的部署會(huì)很麻煩,時(shí)間可能會(huì)很長(zhǎng)。”

    Joe笑著說(shuō):“部署麻煩,我們可以通過(guò)一系統(tǒng)列的自動(dòng)化操作來(lái)解決。部署時(shí)間長(zhǎng)的話,我們使用的是集群部署,因此可以采用分批替換的方式來(lái)部署。但這種發(fā)布方式給我們帶來(lái)的益處是可以很快的響應(yīng)市場(chǎng)需求。”

    Joe拿起杯子喝了口咖啡,接著說(shuō)道:“當(dāng)然,這對(duì)我們的開(kāi)發(fā)工作也提出了挑戰(zhàn)。我們必須使用多種手段才能做到主干持續(xù)可發(fā)布狀態(tài)。比如(1)將新功能隱蔽起來(lái),直到它完成為止;(2)把所有的變更都變成一次次非常小的增量式修改,每個(gè)修改都做到可發(fā)布;(3)通過(guò)抽象達(dá)到分支的目的(Branch by Abstraction)。另外,我們的自動(dòng)化測(cè)試也需要保持在較高的覆蓋率,并豐富其它類(lèi)型的自動(dòng)化測(cè)試,比如性能測(cè)試,壓力測(cè)試等。如果遇到特殊情況,我們?cè)僮聛?lái)商量對(duì)策。”

    Bob仍舊有點(diǎn)遲疑,“這樣可能會(huì)增加我們的開(kāi)發(fā)成本。不過(guò),可以試一下,看看效果如何。”

    于是,整個(gè)團(tuán)隊(duì)開(kāi)始行動(dòng)起來(lái)了。他們?cè)谶@條道路上還會(huì)遇到什么情況呢?讓時(shí)間來(lái)回答這個(gè)問(wèn)題吧。

it知識(shí)庫(kù)持續(xù)集成之“依賴管理”,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 午夜在线视频国产极品片 | 欧亚一卡二卡日本一卡二卡 | 美女张开腿让男生桶动态图 | 久久AV国产麻豆HD真实乱 | 国产成人久久精品激情 | 国产中文字幕在线 | 揉抓捏打抽插射免费视频 | 国产精品热久久高潮AV袁孑怡 | 久久电影院久久国产 | MM131亚洲精品久久安然 | 国产精品一区二区激情 | 久久电影精品久久99久久 | 无码人妻精品一区二区蜜桃在线看 | 中文字幕天堂久久精品 | 灰原哀被啪漫画禁漫 | 男人天堂2018亚洲男人天堂 | 2017日日干| 国产69精品久久久久妇女 | 欧美伊人久久大香线蕉综合69 | 国内精品不卡一区二区三区 | 91交换论坛 | 少妇高潮A视频 | 99热精品在线视频观看 | 91日本在线观看亚洲精品 | 美女视频秀色福利视频 | 国产在线精品视频资源 | av av在线 | 免费夜里18款禁用软粉色 | 性绞姿始动作动态图 | 精品久久综合1区2区3区激情 | 日本亚洲精品色婷婷在线影院 | 免费观看国产视频 | 国产香蕉视频在线播放 | 亚洲欧美综合乱码精品成人网 | 小萝ar视频网站 | 久久aa毛片免费播放嗯啊 | 在线观看成年人免费视频 | 掀开奶罩边躁狠狠躁软学生 | 午夜福利08550 | 亚洲欧美自拍清纯中文字幕 | 老司机亚洲精品影院在线观看 |