為什么我從GitFlow開(kāi)發(fā)模式切換到了TrunkBased開(kāi)發(fā)模式?-創(chuàng)新互聯(lián)

我已經(jīng)使用 Git Flow 構(gòu)建我的 Git 分支有幾年了。但是,我遇到了 Git Flow 的一些問(wèn)題,其中大部分來(lái)自長(zhǎng)期存在的分支。解決這些問(wèn)題的方案就是 Trunk Based Development。這是一個(gè)非常簡(jiǎn)單的技術(shù),也是有效的持續(xù)交付的基礎(chǔ)。在這篇文章中,我會(huì)告訴你我是如何通過(guò) HolidayCheck 的 IOS 開(kāi)發(fā)團(tuán)隊(duì)從 Git Flow 過(guò)度到 Trunk Based Development 的開(kāi)發(fā)的。您將了解最重要的步驟,以及從 Trunk Based Development 中獲得的好處,請(qǐng)繼續(xù)閱讀。

目前創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、水城網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

Git Flow 的問(wèn)題

合并沖突

合并沖突在使用 Git Flow 是非常常見(jiàn)。原因很簡(jiǎn)單:如果你有多個(gè)并行功能分支,他們長(zhǎng)時(shí)間存在,那么很可能在代碼庫(kù)的相同部分在兩個(gè)不同的分支中被更改。合并沖突不僅對(duì)于需要手動(dòng)解決的開(kāi)發(fā)人員來(lái)說(shuō)是令人沮喪的。這也增加了在代碼中破壞某些功能的風(fēng)險(xiǎn),因?yàn)楫?dāng)你不得不決定使用哪個(gè)版本代碼時(shí),很容易犯錯(cuò)。即使你把一個(gè)分支合并到另一個(gè)分支時(shí)你做的都是正確的,可能也會(huì)發(fā)生這兩個(gè)特性的組合影響了你的代碼。

構(gòu)建

功能分離

在合并到一個(gè)分支之前,你是不能測(cè)試兩個(gè)功能的組合。當(dāng)你在單獨(dú)的分支機(jī)構(gòu)中開(kāi)發(fā)幾天甚至幾周的功能時(shí),由于兩個(gè)功能的相互作用而產(chǎn)生的問(wèn)題發(fā)生了。當(dāng)你對(duì)這些問(wèn)題反映遲緩時(shí),你可能不得不改變你為新功能編寫的代碼的更多部分。這意味著你已經(jīng)浪費(fèi)了很多的時(shí)間來(lái)創(chuàng)建你不再需要的代碼。

許多不同的功能分支也可能會(huì)讓你的軟件的手動(dòng)測(cè)試人員感到困惑。他們總是必須知道在哪個(gè)臨時(shí)環(huán)境中可以找到新功能。不同的階段環(huán)境通常也意味著不同的構(gòu)建任務(wù),用于監(jiān)控任務(wù)的不同屏幕等。

不可預(yù)測(cè)的發(fā)布

Git Flow 還有另一個(gè)問(wèn)題,這是以上兩點(diǎn)的結(jié)果:如果功能分支尚未合并,則不可能知道需要多少時(shí)間才能發(fā)布。你不知道它是因?yàn)槟悴恢滥膫€(gè)合并會(huì)發(fā)生沖突,你也不知道新功能將如何相互影響。不能在任何時(shí)候發(fā)布將使你缺乏信心。

解決方案

Trunk Based Development

好消息!上述所有問(wèn)題都有解決方案,就是Trunk Based Development。你只有一個(gè)主分支,即主干(Master 或者 Mainline)。不再有開(kāi)發(fā)分支,也沒(méi)有存在時(shí)間很久的分支。所有的提交都會(huì)盡快合并到主干中,至少每天一次。通過(guò)如此迅速的合并到主干,合并沖突變的非常罕見(jiàn)。使用短時(shí)間分支是避免合并沖突的4個(gè)簡(jiǎn)單技巧之一。即使你遇到了合并沖突,也可能很容易解決,因?yàn)閺纳洗魏喜⒌街鞲珊笞兓⒉荒敲创?。不同功能之間的干擾立即可見(jiàn),可以在功能正在進(jìn)行時(shí)測(cè)試。

基于主干的開(kāi)發(fā)也將鼓勵(lì)你的團(tuán)隊(duì)以小的 Step 思考和工作,從而做到小的提交,這些提交可以快速合并到主干。通常,小 Step 可以減少錯(cuò)誤數(shù)量,并有助于創(chuàng)建模塊化設(shè)計(jì)。

大的問(wèn)題時(shí):如果每天將代碼推送到一個(gè)不穩(wěn)定的主干,即使某個(gè)功能還沒(méi)有完成,你如何才能避免出現(xiàn)有問(wèn)題的主干?請(qǐng)接著閱讀來(lái)尋找答案。

如何從 Git Flow 到 Trunk Based Development 功能切換

功能切換

當(dāng)我在 HolidayCheck 向我的團(tuán)隊(duì)介紹 Trunk Based Development 的開(kāi)發(fā)時(shí),為了能夠迅速的將代碼提交到主干,有一個(gè)第一步是絕對(duì)必要的!在開(kāi)始我們的分支結(jié)構(gòu)之前,我們必須確保我們使用能夠盡快的融入開(kāi)發(fā)分支的并且存在時(shí)間很短的分支。解決辦法相當(dāng)簡(jiǎn)單,我們開(kāi)始使用功能切換——源碼中的一些開(kāi)關(guān)決定功能是否處于活動(dòng)狀態(tài)。

