說在開頭
CI、CD 其實是三個概念,包含了一個 CI 和兩個 CD,CI全稱 Continuous Integration,表示持續(xù)集成,CD包含 Continuous Delivery和 Continuous Deployment,分別是持續(xù)交付和持續(xù)部署。這三個概念之間是有前后依賴關系的。
CI/CD 并不是一個工具,它是一種軟件開發(fā)實踐,核心是通過引入自動化的手段來提高軟件交付效率。CI/CD 最終目的:讓工程師更快 & 更高質(zhì)量 & 更簡單的交付軟件!
持續(xù)集成 & 持續(xù)交付 & 持續(xù)部署
持續(xù)集成(Continuous Integration)
什么是持續(xù)集成?
定義:持續(xù)頻繁的(每天多次)將本地代碼“集成”到主干分支,并保證主干分支可用
持續(xù)集成這個詞,起源于極限編程,是當時原始的12種實踐之一,持續(xù)集成的目的快速反饋問題讓產(chǎn)品可以快速迭代,同時還能保持高質(zhì)量。它的核心措施是,代碼集成到主干之前,必須通過編譯、代碼掃描、安全掃描、自動化測試等。只要編譯失敗、掃描出高級別問題或測試用例失敗,就不能集成。
Martin Fowler 說過,“持續(xù)集成并不能消除Bug,而是讓它們非常容易發(fā)現(xiàn)和改正?!?/p>
好處?
(1)通過自動化手段提高集成速度
在傳統(tǒng)的研發(fā)過程中,一般通過手動方式執(zhí)行編譯、測試、部署,自動化后,可大幅提高集成頻次,同時可以減少維護手工腳本帶來的低級問題
(2)將問題前置
在每次 commit 時就觸發(fā)編譯、測試,更快的發(fā)現(xiàn)問題
(3)防止本地代碼大幅偏離主干
如果不是經(jīng)常集成,主干又在不斷更新,會導致以后集成的難度變大,甚至難以集成。
觸發(fā)方式?
自動觸發(fā),通過自動化的 CI 服務或工具,自動監(jiān)聽代碼庫 Git Push & MR 等事件觸發(fā)
常見的工具如 Jenkins、GitlabCI、CircleCI、GithubActions 等等
螞蟻支持持續(xù)集成平臺有:雨燕(前端)、LinkE CI(后端)、伙伴(終端)、ACI(多語言)等
面臨的問題 & 阻礙?
理想很豐滿,現(xiàn)實很骨感,持續(xù)集成理念雖好,但實踐過程中卻有非常多的問題和阻礙,遠沒有想象中那么簡單!
常見的問題如:
(1)執(zhí)行環(huán)境異構(gòu)導致結(jié)果差異
比如Java測試,用戶執(zhí)行測試一般是本地通過IDEA右擊執(zhí)行測試或 mvn 命令,但是 CI 服務上的環(huán)境&機器規(guī)格和本地有很多差異,比如 JDK 不一樣、Maven 版本不一樣、Mac 和 Linux 差異等等會造成很多本地執(zhí)行可以通過但是 CI 上執(zhí)行不通過,或者 CI 上執(zhí)行明顯比本地慢的現(xiàn)象。
解決此類問題本質(zhì)還是減少異構(gòu),比如通過容器化方式讓執(zhí)行環(huán)境標準化,通過 Maven 緩存提高測試時間等等,同時作為 CI/CD 平臺方,也最好將測試、構(gòu)建的過程透明化(執(zhí)行機制、清晰的錯誤碼和解決方案),方便在出現(xiàn)問題的時候開發(fā)可以很方便的自助排查。
(2)沒有嚴格的測試要求
持續(xù)集成的理念是只要有問題一定要及時修復,比如執(zhí)行測試,必須保證所有case全部通過才能集成到主干,但是在現(xiàn)實中的場景,特別是一些規(guī)模大的歷史項目,由于歷史債等原因,導致測試case無法全部通過或者必須通過重試解決,開發(fā)很難有動力去改,導致集成質(zhì)量低效。
所以,持續(xù)集成的前提是,需要有一個心里準備花大精力去治理項目中的一些歷史債,尤其是改善歷史 case ,補充新 case ,降低 case 噪音,確保每次自動化觸發(fā)的測試可以準確反饋集成質(zhì)量!
(3)非常慢的構(gòu)建 & 測試速度
在 CI 上執(zhí)行構(gòu)建或測試的速度非常慢,導致集成效率非常低,這里的慢有兩種原因,一種是本身測試&編譯就慢,這時需要深入分析,需要結(jié)合并行分組、分布式緩存等技術解決。
這里的自動化測試中的集成測試可能會非常慢,所以一般保證在持續(xù)集成階段先讓單元測試通過,集成測試放在在持續(xù)交付階段完成。
持續(xù)交付(Continuous Delivery)
什么是持續(xù)交付?
定義:是持續(xù)集成的下一步,持續(xù)頻繁地將軟件的新版本交付到類生產(chǎn)環(huán)境(類似于預發(fā)),交付給測試、產(chǎn)品驗收。
持續(xù)交付強調(diào)的是“交付”,不管怎么更新,軟件是隨時隨地可以交付的,相比持續(xù)集成,持續(xù)交付除了交付到類生產(chǎn)環(huán)境之外,還會執(zhí)行一些集成測試、API測試等等,確保交付的產(chǎn)物可以直接交付部署。
觸發(fā)方式?
手動觸發(fā),通過研發(fā)平臺手動觸發(fā)(如觸發(fā)LinkE預發(fā)部署流水線),一般交付結(jié)果是一個二進制包或者鏡像
面臨的問題 & 阻礙?
(1)很難保證和線上環(huán)境完全一致
由于持續(xù)交付的環(huán)境很難和線上環(huán)境一致,所以可能導致一些問題無法驗證,使得交付的產(chǎn)物具備一定風險
探索方案:仿真環(huán)境
(2)大量腦殼疼的聯(lián)調(diào)環(huán)境問題
經(jīng)常遇到的場景是雖然本系統(tǒng)開發(fā)好了,但是由于各種原因?qū)е律舷掠蜗到y(tǒng)沒有 ready 導致無法持續(xù)交付,針對上下游依賴非常多的系統(tǒng),對聯(lián)調(diào)環(huán)境穩(wěn)定性、效率有非常強的依賴
(3)很難保證嚴格充分的自動化測試
持續(xù)交付最終要做到交付的產(chǎn)物可直接部署線上,那么對代碼的質(zhì)量要求就非常高,需要覆蓋全場景充分的測試 case
持續(xù)部署(Continuous Deployment)
什么是持續(xù)部署?
定義:是持續(xù)交付的下一步,“自動”將代碼部署到生產(chǎn)環(huán)境
持續(xù)部署強調(diào)的是“部署”,它的目標是,代碼在任何時刻都是可部署的,可以進入生產(chǎn)階段。
持續(xù)部署和持續(xù)交付觸發(fā)方式的區(qū)別是,持續(xù)部署是自動完成的,持續(xù)交付是手動完成的
觸發(fā)方式?
自動觸發(fā),通過研發(fā)平臺配置定時任務,自動獲取交付產(chǎn)物進行自動部署。
目前即使在螞蟻,應該很少有團隊和研發(fā)平臺能夠真正做到持續(xù)部署,因為持續(xù)的部署的條件更加嚴苛
面臨的問題 & 阻礙?
(1)發(fā)布條件受限
部分場景上線需要嚴格的審批的流程 & 頻繁的封網(wǎng)
(2)低效手工發(fā)布流程
發(fā)布過程需要人工一次次確認,灰度和線上發(fā)布過程多分組場景下,需要一次次人工確定,不放心自動發(fā)布
目前螞蟻解決方案:無人值守
(3)缺乏線上問題快速準確的反饋機制( 精準 OPS 能力)
沒有 OPS 或者 OPS 噪音太大都會導致反饋不及時,這樣研發(fā)就不敢把部署過程直接交給系統(tǒng),也是上面發(fā)布需要人工確認的根因
目前公司對線上安全要求非常高,持續(xù)部署現(xiàn)階段很難在螞蟻大規(guī)模落地,特別針對類似金融核心這些安全要求非常高的系統(tǒng),不過其實也未必要“一刀切”,公司還有很多級別不是特別高的應用,可以嘗試小范圍針對這些應用試點,同時不斷持續(xù)改進周邊 OPS 工具
最后
最后,我們來暢想一下,一個優(yōu)秀的 CI/CD 研發(fā)過程應該是什么樣子的?
假設開發(fā)同學小螞第一天入職,他打開電腦,通過以下幾步完成上線:
第一步:從 AntCode clone 代碼到本地,修改了幾行代碼,本地測試后,通過git commit & push到代碼倉庫
第二步:push 過程自動觸發(fā)了 CI 流水線,5 min 后,執(zhí)行結(jié)束,通過釘釘通知告訴小螞某個測試case失敗了
第三步:小螞本地修改失敗 case ,重新 commit & push ,再次觸發(fā) CI 流水線,自動執(zhí)行編譯、測試、掃描等,收到釘釘消息,執(zhí)行通過
第四步:小螞將功能交給測試&產(chǎn)品驗收,發(fā)現(xiàn)問題或收到建議,重新到第二步修改代碼。
第五步:測試&產(chǎn)品驗收沒有問題后,手動觸發(fā)預發(fā)部署流水線,并自動生成部署產(chǎn)物交付,后面流程就不用管啦。
第六步:持續(xù)部署流水線每幾分鐘自動檢測交付產(chǎn)物包,發(fā)現(xiàn)更新后,自動將產(chǎn)物部署到線上。發(fā)布成功后,小螞收到通知小螞的功能生效啦。文章來源:http://www.zghlxwxcb.cn/news/detail-779628.html
理想狀態(tài)?
(1)由于發(fā)布而導致的加班頻次應該大幅減少
(2)開發(fā)大部分精力是花在寫代碼和思考如何寫好代碼,掃描、部署的事情交由平臺自動化完成,并且體驗良好,反饋精準。文章來源地址http://www.zghlxwxcb.cn/news/detail-779628.html
到了這里,關于什么是 CI/CD ?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!