談?wù)劥a分支管理

前言

從2019年上半年云音樂(lè)的客戶端團(tuán)隊(duì)開(kāi)始遷移到雙周迭代后懦趋,隨之而來(lái)的是我們需要重新調(diào)整代碼分支的管理方法击你,來(lái)應(yīng)對(duì)開(kāi)發(fā)流程的變更偏形。

雙周迭代顧名思義一周開(kāi)發(fā)一周測(cè)試但指,目的就是為了快速交付寡痰。縱觀整個(gè)開(kāi)發(fā)流程棋凳,我們需要在兩周內(nèi)完成:需求交互評(píng)審-技術(shù)方案設(shè)計(jì)-開(kāi)發(fā)測(cè)試-CodeReview-持續(xù)集成-灰度全量發(fā)布等工作拦坠,并且把每個(gè)節(jié)點(diǎn)的時(shí)間都固定下來(lái),節(jié)奏感對(duì)于開(kāi)發(fā)來(lái)說(shuō)特別重要剩岳,讓大家明確每個(gè)時(shí)間點(diǎn)應(yīng)該做什么贞滨,對(duì)于簡(jiǎn)化管理和提高效率尤為重要。那新的代碼分支管理如何適應(yīng)這種節(jié)奏呢拍棕?

先談?wù)劕F(xiàn)狀

業(yè)內(nèi)有很多的分支管理方法晓铆,包括著名的GitFlow,TBD以及從他們衍生出來(lái)的版本绰播。

GitFlow

GitFlow設(shè)計(jì)非常全面骄噪,考慮到了實(shí)際開(kāi)發(fā)過(guò)程中的各種問(wèn)題,都能穩(wěn)定應(yīng)對(duì)幅垮,是非常適合大型項(xiàng)目的代碼管理腰池。他的主要理念包括2個(gè)主干分支:Master和Develop,1個(gè)發(fā)布分支:Release忙芒,若干個(gè)開(kāi)發(fā)分支:Feature示弓,以及HotFix分支。整體實(shí)施流程略微復(fù)雜呵萨,對(duì)持續(xù)集成不太友好奏属,下面是典型的GitFlow模型:

GitFlow有幾個(gè)問(wèn)題:

因?yàn)榇蠹叶荚谧约旱腇eature分支上面開(kāi)發(fā),特別是對(duì)于長(zhǎng)期的Feature分支會(huì)可能存在嚴(yán)重的合并沖突問(wèn)題潮峦,需要花費(fèi)大量的時(shí)間解決

同樣是基于第一條囱皿,導(dǎo)致Feature分支之間相互隔離勇婴,以至于CI/CD困難,單個(gè)功能可能沒(méi)有問(wèn)題嘱腥,但合并以后是否也沒(méi)問(wèn)題誰(shuí)也無(wú)法保證

TBD

Trunk Based Development早在svn時(shí)代就已經(jīng)流行耕渴,是種比較簡(jiǎn)單的分支管理模型,他只有一個(gè)主干分支齿兔,每個(gè)人寫完代碼自測(cè)通過(guò)后就往主干上面Push橱脸,要發(fā)布的時(shí)候就拉個(gè)Release分支,對(duì)持續(xù)集成友好分苇。他主要的幾個(gè)問(wèn)題:

如果臨上線前發(fā)現(xiàn)有問(wèn)題添诉,剔除代碼比較困難

即使沒(méi)有需求變更要下掉代碼,有些提交如果未能達(dá)到上線標(biāo)準(zhǔn)医寿,需要加Feature Toggle來(lái)控制打開(kāi)關(guān)閉栏赴。這是一個(gè)需要平衡的事情,往往會(huì)增加一定開(kāi)發(fā)成本和風(fēng)險(xiǎn)靖秩。

Aone Flow

這是一篇阿里技術(shù)的博客里面提到的他們內(nèi)部采用的代碼管理方式须眷,區(qū)別于GitFlow,核心點(diǎn)在于沒(méi)有固定Develop分支盆偿,要發(fā)布的時(shí)候把要上線的Feature分支一起合并到一個(gè)Release分支柒爸,這樣做的好處是需求變更哪個(gè)Feature不要了,只需要把其他Feature分支重新合并到新的Release分支即可

