持續(xù)交付:微貸分支策略

今年,我們中間件和項(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)單分支模型==


image.png

這個(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)題。

  1. 這種分支會(huì)產(chǎn)生什么問(wèn)題?
  2. 若要不產(chǎn)生問(wèn)題,該如何操作?

簡(jiǎn)單分支模型會(huì)產(chǎn)生什么問(wèn)題?

  1. 從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的。

  1. 穩(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)題

  1. 生產(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的。

  1. 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)題?

  1. 引入流程控制

能解決2、3問(wèn)題

  1. 增加一個(gè)分支int,所有dev分支需要集成到int分支,并測(cè)試

能解決1問(wèn)題

  1. 增加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)題的?

  1. 開(kāi)發(fā)從master拉取分支創(chuàng)建為dev-x分支
  2. 開(kāi)發(fā)完成,申請(qǐng)集成環(huán)境(穩(wěn)定環(huán)境)(引入審批流程,解決搶占問(wèn)題)
    1. 當(dāng)前集成環(huán)境無(wú)人占用:直接申請(qǐng)成功,并且從master拉取最新代碼創(chuàng)建int分支,dev-x合入int分支
    2. 當(dāng)前集成環(huán)境被人占用:需要占用集成環(huán)境的人審批通過(guò),或者等待釋放。
    3. 審批通過(guò)后,dev-x合并最新master代碼,并合入int分支
  3. 集成環(huán)境測(cè)試通過(guò)后,從dev-x拉取rel分支,并發(fā)布,這時(shí)會(huì)有如下兩次檢查來(lái)解決(3問(wèn)題)
    1. 檢查dev-x中的代碼是否包含master最新代碼
    2. 檢查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)題呢?有想法可以留言哦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容