持續(xù)集成服務(wù)器部署策略

在軟件交付領(lǐng)域上有一個非常有用的啟發(fā)式原則:提前并頻繁地做讓你感到痛苦的事描函。集成通常是一個非常痛苦的過程傀蚌,所以每次有人提交代碼后應(yīng)立刻進(jìn)行集成九杂。

馬丁福勒說:

持續(xù)集成是一種軟件開發(fā)實(shí)踐嘲恍,即團(tuán)隊(duì)開發(fā)成員經(jīng)常集成他們的工作嘀趟,通過每個成員每天至少集成一次,也就意味著每天可能會發(fā)生多次集成绳姨。每次集成都通過自動化的構(gòu)建(包括編譯登澜,發(fā)布,自動化測試)來驗(yàn)證飘庄,從而盡早地發(fā)現(xiàn)集成錯誤脑蠕。

而持續(xù)集成服務(wù)器(也稱為構(gòu)建服務(wù)器,又稱CI服務(wù)器)是一種軟件工具跪削,它包含所有持續(xù)集成操作谴仙,并為我們構(gòu)建項(xiàng)目提供可靠和穩(wěn)定的環(huán)境。

工欲善其事切揭,必先利其器狞甚。持續(xù)集成的重要性毋庸置疑锁摔,但是理解如何創(chuàng)建安全廓旬、高效、可伸縮的持續(xù)集成服務(wù)器將使得持續(xù)集成更加順暢谐腰。

CI服務(wù)器 - 安裝方式

CI服務(wù)器的安裝方式有四種:

  • 單機(jī)
    單機(jī)的CI服務(wù)器即安裝在一臺單個主機(jī)上孕豹,通常用于小型項(xiàng)目。

  • 托管
    托管的CI服務(wù)器由托管平臺提供十气,一般是根據(jù)訂閱計(jì)價(jià)励背。這一般被那些不想維護(hù)CI服務(wù)器的企業(yè)所采納。

  • 私有云
    一些大型企業(yè)或者想要完全掌控及安全使用他們自己的基礎(chǔ)設(shè)施的組織砸西,通常會選擇私有云的部署方式叶眉。

  • 半托管半私有云
    這種方式是對托管部署和私有云部署的折中方案址儒。這種部署方式通常將流水線管理,日志管理衅疙,用戶管理部分進(jìn)行托管莲趣,而將流水線運(yùn)行時(shí)環(huán)境放在私有云中。這種方式即保證了基礎(chǔ)設(shè)施安全饱溢,同時(shí)也降低了維護(hù)CI服務(wù)器的成本喧伞。

我所在的團(tuán)隊(duì)最初使用私有云的方式搭建CI服務(wù)器,但出于可維護(hù)性绩郎、成本和安全性等方面的折中考慮轉(zhuǎn)向了半托管半私有云的安裝方式潘鲫。本文將主要討論在私有云和半托管半私有云安裝方式下CI服務(wù)器的部署策略。

CI服務(wù)器 - 主從架構(gòu)

主從架構(gòu)也叫主仆架構(gòu)或者M(jìn)aster-Slave架構(gòu)肋杖,主從式架構(gòu)意圖提供一個可伸縮的架構(gòu)溉仑,其核心是基于分而治之的思想,將一個原始任務(wù)分解為若干個子任務(wù)状植,并由專門的工作者來執(zhí)行這些任務(wù)彼念,原始任務(wù)的結(jié)通過整合各個子任務(wù)的處理結(jié)果形成。

圖1 - 主從架構(gòu)

主從架構(gòu)看似與CI服務(wù)器毫無關(guān)系浅萧,實(shí)則聯(lián)系緊密逐沙。因?yàn)楹芏郈I服務(wù)器使用了主從架構(gòu)或者服務(wù)器/代理架構(gòu)。通過主從架構(gòu)的Master可以進(jìn)行用戶管理洼畅、流水線管理吩案、日志管理。Master作為任務(wù)調(diào)度者帝簇,給多個主從架構(gòu)的Slave分配任務(wù)徘郭,Slave會將流水線任務(wù)運(yùn)行的信息和結(jié)果發(fā)給Master。主從架構(gòu)提供了一個可伸縮的架構(gòu)丧肴,所以可以動態(tài)的添加或者刪除Slave以支持團(tuán)隊(duì)動態(tài)變化的持續(xù)集成任務(wù)残揉。

CI服務(wù)器 - 部署策略