云音樂(lè)代碼分支管理

那云音樂(lè)需要怎么樣的代碼分支管理方法事扭?我們適應(yīng)目前雙周迭代的分支管理模型應(yīng)該要滿足這幾點(diǎn):

夠敏捷但又管理可控

云音樂(lè)迭代了這些年后版本相對(duì)趨于穩(wěn)定,對(duì)于一個(gè)千萬(wàn)級(jí)體量的中大型APP來(lái)說(shuō)乐横,穩(wěn)定求橄,風(fēng)險(xiǎn)可控是一個(gè)基本訴求。而在這前提下面如何保持一定的靈活度是需要一直探索和尋找的平衡點(diǎn)

雙周迭代的重要特性通俗來(lái)講就是“上下車”制度葡公,或者叫趕班車罐农,也即能靈活應(yīng)對(duì)突發(fā)情況隨時(shí)將一個(gè)需求挪到下個(gè)版本上線,或者將一個(gè)需求挪到這個(gè)版本上線催什,這就意味著Release分支的合入也需要非常靈活涵亏,這一點(diǎn)跟Aone Flow非常像。

流程穩(wěn)定蒲凶,認(rèn)知清晰

所有開(kāi)發(fā)同學(xué)都非常清晰雙周迭代的節(jié)奏气筋,也要非常清晰代碼管理的方法,每個(gè)迭代周期往哪個(gè)上線分支合并旋圆,什么節(jié)點(diǎn)合入都是非常明確的宠默。避免出現(xiàn)忘記合入不知道往哪里合入的問(wèn)題,同時(shí)我們也希望把這部分合并工作能夠分?jǐn)偟矫總€(gè)開(kāi)發(fā)灵巧,做到自己分支自己負(fù)責(zé)搀矫。

CodeReview是必需的

相信大家都能認(rèn)可CodeReview的意義抹沪,最佳做CodeReview的時(shí)機(jī)往往是代碼合入點(diǎn),通過(guò)PR或者M(jìn)R來(lái)發(fā)起

4. 方便持續(xù)集成流水線

傳統(tǒng)方式因?yàn)榇蠹叶继峤辉谧约悍种厦嫒壳颍a分散同時(shí)存在合并后產(chǎn)生額外風(fēng)險(xiǎn)融欧,我們期望盡可能盡快把Feature分支集合起來(lái)走流水線

那為了解決這幾個(gè)問(wèn)題,我們需要幾個(gè)分支:

穩(wěn)定的發(fā)布分支卦羡,統(tǒng)一大家認(rèn)知確保在固定合入時(shí)機(jī)點(diǎn)前發(fā)起MR進(jìn)行合入蹬癌,我們固定叫release-xxxx分支,在下個(gè)迭代開(kāi)始時(shí)從前一個(gè)Release分支拉出

穩(wěn)定的主干分支(Master)虹茶,只是作為HotFix分支拉取逝薪,當(dāng)然其實(shí)HotFix也可以從已發(fā)布的Release分支或者Tag里面拉出,Master的意義在于確保一條可以隨時(shí)發(fā)布的干凈的版本記錄

若干開(kāi)發(fā)分支蝴罪,這個(gè)Feature分支和GitFlow董济,AoneFlow沒(méi)有差別,在合入Release分支的時(shí)候進(jìn)行CodeReview要门,我們固定叫feature-xxx

HotFix分支虏肾,這個(gè)沒(méi)有差別

所以整體來(lái)看我們的最佳實(shí)踐會(huì)是GitFlow和AoneFlow的結(jié)合體:

1. 首先是把GitFlow的Develop和Release分支進(jìn)行合并,減少?gòu)?fù)雜度欢搜。固定每個(gè)迭代的Release分支名字方便認(rèn)知封豪,對(duì)于客戶端來(lái)說(shuō)Release沒(méi)有環(huán)境之分,不需要有多個(gè)Release分支

