點擊鏈接閱讀原文,獲取更多技術(shù)內(nèi)容:https://Developer.aliyun.com/article/1280668?utm_content=g_1000377741
在一個大型團隊中,bug協(xié)同管理是一件復雜的事情,我們基于go-git開發(fā)實現(xiàn)了通用化的git-poison,通過分布式源碼管理bug追溯、查詢,可復制性高,適用于所有g(shù)it倉庫,與分支模式和代碼倉庫無關(guān)。
作者 | 澄晏
來源 | 阿里開發(fā)者公眾號
前言
在一個大型團隊中,bug協(xié)同管理是一件復雜的事情,發(fā)布經(jīng)理要追版本bug,運維同學要評估bug影響范圍,開發(fā)同學要在多個開發(fā)分支同時修復同一個bug,很容易出現(xiàn)bug漏提交、漏確認等生產(chǎn)安全問題。
本團隊也出現(xiàn)過一起不同分支漏提交bugfix導致的一起P1故障(最高等級),該bug在生產(chǎn)環(huán)境進行hotfix時,漏掉了少量集群導致該二次故障。舉個相似的例子,某品牌汽車發(fā)現(xiàn)潛在安全隱患進行召回,但卻遺漏了某個小地區(qū),偏偏在遺漏的地區(qū),發(fā)生了安全事故導致有人員傷亡。
我們基于go-git開發(fā)實現(xiàn)了通用化的git-poison,通過分布式源碼管理bug追溯、查詢,可復制性高,適用于所有g(shù)it倉庫,與分支模式和代碼倉庫無關(guān)。bug管理不依賴人與人之間溝通協(xié)調(diào),降低了認知負擔。
Bug為什么重復翻車
任何軟件都會有bug。即使再全面的測試,再細致的代碼review,也不能保證線上的每一段代碼都bug-free。但是已經(jīng)識別到的bug,為什么還會重復翻車呢?歸根結(jié)底,git多分支開發(fā)模式會導致bug擴散。引入bug和發(fā)現(xiàn)和修復bug的時間異步,口頭溝通確認bug易疏漏。
很多人看到前言的故障可能會認為,這只是“不小心”犯了個錯誤,下次再“細心”一點兒就好了。其實不是的,在百人規(guī)模的團隊中,人犯錯可以說是必然的。
上圖形象展示了人與人之間的協(xié)同成本。
10人團隊的整體協(xié)同一次的溝通次數(shù)為90/2=45次,那么100人則是4650次。這個次數(shù)只是相互協(xié)同一次,大多數(shù)場景下,由于bug和bugfix是隨時出現(xiàn)的,再加上人的失誤 (溝通中忘了某些bug等),所以一般來講,一個發(fā)布流程至少需要前后同步三次,溝通成本巨大。
所以誰能打包票,在這個流程中不犯錯?只有通過工具來進行自動化管理才能保證從“不做錯”到“做不錯”。
幾個典型翻車場景
場景一:未修復bug代碼上線
圖2 發(fā)布同學多方協(xié)同
?微服務化盛行,系統(tǒng)各服務獨立發(fā)布,發(fā)布owner也會選擇本組比較有經(jīng)驗的同學,但仍舊不能避免開發(fā)與發(fā)布之間的信息割裂。該類問題有很多種表現(xiàn)形態(tài),舉例來說:
- 我是一名開發(fā):我發(fā)現(xiàn)了一個新Bug,我得趕緊告訴版本發(fā)布負責人,叫停本次版本發(fā)布;
- 我是一名測試:我發(fā)現(xiàn)了一個新Bug,我需要評估線上該Bug受影響的范圍,安排hotfix;
- 我是一名運維:我在調(diào)查一個生產(chǎn)問題,我不知道這是不是一個已知問題,我去問問開發(fā);
版本發(fā)布同學,作為整個流程的核心人物,在這個繁瑣的流程中極易犯錯。
場景二:已修復bug但沒修全
還有一類情況,就是針對分支開發(fā)的代碼漏合。
圖3 分支開發(fā)漏合bugfix
某一分支發(fā)現(xiàn)bug時(參考上圖branch master),第一時間一定會在master分支上進行修復。然而此時帶有該bug的branch1就被遺漏了。該問題在多個LTS(Long Time Support)分支的開發(fā)模式中尤其嚴重,每個版本都需要發(fā)布同學double check有無重點bugfix漏合。
場景三:已修復bug線上漏發(fā)
這就是前言提到的場景。人為疏漏。
漏發(fā)確實是非常大的問題,但是也有客觀原因。面對千萬級別的生產(chǎn)環(huán)境,數(shù)十年多個生產(chǎn)版本共存,面臨這樣的組合爆炸,人肉確認hotfix發(fā)布范圍不遺漏確實是很大的挑戰(zhàn)。
圖4 線上多種環(huán)境組合,發(fā)布同學易遺漏
如上圖,假如所有集群按物理ENV分為六組(線上生產(chǎn)遠大于此),例子里本次發(fā)布bugfix的同學就是漏掉了ENV5的集群,已知bug也剛好在這個分組的集群中再次出現(xiàn)了。
發(fā)布卡點Bug信息
因此,應當存在全局角色來維護bug相關(guān)信息。任何角色、任何時間、任何地點都能夠編輯和訪問。
無論是devops模式,還是傳統(tǒng)的專職“研發(fā),測試,運維”模式,都會面臨負責發(fā)布的負責人,單點評估整個版本的bugfix以及確認未修復bug,充當“人肉pipeline”。作為一個分布式系統(tǒng)開發(fā)人員,能否使用分布式工具來解決分布式溝通協(xié)同的老大難問題呢?
git-poison的出現(xiàn),不僅能實時在“開發(fā),測試,發(fā)布”間同步所有已知問題,還能參與發(fā)布卡點,確認當前版本的未修復bug信息,節(jié)約人力成本。
圖5 多方調(diào)用git-poison滿足需求
如何使用
git-poison基于go-git的分布式源碼管理,實現(xiàn)bug的追溯、查詢和反饋,靈活&&可復制性高,適用于任何開發(fā)模式以及任意代碼倉庫。另外,git-poison不依賴人與人之間的協(xié)作溝通,減少認知負擔溝通成本,自動化精準召回bug中毒域,實現(xiàn)poison commit發(fā)布阻塞。
圖6 git-poison 投毒/解藥/銀針 (yum install git-poison)
對于開發(fā)者,只需要記住一件事:抓緊投毒!
回到前言說到的P1故障,使用git-poison就能簡單有效避免“重復翻車”的場景:
- 值班:線上出現(xiàn)故障,定位問題。使用git-posion投毒。
- 開發(fā):bug修復,使用git-poison解毒。
- 發(fā)布hotfix:發(fā)布完畢后,使用git-poison銀針,確保線上所有帶bug的版本,都帶有本次的bugfix。
如何實現(xiàn)
每一次投毒/解毒,git-poison的poisons遠程git倉庫中都會生成/更新一條對應記錄。不同代碼倉庫對應不同分支,隔離不同源的posions信息。
{ "poison":"1q234tre5467gcs7yui8ew13", "cure":"9875jgbsw32gtx6djri8sofi0h", "comment":"[to #12345678] service iohang", "editor":"Iris",}
check-commit則應用了git原生強大的history tree管理。?
圖7 紅色QW為毒藥commit下的git歷史DAG
如上圖,假如我們當前在release分支上,上次的發(fā)布commit是B,當前的發(fā)布commit是X。通過 git rev-list 可以直接獲取到整個DAG(Directed Acyclic Graph)。結(jié)合git-poison的記錄,若紅色的Q和W是沒有解藥的poison,則git-poison會阻塞本次發(fā)布,返回投毒同學以及對應bug的記錄文檔信息。
假如我們在Dev分支上查詢L是否“有毒”,則git-poison會返回“healthy”。
最佳實踐
發(fā)布減負
圖8 發(fā)布平臺使用git-poison進行卡點
引入git-poison后,在團隊的發(fā)布流程中,發(fā)布平臺會調(diào)用git-poison自動導入本次版本發(fā)布的“Bugfix列表”和“未修復Bug列表”,便于發(fā)布經(jīng)理評估該版本的質(zhì)量風險,無需再口頭追個確認。包括本次發(fā)布修復的問題列表,以及是否有未解決的bug。
Before | After |
1.發(fā)布同學git log兩次發(fā)布之間所有的commit 2.發(fā)布同學篩選本模塊相關(guān)commit 3.拉群一一詢問對應patch owner | 1.發(fā)布平臺自動調(diào)用git-poison導入未修復bug, 發(fā)布經(jīng)理評估發(fā)布風險 |
風險觀測
圖9 git-poison 聯(lián)動線上風險展示
運維平臺可以集成git-poison來檢查線上部署的服務版本是否存在中毒情況。線上風險一目了然。尤其是發(fā)現(xiàn)一個新bug后,值班同學可以立即投毒,并通過該頁面獲取該bug影響的范圍。
Before | After |
1.值班同學發(fā)現(xiàn)bug 2.值班同學去代碼倉庫查找引入bug的commit對應時間 3.獲取線上所有模板找到對應的build版本 4.人肉排查該bug是否在對應版本中 | 1.值班同學發(fā)現(xiàn)bug 2.使用git-poison進行投毒查看影響范圍 |
結(jié)語
目前git-poison已經(jīng)在公司內(nèi)部開源,團隊已經(jīng)實現(xiàn)、使用并集成到發(fā)布平臺管理Bug一年多。開發(fā)同學本地使用順暢,學習成本低,發(fā)布流程中多次有效阻塞帶bug的版本,并為定位bug影響范圍提供極大便利。
都說寫代碼容易,修bug難。在一個多人協(xié)作大項目中,修完bug還能保證不重復翻車就是難上加難。有了git-poison,相信事情會變的easy and simple。最后希望我們關(guān)于 git-poison 的實現(xiàn)邏輯可以分享給更多人。
阿里云開發(fā)者社區(qū),千萬開發(fā)者的選擇。百萬精品技術(shù)內(nèi)容、千節(jié)免費系統(tǒng)課程、豐富的體驗場景、活躍的社群活動、行業(yè)專家分享交流,盡在:
https://developer.aliyun.com/?utm_content=g_1000371671
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。