通常,一個開發(fā)團(tuán)隊(duì)會有三個應(yīng)用部署環(huán)境:開發(fā)環(huán)境(Dev)芋浮,類生產(chǎn)環(huán)境(Staging)和生產(chǎn)環(huán)境(Production)抱环。當(dāng)一次修改通過持續(xù)集成后,就會被部署到開發(fā)環(huán)境纸巷,然后部署到類生產(chǎn)環(huán)境镇草,然后部署到生產(chǎn)環(huán)境。

為此瘤旨,需要CI服務(wù)器具有操作相應(yīng)部署環(huán)境的權(quán)限梯啤。如圖2,開發(fā)環(huán)境中部署了CI服務(wù)器存哲,其中每個CI服務(wù)器都具有開發(fā)因宇、類生產(chǎn)和生產(chǎn)環(huán)境的權(quán)限七婴。

圖2

這種方式粗暴簡單,看似藥到病除實(shí)質(zhì)上卻會引發(fā)很嚴(yán)重的安全問題察滑。通常項(xiàng)目中對開發(fā)本姥、類生產(chǎn)和生產(chǎn)環(huán)境權(quán)限的管控類似于金字塔,越往上權(quán)限管控越嚴(yán)格杭棵。但如果開發(fā)環(huán)境的CI服務(wù)器也具有類生產(chǎn)和生產(chǎn)環(huán)境的權(quán)限婚惫,那么這座本來堅(jiān)固的金字塔將有可能瞬間崩塌。

為了解決開發(fā)環(huán)境CI服務(wù)器具有多環(huán)境操作權(quán)限的問題魂爪,如圖3所示先舷,可以在不同的環(huán)境獨(dú)立部署一套CI服務(wù)器,這樣部署某個環(huán)境時(shí)滓侍,就可以使用相應(yīng)環(huán)境的CI服務(wù)器即可蒋川。

圖3

但隨之而來的問題是,不同的環(huán)境獨(dú)立部署一套CI服務(wù)器撩笆,會使得每個環(huán)境的CI服務(wù)器之間沒有任何關(guān)系捺球。它們的流水線管理,日志管理夕冲,用戶管理都是獨(dú)立的氮兵。這意味著原本一個流水線完成的事情會分散的對個多個持續(xù)集成系統(tǒng)中,用戶需要在多個系統(tǒng)中來回切換歹鱼。這不僅降低了使用體驗(yàn)泣栈,并且增加了復(fù)雜性和維護(hù)成本。

那么有沒有什么辦法弥姻,既保證只部署一套CI服務(wù)器南片,同時(shí)又能保證CI服務(wù)器不能跨環(huán)境操作?如圖4所示庭敦,雖然所有的CI服務(wù)器依然部署在開發(fā)環(huán)境中疼进,但每個CI服務(wù)器代理已經(jīng)被打上了開發(fā)環(huán)境、類生產(chǎn)和生產(chǎn)環(huán)境的標(biāo)簽秧廉,并且只具有操作相應(yīng)環(huán)境的權(quán)限伞广。

圖4

這種部署策略看似解決了安全問題,但實(shí)際上有點(diǎn)掩耳盜鈴定血,因?yàn)橹灰_發(fā)環(huán)境上的用戶具有足夠的權(quán)限赔癌,他就有可能可以修改CI服務(wù)器代理的權(quán)限,從而達(dá)到操縱其他環(huán)境的目的澜沟。

既然如此,那么可不可以將CI服務(wù)器代理部署到相應(yīng)的環(huán)境中峡谊?如圖5所示茫虽,不同環(huán)境將維護(hù)相應(yīng)的CI服務(wù)器代理刊苍,通過這種部署方式,既保證只部署一套CI服務(wù)器濒析,同時(shí)又能保證CI服務(wù)器代理不能跨環(huán)境操作正什。

圖5

既然CI服務(wù)器代理可以部署到不同的環(huán)境中,那么CI服務(wù)器的Master還需要繼續(xù)放在開發(fā)環(huán)境中嗎号杏?這視情況而定婴氮,如果團(tuán)隊(duì)非常小,也許可以考慮將CI服務(wù)器的Master部署在生產(chǎn)環(huán)境中盾致,以限制操作CI服務(wù)器的Master主经。如果團(tuán)隊(duì)非常大,如圖6所示庭惜,也許可以考慮將CI服務(wù)器的Master部署到一個獨(dú)立的環(huán)境中罩驻,而這個環(huán)境則由一個專門的持續(xù)集成團(tuán)隊(duì)來維護(hù)。持續(xù)集成團(tuán)隊(duì)需要保證CI服務(wù)器的Master的可用性护赊。而業(yè)務(wù)開發(fā)團(tuán)隊(duì)只需要維護(hù)CI服務(wù)器代理惠遏。

