發布與分支

2021-09-23 22:56:22 字數 2268 閱讀 5595

首先來說一下發布的概念,發布的是什麼呢,是故事(story)嗎?不是,是特性(feature)!

特性由乙個或多個故事組成,單個故事可以驗收,但是不能單獨上線。比如當你做完了購物車的故事,是不能把單獨把它上線的,因為你無法在購物車中進行結算。從使用者體驗的角度來說,這兩個故事要麼一起上,要麼都不上。而且也不是乙個特性完成了就可以立馬上線的,比如聖誕大促的功能做完了,也要等到聖誕節來了才能上。

然而這種模式是有風險的,martin fowler對這種模式進行了論述。

martin fowler在文章中提到了很多點,這裡只強調一點,即多分支下的持續整合問題。假設現在存在三個並行的特性分支,那麼加上develop分支就存在四個活躍的分支。持續整合流水線應該去監控哪個分支呢?如果只監控develop分支,其它分支的提交就無法得到持續整合的驗證,也就是說大部分情況下開發人員享受不到持續整合的好處。

那麼如果每開乙個分支就為它建立乙個持續整合呢?首先它不是真正的持續整合,因為並不是所有的**都整合在了一起;其次這麼做的代價也會比較大。乙個基本的部署流水線應該包括編譯、單元測試、打包、功能/整合測試、發布這些步驟,如下圖所示:

另一種常見的模式是只有兩個分支:developrelease。所有開發人員都在develop上進行開發,專案進行週期性發布。在每次發布之前,開發人員應該完成所有功能,然後從develop上拉出乙個release分支,在上面進行測試和bug fix(這些bug fix也應該及時合回到主幹)。一旦release分支穩定了,則打個tag,進行發布。

如果線上出現bug要如何處理呢?從上次打的tag拉出乙個臨時的hotfix分支,修復之後合併到release分支進行發布。

這裡也需要管理兩個分支,所以持續整合流水線也應該有兩套,還是存在重複。但同樣的,有了crp對多分支持續整合的支援 ,就可以把這部分成本省掉。

這種模式可以避免分支過多的問題,但也會有兩個限制:

需要進行週期性發布。因為所有功能都在乙個分支上,不加限制的話,任何時刻總會存在開發到一半的功能。所以必須有乙個發布週期,在發布週期開始時做好計畫,確定要發布的內容,然後在週期結束之前把計畫的功能全都完成才能開始上線流程。如果發布的特性在乙個發布週期內完不成,則需要延遲發布。更誇張的情況是如果在聖誕節前半個月就完成了聖誕大促的功能,那麼在聖誕節前的這兩周內,都不能做任何發布。

需要限制hotfix分支的使用。hotfix只能用來處理一些可以快速修復的線上問題,而對於有一定工作量的緊急需求則不適用,否則就又會出現乙個分支上的**長時間得不到整合的問題。而且如果在乙個緊急需求完成之前,再開始做乙個緊急需求的話,則又變回了特性分支的模式。

為了解決上述的第乙個限制,可以考慮引入特性開關。即每個特性都可以通過簡單的修改被隱藏掉,這樣所有的特性可以同時存在於主幹上,但是又互相不影響對方的發布。

特性開關不僅僅是乙個技術問題,更是乙個業務問題。比如乙個新特性做完了,但是產品經理不確定使用者是否需要它,所以需要先發布出去試執行一下。如果發現使用者其實不需要它,則需要去除該功能。這個時候,開發人員就需要花費一些時間來仔細地把嵌入在**庫中的與該特性有關的邏輯都去除掉。但如果有了特性開關,就可以快速又安全地關掉這個功能。

特性開關,聽起來容易,但其實要做的事情還是很多的。這裡只強調兩點:

特性開關在發布前預設關閉,這時不僅要保證所有其它的特性(包括沒有開關控制的特性和開關已經開啟的特性)都是正常工作的。還要保證這個特性沒有暴漏出去。

當準備要發布時,會開啟開關。這時也要保證在發布之後,如果我關閉開關,能夠真正把這個特性隱藏掉,以便能夠在需要時快速下掉這個功能。

這兩點都需要更多的工作量,具體做法請參看這篇文章。

那麼在這種模式下,如果有線上bug要緊急修復該怎麼做呢?是否可以直接在主幹上進行修復,然後發布呢?理論上來說是可行的的,當然前提是你按照上述文章中的做法對軟體的各種開關處在不同狀態時進行了充分的測試。如果對已有的自動化測試不夠有信心,還是可以保留乙個hotfix的分支,從而可以有信心快速對問題進行修復,並上線。

總結一下,分支過多會引入一些問題,而使用特性開關可以避免過多的分支,當然也會引入額外的很多代價。如果你的測試做的充分,就可以瀟灑地只使用乙個分支;但保留乙個hotfix分支可以讓你的線上問題修復更加從容。

只保留乙個分支不一定是最好的做法,有多個分支也並非一定是壞掉,要根據自己的實際情況作出明智的選擇。如果你決定要使用超過乙個分支,請參看crp中多分支持續整合的配置。

SVN主幹發布與分支發布的區別

一 主幹發布 先說主幹發布模式 以svn庫為例,大致將庫分為trunk,branch,tag三種,主線發布就是公司要發布某個產品的v1版本,之前大家都做會在svn的trunk上做開發,等trunk穩定了.開出乙個分支b1,在b1分支上做v1版本的其它功能新增,bug修改等,並使用持續整合來驗證b1的...

Git branch 分支與合併分支

十五.git branch 分支 檢視當前有哪些branch bixiaopeng bixiaopengtekimacbook pro xmrobotiumgi tbra nch mast er新建 乙個br anch xm2.x bixi aope ng b ixia open gtek imac...

git 本地分支與遠端分支

最近看到了廖雪峰部落格的git教程,內容詳實生動,安利一下。正好也看到了分支的git操作 git 檢視遠端分支 本地分支 建立分支 把分支推到遠端repository 刪除本地分支 分享同時修改了一些排版和備註說明。git branch a br 2.1.2.2 master remotes ori...