29

什麼是「功能切換」和「功能分支」,它們之間有什麼區別?功能切換與功能分支

有什麼優點和缺點?爲什麼一個比另一個好?

我在Google上發現了一些關於這方面的文章,而且我傾向於在「特色切換」陣營,但我不認爲在所有情況下「切換特徵」都是更好的選擇。

+3

除了下面的答案外,還有兩件事:你不能同時擁有功能分支和持續集成(除非你爲每個功能分支設置自動構建),並且如果你決定去使用功能分支,可以使用GIT(或類似),具有強大的合併能力。 我還建議閱讀Jez Humble撰寫的「持續交付」一書。 – spacedoom

+2

@spacedoom:「你不能同時擁有兩個功能分支和持續集成」 - 我不同意。許多CI解決方案都明確支持構建功能分支。例如,詹金斯甚至可以爲它在SCM中檢測到的任何功能分支自動創建構建作業。 – sleske

+0

更多信息http://stackoverflow.com/a/7707394/56145 –

回答

32

功能切換是持續集成/持續交付(CI/CD)鏈(敏捷/看板項目方法)中使用的方法。基本上,您可以在禁用狀態下將新功能發送到生產環境,然後在管理控制檯中打開該功能(如果發現它已損壞,請關閉該功能)。

功能分支可以是發佈方法的一部分,並集成到持續集成鏈中。您可以在功能分支中進行開發,將分支部署到DEV/QA,獲得認證,將功能分支合併到主幹,然後將主幹推送到SIT/UAT/PROD環境。

這種方法有優點和缺點。功能切換需要非常嚴格的紀律,因爲破碎/黑暗的代碼正在生產。這對於管理層知道如何解決這個問題並擁有系統自動化工具(廚師/ Puppet/cfengine等)的初創公司和商店來說非常棒,Google,Facebook,LinkedIn,WordPress都可以使用功能切換和系統自動化部署到生產環境。

有一些先決條件「技術人員」可以正確地進行功能切換:持續交付/部署,持續集成,自動化單元測試,自動化集成測試,自動壓力/性能測試,系統自動化。如果你不到位有這些,考慮一個簡單的發佈策略(例如功能分支。)

+2

我認爲最後一段落倒退了:_「以下是做特色正確切換的先決條件」技術人員「:持續交付/部署,持續集成,自動化單元測試,自動化集成測試,自動壓力/性能測試,系統自動化「,功能切換是能夠執行CI/CD的先決條件,而不是其他方式。至少這是我閱讀[馬丁福勒關於這個話題的文章](http://martinfowler.com/bliki/FeatureToggle.html)。 –

+1

我不同意最後一段。建議您在Feature Toggle之前需要所有這些結構運行(並且獲得所有令人敬畏的「獲得東西來生產」價值)不僅是*不真實*,而且會嚇倒人們。所有你需要的是一個良好的CI /構建管道和產品環境,因此你可以在需要時推送它(不必是CD)。我得到你說的東西,如果你有CI/CD,那麼你應該已經在做各種口味的自動化測試(單元/集成/全堆棧等),但它不是一個可靠的要求。 –

+0

FWIW,這裏是一個簡單的.NET Web應用程序包,它可以很容易地以各種方式切換,讓您可以繼續運送物品,而不用擔心基礎架構:https://github.com/cottsak/ DevCookie –

4

功能反覆要求非常嚴格的紀律作爲破產/暗碼是 它使生產。

我同意Electrawn,我一直在使用功能分支6年,因爲在我們的情況下,我們沒有預先要求。

此外,瞭解「Toogle策略」將特徵分支策略(合併)中花費的工作轉移到另一個時刻也很重要。

http://martinfowler.com/bliki/FeatureToggle.html

退休切換一次掛起功能,在生產中都愁眉苦臉地是非常重要的。 這涉及到刪除配置文件和所有使用它們的代碼的定義。否則你會得到一堆沒有人記得如何使用的切換。在我聽說的一個令人難忘的例子中,它需要對linux內核進行特殊的重新編譯以處理足夠的命令行開關。

注意:遵循SCM原則,如果有人打開並編輯文件,它可能是破損的代碼。

所以,在我看來,我不相信「所有情況下都有更好的選擇」,因爲這取決於團隊的文化,如果你有測試封面。

那麼這是一個非常有爭議的問題。

我仍然比較喜歡功能分支策略。保持SCM最佳實踐和規劃路線圖,合併過程往往是一個簡單的方法。 在這一年裏,我聽到很多人抱怨合併過程,但在很多情況下合併的問題與我的經驗是一樣的,「通信失敗」:)

對不起,但我認爲圍繞着SCM更好的選擇這個主題有一些人類方面的問題。

16

我深入討論這個問題在我的博客:http://geekswithblogs.net/Optikal/archive/2013/02/10/152069.aspx

總之,功能分支會給你更好的隔離,但需要你來處理遞延整合,合併之痛。切換爲您提供持續集成,但要求您以支持切換的方式設計/實現您的代碼,並引入未完成特性代碼可能對生產產生負面影響的風險。

您可以同時使用兩個分支和切換(它們不是互斥的)。至於決定在每個場景中使用哪一個,我的想法是,切換應該是默認選擇,除非具備以下條件:

  • 難以掩飾撥動
  • 背後的功能已的潛在影響沒有完全測試的應用程序區域

如果其中任一條件爲真,我可能會使用功能分支而不是切換。

+0

非常好的博客文章。感謝分享 –

+1

看來,大多數人認爲集成必須始終發生在一個方向'特徵分支 - >主要'。我已經看到了相反的成功,通過將'main'的最新內容從'main'拖拽到'feature branch'中,以便當您需要重新集成到'main'時,您的合併是一個快速前進之一,因此無痛。 –

+0

我建立了一個簡單的軟件包,可以通過各種方式輕鬆隱藏切換功能https://github.com/cottsak/DevCookie –