圖6

假設(shè),某公司有3個業(yè)務(wù)開發(fā)團(tuán)隊(duì):Team A骏啰、Team B和Team C节吮。如圖7所示,Team A判耕、Team B和Team C可以共用由持續(xù)集成(CI)團(tuán)隊(duì)維護(hù)的Master服務(wù)器课锌。

圖7

但多個開發(fā)團(tuán)隊(duì)共享一個CI服務(wù)器的Master又引發(fā)了另一個問題。假設(shè)祈秕,Team A現(xiàn)在要創(chuàng)建一個流水線渺贤,那么Team B和Team C如何限制Team A無法使用Team B和Team C所維護(hù)的CI服務(wù)器代理?

一個團(tuán)隊(duì)在創(chuàng)建一個流程水線時(shí)请毛,可以根據(jù)CI服務(wù)器代理的標(biāo)簽來指定流水線不同的任務(wù)使用相應(yīng)環(huán)境的CI服務(wù)器代理志鞍。對于CI服務(wù)器的Master來說,Team A方仿、Team B和Team C的CI服務(wù)器代理都只是普通的代理固棚,它們之間除了具有不同的標(biāo)簽,CI服務(wù)器的Master對它們其他的信息一無所知仙蚜。

但對于CI服務(wù)器代理此洲,它是有能力知道在它上面運(yùn)行的流水線任務(wù)是不是合法。假設(shè)Team A委粉、Team B和Team C的代碼分別位于不同的git組織(organization): team-a-org, team-b-org和team-c-org呜师。通常一個流水線任務(wù)在CI服務(wù)器代理上執(zhí)行的第一件事情就是在git上拉取代碼庫的代碼,而代碼庫是位于特定的git組織之下的贾节,那么如圖8所示汁汗,通過在團(tuán)隊(duì)的CI服務(wù)器代理配置git組織的白名單即可防止其他團(tuán)隊(duì)的流水線任務(wù)使用自己團(tuán)隊(duì)的CI服務(wù)器代理衷畦。

圖8

隨著公司業(yè)務(wù)的發(fā)展,項(xiàng)目不斷的增多知牌,每日需要持續(xù)集成的任務(wù)越來越多祈争,這就需要更多的CI服務(wù)器代理。如果Team A角寸、Team B和Team C分別增加了CI服務(wù)器代理以滿足自己團(tuán)隊(duì)持續(xù)集成任務(wù)的需要菩混,但這些CI服務(wù)器代理在團(tuán)隊(duì)之間是不能共享的,這就帶來了資源浪費(fèi)扁藕。

仔細(xì)研究持續(xù)集成任務(wù)沮峡,持續(xù)集成的大多數(shù)任務(wù)是不需要操作環(huán)境資源的,它們只需要拉取代碼的權(quán)限纹磺,然后運(yùn)行測試帖烘。如此一來,如圖9所示橄杨,可以由CI團(tuán)隊(duì)維護(hù)一組共享的CI服務(wù)器代理秘症,這些代理不具有任何操作環(huán)境資源的能力,它只是一個測試運(yùn)行的環(huán)境式矫。

圖9

由此乡摹,可以將CI服務(wù)器代理分為環(huán)境操作無關(guān)環(huán)境操作相關(guān)兩類。環(huán)境操作無關(guān)的CI服務(wù)器代理由CI團(tuán)隊(duì)維護(hù)采转,通常用來做持續(xù)集成聪廉,環(huán)境操作相關(guān)的CI服務(wù)器代理由業(yè)務(wù)開發(fā)團(tuán)隊(duì)維護(hù),通常用來做持續(xù)部署故慈。

如圖10所示板熊,當(dāng)代碼修改后會自動觸發(fā)CI流水線。對于與環(huán)境操作無關(guān)的任務(wù):單元測試和驗(yàn)收測試察绷,可以使用由CI團(tuán)隊(duì)維護(hù)的共享的CI服務(wù)器代理來執(zhí)行干签。而對于與環(huán)境操作相關(guān)的任務(wù):部署開發(fā)環(huán)境、部署類開發(fā)環(huán)境和部署開發(fā)環(huán)境則使用具有相應(yīng)環(huán)境操作權(quán)限的CI服務(wù)器代理來執(zhí)行拆撼。

