特征切换

continuous delivery

tags:

最常见的支持特色分支is that it provides a mechanism for pending features that take longer than a single release cycle.假设你每两周就要投入生产,但需要构建一个需要三个月才能完成的功能。How do you use Continuous Integration to keep everyone working on the mainline without revealing a half-implemented feature on your releases?我们经常遇到这个问题,功能切换是一个处理它的方便工具。

(我已经看到很多关于这个概念的名字被抛在脑后:特征位,旗帜,flippers,开关等。There seems no generally accepted name yet.)

基本的想法是有一个配置文件,为您挂起的各种功能定义一系列切换。The running application then uses these toggles in order to decide whether or not to show the new feature.

这些决策大多发生在应用程序的用户界面中。因此,如果您使用JSP构建Web应用程序,you may use a set of jsp tags to surround any user-interface parts of a pending feature.

    
     
      
      

以我们的新宠物调查

然后,如果将toggle设置为on,则toggle标记的实现只传递内容,and skips it otherwise.其他用户界面技术将使用不同的细节,but the basic notion of wrapping the pending elements is the same.

一些特性可能像引入一种新的定价算法,其中可能没有用户界面元素。在这里,切换的测试将在应用程序代码中进行,它可能和条件测试一样粗糙,或者更复杂的策略,比如通过依赖注入连接的策略。

切换测试应仅在切换点以确保新功能被正确隐藏。There could be many screens in the pet survey feature,but if there's only one link on the home page that gets you there,这是唯一需要用toggle标签保护的元素。不要试图用切换来保护新特性代码中的每个代码路径,只关注引导用户到达的入口点,并切换这些入口点。如果你发现创造,maintaining,或者取消切换需要很长时间,then that's a sign that you have too many toggle tests.记住,尽管简单条件是实现切换的最简单方法,您应该使用多态替换之类的技术来最小化测试切换的点数。

到目前为止,我已经将功能切换描述为用于隐藏部分构建的功能,我调用的一种功能切换release toggles.霍奇森还指出experiment toggles对于A/B测试,ops togglesto provide controls for operations staff,and允许切换控制不同用户子集的功能访问。(The older version of this post lumped all these together as "business toggles")

我听说的大多数功能切换都设置在运行时,but I've also seen cases where release toggles are set at build time.The small advantage of a build time toggle is that none of the new feature's code gets compiled into the released executable.

One danger with feature toggles is an accidental exposure,当有人忘记将UI功能包装在切换标记中时。This is awkward to test,因为很难形成这样一个测试,即在不调用单个元素的情况下,任何应该隐藏的元素都是不可见的——这些元素很可能同时被遗忘。

我们听到的一个关于特性切换的常见问题是测试——使用特性切换是否意味着测试的组合爆炸?In general there's no need to test all combinations of features.对于释放切换,通常可以运行两种组合

如果您想找到任何集成缺陷,这与您需要对功能分支进行的操作基本相同。

It's very important to retire release toggles once the pending features have bedded down in production.这涉及到删除配置文件上的定义以及使用它们的所有代码。Otherwise you will get a pile of toggles that nobody can remember how to use.在我听说的一个值得纪念的例子中,它需要对Linux内核进行特殊的重新编译,以处理足够多的命令行开关。


释放开关是你应该做的最后一件事

释放切换是一种有用的技术,许多团队都使用它们。但是,在处理将特性投入生产时,它们应该是您的最后选择。

Your first choice should be to break the feature down so you can safely introduce parts of the feature into the product.这样做的好处和任何基于小的战略一样,frequent releases.您可以降低出错的风险,并获得用户实际使用功能的宝贵反馈,这些功能将改进您以后所做的增强。

If you really must hide a partly built feature,然后,最好的方法是构建所有的UI,保存UI入口点并在一个发布周期中添加该UI。This way the non-ui code is fully integrated with everything else,但在最后一个位添加之前,任何内容都不可见或使用。这种方法的问题在于,您不能进行任何需要UI的测试,如宽带测试through the UI or,更重要的是,使用UI进行探索性测试,until the final release cycle,就在该功能上线之前。你可以(也应该)使用其他测试,such as subcutaneous tests or perhaps a backdoor into the UI.

只有当你不能做小的发布或者最后的用户界面时,你才应该使用发布切换。

Further Reading

有关功能切换及其用法的详细图片,看皮特·霍奇森的文章.

确认

(Thanks to Charles Bradley,Kent Beck和Christian Gruber的推文提醒了我忘记包括的要点。)

修订

更新了2016-02-12,以适应皮特·霍奇森的详细文章
分享:
如果你觉得这篇文章有用,请分享。I appreciate the feedback and encouragement

在标签上找到类似的物品

continuous delivery