启用和禁用部署在功能标志后面的极狐GitLab 功能 (BASIC SELF)
极狐GitLab 采用功能标志策略,在开发的早期阶段部署功能,以便它们可以逐步推出。
在使它们永久可用之前,可以出于多种原因将功能部署在标志后面,例如:
- 测试功能。
- 在功能开发的早期阶段从用户和客户那里获得反馈。
- 评估用户的采用程度。
- 评估它如何影响极狐GitLab 的性能。
- 在整个版本中以较小的部分构建它。
标志背后的功能可以逐步推出,通常过程:
- 该功能默认启动时禁用。
- 该功能默认启用。
- 功能标志被移除。
管理员可以通过启用和禁用这些功能,允许或禁止用户使用它们。负责执行的极狐GitLab 管理员应具有 Rails 控制台或功能标志 API 访问权限。
当您禁用某个功能标志时,该功能将对用户隐藏并且所有功能都将关闭。 例如,不会记录数据并且不会运行服务。
启用仍在开发中的功能时的风险
在极狐GitLab 的未来版本中,默认禁用的功能可能会更改或删除,恕不另行通知。
如果启用默认禁用的功能,则可能会发生数据损坏、稳定性下降、性能下降或安全问题。极狐GitLab 支持不涵盖由使用默认禁用功能引起的问题,除非您被极狐GitLab 指示启用该功能。
禁用已发布功能时的风险
在大多数情况下,功能标志代码会在未来版本中删除。 如果发生这种情况,从那时起,您将无法将该功能保持在禁用状态。
如何启用和禁用标志背后的功能
每个功能都有自己的标志,用于启用和禁用它。
启动 GitLab Rails 控制台
您需要启用或禁用标志后面的功能的第一件事是在 GitLab Rails 控制台上启动会话。
对于 Linux 软件包安装实例:
sudo gitlab-rails console
对于源安装实例:
sudo -u git -H bundle exec rails console -e production
启用或禁用功能
Rails 控制台会话启动后,相应地运行 Feature.enable
或 Feature.disable
命令。可以在该功能的文档本身中找到特定标志。
要启用功能,请运行:
Feature.enable(:<feature flag>)
例如,要启用名为 my_awesome_feature
的虚构功能标志:
Feature.enable(:my_awesome_feature)
要禁用功能,请运行:
Feature.disable(:<feature flag>)
例如,要禁用名为 my_awesome_feature
的虚构功能标志:
Feature.disable(:my_awesome_feature)
可以在每个项目的基础上启用或禁用某些功能标志:
Feature.enable(:<feature flag>, Project.find(<project id>))
例如,要为项目 1234
启用 :my_awesome_feature
功能标志:
Feature.enable(:my_awesome_feature, Project.find(1234))
Feature.enable
和 Feature.disable
总是返回 true
,即使应用程序不使用该标志:
irb(main):001:0> Feature.enable(:my_awesome_feature)
=> true
当功能准备就绪时,极狐GitLab 会删除功能标志,并且启用和禁用它的选项不再存在。该功能在所有情况下都可用。
检查是否启用了功能标志
要检查标志是启用还是禁用,请使用 Feature.enabled?
或 Feature.disabled?
。
例如,对于已启用的名为 my_awesome_feature
的功能标志:
Feature.enabled?(:my_awesome_feature)
=> true
Feature.disabled?(:my_awesome_feature)
=> false
当功能准备好时,极狐GitLab 删除功能标志,并且不再存在启用和禁用它的选项。该功能在所有情况下都可用。
查看设置功能标志
您可以查看所有极狐GitLab 管理员设置功能标志:
Feature.all
=> [#<Flipper::Feature:198220 name="my_awesome_feature", state=:on, enabled_gate_names=[:boolean], adapter=:memoizable>]
# Nice output
Feature.all.map {|f| [f.name, f.state]}
取消设置功能标志
您可以取消设置功能标志,以便极狐GitLab 回退到该标志的当前默认值:
Feature.remove(:my_awesome_feature)
=> true