圖10

對于一個組織來說容劳,如果選擇同時(shí)維護(hù)CI服務(wù)器Master和CI服務(wù)器代理,那么使用的就是私有云安裝方式闸度。但是維護(hù)CI服務(wù)器Master需要投入大量的人力來維護(hù)其可用性竭贩,并不是每個組織都愿意為它買單,在這種情況下可以選擇使用半托管半私有云的安裝方式莺禁,如圖11所示:

圖11

通過使用半托管半私有云的安裝方式留量,一個組織里每個團(tuán)隊(duì)只需要維護(hù)CI服務(wù)器代理。這些CI服務(wù)器代理通過Key校驗(yàn)后與托管的Master相連,CI服務(wù)器代理不維護(hù)任何狀態(tài)肪获,它只提供了一個任務(wù)運(yùn)行時(shí)的環(huán)境寝凌,在任務(wù)運(yùn)行的過程中CI服務(wù)器代理將任務(wù)運(yùn)行的狀態(tài)和日志發(fā)給Master柒傻。這種情況下當(dāng)一個CI服務(wù)器代理執(zhí)行完任務(wù)后如果沒有其它的任務(wù)孝赫,其實(shí)這個CI服務(wù)器代理所占的資源就可以被釋放了,當(dāng)有任務(wù)時(shí)再立即分配資源給CI服務(wù)器代理红符,然后執(zhí)行任務(wù)青柄。

CI服務(wù)器 - 按需分配

為了合理的利用資源,需要對CI服務(wù)器進(jìn)行按需分配预侯。然而現(xiàn)在主流的CI服務(wù)器都沒有原生的支持按需分配的功能致开,所以需要開發(fā)團(tuán)隊(duì)自己實(shí)現(xiàn)如何對CI服務(wù)器進(jìn)行按需分配。

如圖12所示萎馅,通過信息收集器(Metrics Collector)來收集Team A的CI服務(wù)器代理的使用狀態(tài)双戳,收集的信息如:正在運(yùn)行任務(wù)的數(shù)量、已安排要運(yùn)行任務(wù)的數(shù)量糜芳、未完成任務(wù)的數(shù)量飒货、空閑CI服務(wù)器代理的數(shù)量、繁忙CI服務(wù)器代理的數(shù)量和CI服務(wù)器代理的總數(shù)峭竣。通過這些信息判斷是否需要對CI服務(wù)器代理擴(kuò)容或者減容塘辅,通過這種方式達(dá)到按需分配。

圖12

總結(jié)

選擇何種CI服務(wù)器的安裝方式或者部署策略取決于團(tuán)隊(duì)對于安全性皆撩、可維護(hù)性扣墩、成本和團(tuán)隊(duì)自身能力的權(quán)衡。團(tuán)隊(duì)?wèi)?yīng)該根據(jù)團(tuán)隊(duì)當(dāng)前的情況動態(tài)調(diào)整CI服務(wù)器的安裝方式和部署策略扛吞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻惕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滥比,更是在濱河造成了極大的恐慌亚脆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件守呜,死亡現(xiàn)場離奇詭異型酥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)查乒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門弥喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玛迄,你說我怎么就攤上這事由境。” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵虏杰,是天一觀的道長讥蟆。 經(jīng)常有香客問我,道長纺阔,這世上最難降的妖魔是什么瘸彤? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮笛钝,結(jié)果婚禮上质况,老公的妹妹穿的比我還像新娘。我一直安慰自己玻靡,他們只是感情好结榄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囤捻,像睡著了一般臼朗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝎土,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天视哑,我揣著相機(jī)與錄音,去河邊找鬼瘟则。 笑死黎炉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的醋拧。 我是一名探鬼主播慷嗜,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丹壕!你這毒婦竟也來了庆械?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤菌赖,失蹤者是張志新(化名)和其女友劉穎缭乘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琉用,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堕绩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邑时。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奴紧。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晶丘,靈堂內(nèi)的尸體忽然破棺而出黍氮,到底是詐尸還是另有隱情唐含,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布沫浆,位于F島的核電站捷枯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏专执。R本人自食惡果不足惜淮捆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望他炊。 院中可真熱鬧争剿,春花似錦已艰、人聲如沸痊末。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凿叠。三九已至,卻和暖如春嚼吞,著一層夾襖步出監(jiān)牢的瞬間盒件,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工舱禽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炒刁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓誊稚,卻偏偏與公主長得像翔始,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子里伯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容