今年,我們中間件和項(xiàng)管團(tuán)隊(duì)合作,做了微效平臺(tái)。大部分功能大家都比較好理解,但是分支策略,是在平臺(tái)上看不到的,也是不太好理解的,特別是對(duì)于我們?yōu)槭裁催@樣做。為此,我想通過(guò)這篇小文章,講清楚我們現(xiàn)在的分支策略。
在此,我想先說(shuō)明下我們現(xiàn)有的環(huán)境。
一、 微貸的環(huán)境
針對(duì)同一個(gè)系統(tǒng),他所用到的環(huán)境如下。
- 迭代環(huán)境:開(kāi)發(fā)環(huán)境,一個(gè)系統(tǒng)可能會(huì)部署到不同的迭代環(huán)境,系統(tǒng)不太穩(wěn)定。
- 穩(wěn)定環(huán)境:長(zhǎng)期運(yùn)行的測(cè)試環(huán)境,僅有一套,代碼比較貼近線上環(huán)境,較穩(wěn)定。
- 預(yù)發(fā)環(huán)境:長(zhǎng)期運(yùn)行的線上環(huán)境的預(yù)置環(huán)境,僅有一套,代碼與線上一致,并且用同一個(gè)數(shù)據(jù)庫(kù)。
- Beta環(huán)境:線上環(huán)境的第一臺(tái)機(jī)器作為Beta環(huán)境的機(jī)器,在發(fā)布時(shí),會(huì)切流,外部流量不會(huì)經(jīng)過(guò)改環(huán)境。
-
線上環(huán)境:即生產(chǎn)環(huán)境。
image.png
二、 微貸目前的分支模型
如下圖,我們大部分的分支策略或多或少都可以歸到這個(gè)模型中。我們暫且稱(chēng)該模型為==簡(jiǎn)單分支模型==