為什么我從 Git Flow 開(kāi)發(fā)模式切換到了 Trunk Based 開(kāi)發(fā)模式?

只要功能沒(méi)有準(zhǔn)備好被發(fā)布,它就會(huì)被禁用。這使我們可以在不破壞任何東西的情況下將其推入到開(kāi)發(fā)分支。開(kāi)發(fā)人員和手動(dòng)測(cè)試人員可以在一些設(shè)置中啟用對(duì)于普通用戶隱藏的每個(gè)功能。開(kāi)發(fā)分支隨時(shí)準(zhǔn)備被發(fā)布,因?yàn)槲赐瓿傻墓δ軐⒈魂P(guān)閉。他們將被推送到客戶,但是是不可見(jiàn)狀態(tài)的。一旦某個(gè)功能完成,他就會(huì)打開(kāi)并在下一個(gè)版本中可用。

當(dāng)我們?cè)诖a中切換這些功能時(shí),我們意識(shí)到它們不僅在功能開(kāi)發(fā)的時(shí)候有用!即使功能完成,在代碼中保持切換也是非常好的。如果我們有可能為所有用戶遠(yuǎn)程控制切換,那么只要我們發(fā)現(xiàn)他對(duì)我們的轉(zhuǎn)化率或其他關(guān)鍵數(shù)字有不良影響,我們就可以快速停用該功能。此外,如果發(fā)生任何錯(cuò)誤或者服務(wù)器的流量負(fù)載過(guò)高,我們總是能夠立即關(guān)閉該功能。這一點(diǎn)尤其重要,因?yàn)槲覀儽仨毜却嗵?,直到蘋果回顧,出了我們的 IOS 應(yīng)用程序的新版本。能夠在沒(méi)有新版本的情況下禁用功能是一個(gè)非常強(qiáng)大的武器。

現(xiàn)在,隨著所有功能的切換,我們還可以做另一件偉大的事情:A/B 測(cè)試!由于每個(gè)功能都可以隨著遠(yuǎn)程控制,所以我們可以只為部分用戶群?jiǎn)⒂媚稠?xiàng)功能,并禁用其他功能。這樣做,我們可以看到一個(gè)功能真正的執(zhí)行。我們可以在小測(cè)試組上測(cè)試新功能,然后決定是否應(yīng)該為每個(gè)人啟用它,或者如果我們看到負(fù)面影響將其刪除。我們使用 Optimizely 來(lái)控制和評(píng)估我們的 A/B 測(cè)試,但也有其他工具可用。

一個(gè)分支約定所有

現(xiàn)在我們可以快速地將我們的功能分支合并到開(kāi)發(fā)分支中(因?yàn)槲赐瓿傻墓δ芤呀?jīng)停用),我們可以隨時(shí)發(fā)布開(kāi)發(fā)分支。問(wèn)題是:我們是否還需要一個(gè)開(kāi)發(fā)和一個(gè)主分支?答案是:不需要。我們可以直接把所有東西都交給 Master 而不是 Develop 分支。Master 隨時(shí)準(zhǔn)備投入生產(chǎn)(不要忘記每當(dāng)有東西被推入 Master 時(shí),都要運(yùn)行所有的測(cè)試)。如果我們想創(chuàng)建一個(gè)發(fā)行版本,我們可以直接從主分支創(chuàng)建,或者為此創(chuàng)建一個(gè)發(fā)行版分支。最新發(fā)布的提交標(biāo)有 Git tag。所以引入功能切換后的第二步是刪除開(kāi)發(fā)分支!在這里,我們已經(jīng)是 Trunk Based Development!

總結(jié)

Trunk Based Development 使我的團(tuán)隊(duì)更加靈活。我們可以隨時(shí)發(fā)布我們的主分支,我們已經(jīng)沒(méi)有大的合并沖突了??偸请S時(shí)準(zhǔn)備投入生產(chǎn)的主分支是持續(xù)交付的先決條件。功能切換是 A/B 測(cè)試的先決條件。它們幫助我們了解客戶真正想要什么,并使我們更有信心,因?yàn)槲覀冎揽梢噪S時(shí)禁用某個(gè)功能。結(jié)果就是:風(fēng)險(xiǎn)更小,創(chuàng)新更多。

譯者:王志宇

JFrog 中國(guó)研發(fā)工程師,曾在唯品會(huì)擔(dān)任研發(fā)工程師,擅長(zhǎng) Java,參與過(guò)多個(gè)互聯(lián)網(wǎng)平臺(tái)的研發(fā)和運(yùn)維工作,現(xiàn)專注于Devops 落地,持續(xù)集成、持續(xù)交付領(lǐng)域。

原文作者:Robert 原文地址: https://team-coder.com/from-git-flow-to-trunk-based-development/

歡迎轉(zhuǎn)載,但轉(zhuǎn)載請(qǐng)注明作者與出處。謝謝!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱:為什么我從GitFlow開(kāi)發(fā)模式切換到了TrunkBased開(kāi)發(fā)模式?-創(chuàng)新互聯(lián)
文章源于:http://muchs.cn/article40/ddohho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)商城網(wǎng)站、搜索引擎優(yōu)化建站公司、品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)