通过功能切换将部署与发布分离
部署新功能是一项令人紧张的任务,但必须完成。
这是一个我们在职业生涯中都曾面临过,或者必然会面临的问题。请允许我先来介绍一下背景……
您完成了一些功能开发,修复了一些错误等等。由于某些功能略微复杂,您感觉良好。您决定是时候让用户体验这些更改了。您将所有团队的更改打包并部署到生产服务器。几个小时后,灾难降临!您开发的某个功能出现了一个严重的错误。现在,您必须恢复到旧版本的应用程序或部署一个新版本,但新版本中不会保留您所做的更改。
由于这些情况可能造成巨大影响,因此快速响应至关重要。不幸的是,开发人员通常都是在情况发生后才学会如何处理,因此这只会延长痛苦。
同时部署和发布并非罕见做法,因为在项目初期,你希望用户能够立即看到变更。许多项目仍在沿用此流程,但随着项目的发展,将代码部署与发布流程(向用户激活变更)分离是有意义的。
即使您还没有遇到这种情况,我们也都同意这是一个非常紧张的情况,并且您需要提前建立处理这种情况的流程。
但我们这里讨论的是提前多久?
功能切换(又称功能标志)
处理此类中断的方法有很多,建立回滚流程至关重要。除此之外,我们还使用了一种名为“功能切换”的功能。它并非我们独有,但如果您的工具箱里有它,那真是锦上添花。对于不熟悉“功能切换”的人来说,它是一种机制,允许您在无需部署整个应用程序的情况下为用户启用或关闭某个功能。它非常简单,但功能却非常强大!
虽然它被称为“功能切换”,但这并不意味着你只能将它们用于功能。你基本上可以用它们做任何事情。无论是 A/B 测试、重构屏幕的某个部分,还是将用户导航到完全不同的页面!我相信你还能想到更多对你有用的例子。
这也使我们能够监督哪些用户可以访问特定变更。这在收集反馈或观察用户如何与您开发的组件交互时非常有用。一旦您建立了功能切换系统,就无需持续投入工作来维持其运行。通过逐步将变更推广到金丝雀测试版、测试版和所有用户,这也是管理变更生命周期的好方法!
您可以更好地控制谁可以看到哪些内容,最棒的是,任何人都可以打开或关闭切换开关!产品经理或客服人员等人员可能会根据客户需求决定打开某个切换开关。功能完全开发完成后,该切换开关可以全球发布给所有客户,每个人都可以享受稳定版本。
恼怒的用户数量将会减少,而对更改的宝贵反馈将会增加。
值得一提的是,您可以将整个 QA 流程建立在这些切换开关之上。我们可以通过打开切换开关、收集反馈,然后关闭切换开关来测试变更。有了如此精细的控制,在生产环境中进行测试就不再是难事!我们也在其他环境中使用这些切换开关,因此您可以将变更隔离到任何服务器上的特定用户组。
这对于每个人来说都是双赢的!
好的,但是开发怎么样?
您脑海中可能浮现的主要问题是功能切换如何影响功能的开发。
功能切换开关在编写代码时确实会稍微复杂一些,但如果您花些时间进行规划,大多数情况下都能优雅地完成。您必须小心地将每个更改添加到切换开关之后,以免在未打开切换开关时出现任何泄漏。其他参与该功能的人员也必须注意使用切换开关,因为它可能会跨越多个文件,有时可能会被忘记。
有时候,它并不复杂,但你却能获益良多。正如我已经提到的,它几乎可以用于任何事物,虽然复杂性可能会增加,但它确实是值得的:
增加的复杂性并非什么大问题。功能切换带来的益处远超预期,如果这意味着开发人员在编写和审查代码时需要更加谨慎,那也无妨。如果开发人员知道某个功能一旦引发问题就可以关闭,他们的压力就会小很多。这并不意味着我们认可草率的代码,但有时,这种情况确实会发生。
总之,功能切换(一旦建立)不会对开发过程产生太大影响,但它们会带来很多回报。
缓解不利因素
第一个确实会带来技术债务,但如果我们在全局发布后创建一个删除切换开关的任务,就可以确保它会尽快被删除。创建切换开关的人负责删除它,这是一种高效处理这个问题的好方法。无论如何,删除切换开关通常比开发切换开关花费的时间要少得多!
至于另一个问题,有两种方法可以解决。我们可以选择以下两种方法之一:
- 如果该功能已准备好发布,则全局发布第一个切换按钮,并在代码中删除其引用,或者
- 合并切换按钮并从现在开始将它们视为同一功能
这并非理想情况,但确实可能发生。解决方案主要取决于功能的状态,因此在不了解所有事实的情况下,无法确定最佳方案。无论如何,这两种解决方案都可以简化开发工作。
决定,决定
对我们来说,实现功能切换是轻而易举的事。考虑到它带来的好处,例如控制、渐进式推出等等,它带来的益处远远超过了它带来的弊端。即使是弊端,在一定程度上也是可以控制的。
重要的是,公司里的每个人都要理解整个流程,并接受我们这样做的原因。这对于我们这样的公司至关重要,因为每个部门都参与了产品更新的发布流程。一旦大家意识到这一点,构建一个管理系统来控制这一切就取决于你和公司的需求了。
以下是我们自己的一个例子。我们称之为“后台办公室”:
作为一名开发人员,我很高兴我们能够快速、无压力地发布功能,因为我知道我们有一些回旋余地。
至于你,我希望我已经向你展示了为什么如果你不使用类似的机制,考虑这样的方案是个好主意。如果你需要更多说服力,可以阅读Martin Fowler 的文章!即使你无法自己制作功能切换系统,也有很多外部工具和库可以帮助你实现它!
鏂囩珷鏉ユ簮锛�https://dev.to/productive/decoupling-deployment-from-release-with-feature-toggles-7lo