在应用程序中使用功能标志切换的不同方式有哪些?

如果您要向开发人员解释从无到有的完整功能标志切换应该执行的确切操作应用程序,这些步骤是什么?

#1 楼

功能标志是一种工程设备,可用于避免长期存在的分支和产品开发中的冲突。这是在面向对象语言的上下文中如何使用它来帮助开发人员在处理一个新产品时就特定产品功能进行协作的方法。只要存在“接口”的概念,该解决方案也可以在非面向对象的上下文中使用。 (请参阅OCaml模块系统。)

出于说明的目的,我们假设有一个工具可以显示有关存储在数据库中的数据的报告。该代码实现了用于执行请求的DatabaseClient类。随着数据集的增长,很明显,某些替代数据布局将提高应用程序性能。因此,爱丽丝(Alice)将开发新版本的数据库客户端(DatabaseClient),该版本可从布局得到改进的结构中检索数据,而鲍勃(Bob)将保留历史数据库客户端。

通过以下步骤,爱丽丝(Alice)和鲍勃(Bob)可以在以下方面进行协作:活动分支,同时最大程度地减少冲突。


Alice将DatabaseClient重命名为DatabaseClient_v1,并创建一个名为DatabaseClient的委托类,该类使用对象DatabaseClient_v1并实现了名为DatabaseClientInterface的接口。 (如果可能,此DatabaseClientInterface应该是代码伪像,但鸭式语言并不总是支持此功能。)
鲍勃回顾了爱丽丝在1中所做的更改,并且知道他的维护工作应该在DatabaseClient_v1上进行。
爱丽丝在应用程序中引入了一个新的配置标志,该标志控制着DatabaseClient委托的行为并实现了DatabaseClient_v2占位符,这是一个实现DatabaseClientInterface的类,其方法都抛出“未实现”异常。

此后,Alice和Bob可以在没有显式同步的情况下进行协作,因为在各自的迭代中编写的代码受DatabaseClientInterface的约束。这样可以最大程度地减少因并发工作而导致冲突的风险。

来自Alice的迭代可能非常短,例如实现测试,实现方法,甚至部分地这样做,因为在生产中,代码未选择使用并且不需要完全起作用。应该配置自动测试套件,以便DatabaseClientInterface始终使用DatabaseClient_v1,而在本地运行测试套件时或在自定义CI设置中,Alice可以轻松切换至DatabaseClient_v2。一旦一切准备就绪,单个提交就可以通过更新控制DatabaseClient委托的配置值来执行更改。

#2 楼

这些步骤非常“容易”,要迁移到功能标志应用程序,您基本上需要两件事:


标志存储库(文件/数据库/ env变量)
有条件的语句以根据标志更改行为。

功能标志的基本功能是打开/关闭功能,但很快您就希望以渐进的方式发布新功能,例如示例:托管该应用程序的5台服务器上的1台服务器具有“ on”功能,然后打开另一台服务器上的功能,直到所有服务器都具有“ on”功能。

这意味着您必须请注意,如果您的功能与没有该功能的应用程序兼容(例如,数据库中的附加列)。

框架存在多种语言,以避免重新发明轮子,Etsy的现在未维护的框架具有有趣的自述文件来解释其工作原理。

#3 楼

嵌入式软件界经常在应用程序代码本身(例如#define / #ifdef语句)和/或构建工具配置文件(例如makefile)中使用构建时标志。

构建标记可以类似的方式使用,不仅用于功能,还可以用于各种代码重构,迁移,调试支持等)。
它们允许提交集成分支部分或未验证的更改,而不会破坏构建或导致分支中已经使用的功能/项目出现退化。
以连续集成的方式非常擅长处理点修复以及大型/风险/缓慢的进度更改(否则将需要长期存在的分支)。

但除了验证现有的之外用于回归的分支代码,也可以对新代码执行进度/稳定性验证。为此,需要切换构建时标志。

切换标志的一种方法是在同一分支的CI系统的单独验证管道中使用(如果它支持这样的功能),切换标记的补丁文件-在构建之前将其应用于单独的工作空间。将在此工作空间中构建一组不同的工件,然后进行验证。

或者,可以从主集成分支中提取一个寿命较长的功能分支,但是该功能分支中唯一的更改是切换标志。由于这一微小的更改,功能分支可以非常快速地自动同步-实际上非常接近主集成分支。在此分支上执行单独的CI将不再需要初步的补丁文件。即使在很长一段时间内都无法携带这样的功能分支。

也有可能在主集成分支中创建新的构建工件,这些构建工件实际上只是现有构建工件的克隆,但标志已切换。这样,在主分支中,既不需要初步的补丁文件也不需要功能分支来验证新代码。

评论


欢迎来到1K-DevOps世界...明智地使用它附带的特权...

– Pierre.Vriens♦
17 Mar 18 '17在11:52