CI/CD是什么?它如何幫助我們更快地遷移、部署?它值得我們這么興師動(dòng)眾嗎?本文將一探究竟。
CI/CD的全稱(chēng)是Continuous Integration and Continuous Delivery,意思是持續(xù)集成和持續(xù)交付,它自動(dòng)化了從最初的代碼提交,一直到部署的開(kāi)發(fā)過(guò)程,消除了大部分的人工干預(yù)成本。
CI/CD流程負(fù)責(zé)構(gòu)建、測(cè)試和部署新代碼到生產(chǎn)環(huán)境。Prometheus曾經(jīng)這樣評(píng)價(jià):它使軟件團(tuán)隊(duì)能夠更快地部署質(zhì)量更好的軟件。聽(tīng)起來(lái)很美好,但它在真實(shí)環(huán)境中有效嗎?答案是取決于系統(tǒng)本身的復(fù)雜性。
讓我們將CI/CD拆解出來(lái)并分別討論。CI的爭(zhēng)議較小且更為常見(jiàn)。簡(jiǎn)而言之,它是使用自動(dòng)化使團(tuán)隊(duì)能夠有效、頻繁地將代碼更改合并到共享存儲(chǔ)庫(kù)的一種做法。每個(gè)提交都會(huì)在CI服務(wù)器上觸發(fā)一個(gè)自動(dòng)化工作流,該工作流運(yùn)行一系列任務(wù)以確保提交可以安全地合并到主分支中。一個(gè)好的CI流程依賴(lài)于一組好的測(cè)試。維護(hù)一組具有足夠覆蓋率且不脆弱的測(cè)試并非易事,高測(cè)試覆蓋率通常需要更長(zhǎng)的時(shí)間才能運(yùn)行,這會(huì)影響開(kāi)發(fā)人員的生產(chǎn)力。
這是一個(gè)艱難的平衡操作,但值得付出正確的努力。
CI中常用的工具有哪些呢?一個(gè)好的源代碼管理系統(tǒng)是一切的基礎(chǔ)。
Github是一個(gè)非常流行的例子,它擁有構(gòu)建軟件所需要的一切,包括源代碼、測(cè)試腳本和構(gòu)建軟件應(yīng)用程序的腳本。
有許多工具可以管理CI流程本身。GithubActions和BuildKite是當(dāng)今常見(jiàn)的案例,Jenkins、CircleCI和TravisCI也很普遍,這些工具主要用于管理構(gòu)建和測(cè)試任務(wù)。
有許多用于編寫(xiě)和運(yùn)行測(cè)試的測(cè)試工具,這些工具通常是特定于語(yǔ)言和生態(tài)系統(tǒng)的。
例如對(duì)于JavaScript而言,Jest是單元測(cè)試框架,而playwright和cypress則是常見(jiàn)的web應(yīng)用程序集成測(cè)試框架。
構(gòu)建工具則更加的多樣化且依賴(lài)于特定的生態(tài)系統(tǒng)。
比如Greadle就是一款強(qiáng)大的Java構(gòu)建工具。JavaScript構(gòu)建的生態(tài)系統(tǒng)非常碎片化,很難跟蹤。webpack是一款標(biāo)準(zhǔn)化的工具,有很多新的構(gòu)建工具聲稱(chēng)要快得多,但它們的可擴(kuò)展性其實(shí)還不如webpack。
接下來(lái)我們看一下CI/CD中CD的部分。
CD就是持續(xù)部署。老實(shí)說(shuō),真正的持續(xù)部署是很難的,它確實(shí)存在,但在實(shí)踐中并不具備CI那樣的普遍性。
許多團(tuán)隊(duì)只在最基本的系統(tǒng)類(lèi)型上練習(xí)CD。這些系統(tǒng)通常不會(huì)過(guò)時(shí),例如API或Web服務(wù)器層,通過(guò)良好的生產(chǎn)監(jiān)控,這些系統(tǒng)可以以最小的風(fēng)險(xiǎn)實(shí)現(xiàn)持續(xù)部署,不僅不會(huì)過(guò)時(shí),而且回滾通常也非常的安全有效。將新功能包裝在功能標(biāo)志中,使得代碼部署與功能激活分開(kāi)也是一種常見(jiàn)的做法。它能幫助團(tuán)隊(duì)在新功能引發(fā)任何問(wèn)題時(shí)都能快速關(guān)閉,而且無(wú)需完全回滾。大家或許都知道,對(duì)于擁有數(shù)億用戶(hù)的產(chǎn)品,金絲雀部署也是常見(jiàn)的做法。
在大規(guī)模部署新代碼之前,先部署到一小部分高 級(jí)用戶(hù)和員工中,他們?cè)谄诖鹿δ艿耐瑫r(shí)又愿意承擔(dān)風(fēng)險(xiǎn)以幫助發(fā)現(xiàn)bug。這允許團(tuán)隊(duì)在真實(shí)環(huán)境中測(cè)試新代碼,同時(shí)在出現(xiàn)問(wèn)題時(shí)限制爆炸半徑。這些技術(shù)適用于簡(jiǎn)單的無(wú)狀態(tài)系統(tǒng)。
另一方面,很少有團(tuán)隊(duì)有資源或信念在復(fù)雜的主要系統(tǒng)(如數(shù)據(jù)庫(kù)后端集群)或其他類(lèi)型的主要系統(tǒng)(如websocket集群)上實(shí)施真正的連續(xù)切換部署。
相反,這些系統(tǒng)通常采用固定的部署節(jié)奏,部署過(guò)程是手動(dòng)的,有風(fēng)險(xiǎn)且耗時(shí)長(zhǎng),它們需要一個(gè)專(zhuān)門(mén)的團(tuán)隊(duì)來(lái)維護(hù),很少看到這些系統(tǒng)完全連續(xù)和自動(dòng)部署。
那么現(xiàn)在有哪些用于CD的工具呢?
我們前面提到的 Github Actions、BuildKite和Jenkins等工具通常都是用于處理 CD 任務(wù)的。
還有一些特定于基礎(chǔ)架構(gòu)的工具可以使 CD 更易于維護(hù),例如在Kubernetes上,ArgoCD就很受歡迎。
總之,CI/CD是一種強(qiáng)大的軟件開(kāi)發(fā)實(shí)踐,可以幫助團(tuán)隊(duì)更快地交付質(zhì)量更好的軟件。
但是,它并不是一個(gè)放之四海皆準(zhǔn)的萬(wàn) 能解決方案,其實(shí)現(xiàn)程度會(huì)因?yàn)橄到y(tǒng)的復(fù)雜性而呈現(xiàn)不同效果。
(推廣)