這個(gè)分支模型與環(huán)境的關(guān)系如下:
- 迭代環(huán)境:部署dev分支
- 穩(wěn)定環(huán)境:部署master或dev分支
- 預(yù)發(fā)環(huán)境:部署master
- Beta&線上環(huán)境:部署master
看到這個(gè)分支模型的時(shí)候,我開(kāi)始思考幾個(gè)問(wèn)題。
- 這種分支會(huì)產(chǎn)生什么問(wèn)題?
- 若要不產(chǎn)生問(wèn)題,該如何操作?
簡(jiǎn)單分支模型會(huì)產(chǎn)生什么問(wèn)題?
- 從master拉出來(lái)的dev分支,不穩(wěn)定
因?yàn)榉€(wěn)定環(huán)境測(cè)試需要合入master分支,所以master中的代碼可能是未測(cè)試完全的代碼,此時(shí)拉出來(lái)的dev分支,很可能存在嚴(yán)重bug,并且,開(kāi)發(fā)也不知道什么時(shí)候再去master拉取代碼合入dev才是沒(méi)有bug的。
- 穩(wěn)定環(huán)境搶占問(wèn)題
測(cè)試將dev1部署到穩(wěn)定環(huán)境,那么當(dāng)dev2要部署穩(wěn)定環(huán)境時(shí),dev1的測(cè)試是不知道的,而且也沒(méi)法控制,穩(wěn)定環(huán)境就被dev2占用了,而dev2的測(cè)試也不知道在他之前代碼分支是誰(shuí)部署的,他想占用多長(zhǎng)時(shí)間,現(xiàn)在是否還需要使用。這就是搶占問(wèn)題
- 生產(chǎn)環(huán)境可能會(huì)部署未測(cè)試的代碼
在3問(wèn)題上擴(kuò)展,同樣的道理。當(dāng)我某個(gè)dev合入master并測(cè)試完成需要發(fā)布時(shí),我沒(méi)法控制到發(fā)布上線前的這個(gè)時(shí)間段內(nèi),沒(méi)有人會(huì)提交代碼到master。如果有人在這個(gè)時(shí)間段內(nèi)提交了新的代碼到master,那么發(fā)布的代碼就很有可能是有bug的。
- master中的代碼有不同的發(fā)布時(shí)間,導(dǎo)致部分項(xiàng)目延期
多個(gè)dev的項(xiàng)目合入master,但他們的發(fā)布時(shí)間不一樣。dev1希望12-17發(fā)布,dev2希望12-20發(fā)布,如果dev1要根據(jù)dev2的時(shí)間發(fā)布,那dev1就延期了。
如何解決以上問(wèn)題?
- 引入流程控制
能解決2、3問(wèn)題
- 增加一個(gè)分支int,所有dev分支需要集成到int分支,并測(cè)試
能解決1問(wèn)題
- 增加rel分支,所有的發(fā)布從dev拉出rel分支發(fā)布
解決4問(wèn)題
將上述三個(gè)方案合成就是我們現(xiàn)有的分支模型--微效分支模型,詳細(xì)的在微效的分支模型中展開(kāi)講。
三、微效分支模型
我們先簡(jiǎn)單看下我們的分支模型,如下圖。其中有四種分支類(lèi)型:
- master:穩(wěn)定的代碼分支
- dev:開(kāi)發(fā)分支,可以有多個(gè),部署到迭代環(huán)境
- integration:集成分支,僅有一個(gè),所有的dev都需要合入integration,部署到穩(wěn)定環(huán)境
-
release:發(fā)布分支,僅有一個(gè),部署到預(yù)發(fā)&Beta&線上環(huán)境
image.png
1. 流程控制
我們的流程控制是如何做的,而不保證上述的2、3問(wèn)題的?
- 開(kāi)發(fā)從master拉取分支創(chuàng)建為dev-x分支
- 開(kāi)發(fā)完成,申請(qǐng)集成環(huán)境(穩(wěn)定環(huán)境)(引入審批流程,解決搶占問(wèn)題)
- 當(dāng)前集成環(huán)境無(wú)人占用:直接申請(qǐng)成功,并且從master拉取最新代碼創(chuàng)建int分支,dev-x合入int分支
- 當(dāng)前集成環(huán)境被人占用:需要占用集成環(huán)境的人審批通過(guò),或者等待釋放。
- 審批通過(guò)后,dev-x合并最新master代碼,并合入int分支
- 集成環(huán)境測(cè)試通過(guò)后,從dev-x拉取rel分支,并發(fā)布,這時(shí)會(huì)有如下兩次檢查來(lái)解決(3問(wèn)題)
- 檢查dev-x中的代碼是否包含master最新代碼
- 檢查int分支中是否包含dev-x的最新代碼
4.發(fā)布完成,將rel合并入master
在上述流程中,我們引入了集成環(huán)境的審批,來(lái)解決搶占問(wèn)題(2問(wèn)題)。
同時(shí),我們?cè)诶el的時(shí)候會(huì)比較dev與master的不同,int與dev的不同,來(lái)保證dev的代碼是在int中被測(cè)試過(guò)的,并且是有master的最新代碼,來(lái)保證3問(wèn)題不發(fā)生。
2. 微效如何保證master代碼的穩(wěn)定性?
要討論這個(gè)話題前,我們需要定義下,什么樣的代碼算是穩(wěn)定的?
每個(gè)人的理解可能有差異,我姑且將發(fā)布上線后的代碼就稱(chēng)為穩(wěn)定的代碼。
那么,我們來(lái)仔細(xì)觀察上圖的微效分支模型,會(huì)發(fā)現(xiàn),合入master的途徑只有一個(gè)----rel發(fā)布完成合入master。所以我們只要保證rel的代碼是穩(wěn)定的即可。而rel中的代碼是在穩(wěn)定環(huán)境測(cè)試通過(guò),包含master最新代碼的要發(fā)布上線,并且在發(fā)布成功后才合入master,這時(shí)我們認(rèn)定這個(gè)代碼就是穩(wěn)定的。這樣我就解決了master代碼不穩(wěn)定的問(wèn)題(1問(wèn)題)。
3. 各項(xiàng)目發(fā)布時(shí)間節(jié)點(diǎn)不一樣怎么辦?
如果沒(méi)有我們的分支模型,大家可以想下怎么解決這個(gè)問(wèn)題?
很簡(jiǎn)單,發(fā)dev分支的代碼不就好了嗎,免去合并發(fā)布的各種煩惱。
那么,我們剩下的就是要解決dev分支的穩(wěn)定性問(wèn)題。實(shí)際上,我們是引入rel來(lái)解決該問(wèn)題,而rel對(duì)應(yīng)的只會(huì)是一個(gè)dev分支。而在前面我們已經(jīng)講過(guò)如何保證rel的穩(wěn)定性。
但這時(shí)又出現(xiàn)另個(gè)問(wèn)題:相同時(shí)間段有兩個(gè)項(xiàng)目同時(shí)發(fā)布的怎么辦?
我們的解決方案就是rel分支只有一個(gè),同個(gè)時(shí)間段內(nèi)需要同時(shí)發(fā)布的項(xiàng)目,要排隊(duì)。
這樣就解決了發(fā)布時(shí)間節(jié)點(diǎn)的問(wèn)題了(4問(wèn)題)。
4. 發(fā)完之后有bug怎么辦?
經(jīng)過(guò)上述的流程和分支模型我們解決了簡(jiǎn)單分支模型會(huì)產(chǎn)生的問(wèn)題。但是,這會(huì)不會(huì)產(chǎn)生新的問(wèn)題呢?有想法可以留言哦。