2.? 不允許在Release上面提交代碼炒瘟,所有功能開(kāi)發(fā)都走Feature分支吹埠,即便合并后有bugfix,仍然走Feature修改再次合入疮装,這樣確保所有代碼合入都是測(cè)試完成且CodeReview完成缘琅。同時(shí)也具備AoneFlow的優(yōu)點(diǎn),一旦需求有要下車廓推,則直接刪掉Release分支進(jìn)行重建刷袍,把其他Feature分支合入即可。

3.? 因?yàn)楣潭ê先霑r(shí)間節(jié)點(diǎn)樊展,所以持續(xù)集成的時(shí)間也是固定的呻纹,我們一般是定在第二周的周二,雖然沒(méi)有第一時(shí)間像TBD一樣進(jìn)行专缠,但已經(jīng)是我們想要找到的一個(gè)合理平衡點(diǎn)雷酪。當(dāng)然Feature分支上面也可以有流水線,跑的東西略微有些差別(Feature分支跑的東西偏測(cè)試環(huán)境)

4. Master分支隨時(shí)處于Release狀態(tài)藤肢,確保HotFix能夠及時(shí)進(jìn)行

其他

除了約定太闺,云音樂(lè)內(nèi)部還有個(gè)叫《全鏈路研發(fā)平臺(tái)》的工具來(lái)輔助代碼分支管理,這個(gè)平臺(tái)涵蓋了從需求產(chǎn)生到交付的全生命周期管理嘁圈,包括需求排期省骂,提測(cè)蟀淮,打包,持續(xù)集成钞澳,卡點(diǎn)怠惶,發(fā)布等環(huán)節(jié)。和代碼分支管理相關(guān)的主要有這些:

每個(gè)需求都會(huì)要求關(guān)聯(lián)一個(gè)Feature分支轧粟,否則無(wú)法提測(cè)

每個(gè)Feature分支是否合入當(dāng)前迭代固定的Release分支狀態(tài)可查詢策治,方便管理版本上線前卡點(diǎn)

最后,沒(méi)有一個(gè)代碼分支管理方法是直接適用自己的項(xiàng)目場(chǎng)景的兰吟,還是要根據(jù)實(shí)際情況進(jìn)行一些取舍通惫,找到一個(gè)最佳的平衡點(diǎn)。

更多文章請(qǐng)關(guān)注微信公眾號(hào):安卓之美

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末混蔼,一起剝皮案震驚了整個(gè)濱河市履腋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惭嚣,老刑警劉巖遵湖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晚吞,居然都是意外死亡延旧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門槽地,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)迁沫,“玉大人,你說(shuō)我怎么就攤上這事闷盔⊥湎矗” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵逢勾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我藐吮,道長(zhǎng)溺拱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任谣辞,我火速辦了婚禮迫摔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泥从。我一直安慰自己句占,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布躯嫉。 她就那樣靜靜地躺著纱烘,像睡著了一般杨拐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擂啥,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天哄陶,我揣著相機(jī)與錄音,去河邊找鬼哺壶。 笑死屋吨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的山宾。 我是一名探鬼主播至扰,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼资锰!你這毒婦竟也來(lái)了敢课?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤台妆,失蹤者是張志新(化名)和其女友劉穎翎猛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體接剩,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡切厘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懊缺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疫稿。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹃两,靈堂內(nèi)的尸體忽然破棺而出遗座,到底是詐尸還是另有隱情,我是刑警寧澤俊扳,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布途蒋,位于F島的核電站,受9級(jí)特大地震影響馋记,放射性物質(zhì)發(fā)生泄漏号坡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一梯醒、第九天 我趴在偏房一處隱蔽的房頂上張望宽堆。 院中可真熱鬧,春花似錦茸习、人聲如沸畜隶。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)籽慢。三九已至浸遗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗡综,已是汗流浹背乙帮。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留极景,地道東北人察净。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盼樟,于是被迫代替她去往敵國(guó)和親氢卡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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