Help us learn about your current experience with the documentation. Take the survey.

启用和禁用通过功能标志部署的 GitLab 功能

  • 版本:Free, Premium, Ultimate
  • 产品:GitLab Self-Managed

GitLab 采用了功能标志策略,在开发早期部署功能,以便可以逐步推出。

在功能永久可用之前,出于多种原因,功能可以通过标志部署,例如:

  • 测试功能。
  • 在功能开发的早期阶段,从用户和客户那里获取反馈。
  • 评估用户采用情况。
  • 评估其对 GitLab 性能的影响。
  • 在各个版本中以更小的模块构建它。

带标志的功能通常可以逐步推出:

  1. 功能默认为禁用状态。
  2. 功能变为默认启用。
  3. 功能标志被移除。

这些功能可以被启用或禁用,以允许或阻止用户使用它们。拥有 Rails 控制台功能标志 API 访问权限的 GitLab 管理员可以执行此操作。

当你禁用一个功能标志时,该功能对用户是隐藏的,并且所有功能都会被关闭。例如,不会记录数据,服务也不会运行。

如果你使用了某个功能并发现了错误、异常行为或问题,请尽快向 GitLab 提供反馈,这一点非常重要,以便我们能在该功能仍处于标志阶段时对其进行改进或修复。当你升级 GitLab 时,功能标志的状态可能会发生变化。

启用仍在开发中的功能的风险

在 GitLab 生产环境中启用一个已禁用的功能标志之前,了解其中涉及的潜在风险至关重要。

如果你启用了默认禁用的功能,可能会发生数据损坏、稳定性下降、性能下降和安全问题。

默认禁用的功能可能会在未来的 GitLab 版本中更改或移除,恕不另行通知。

不建议在生产环境中使用默认禁用的功能标志所控制的功能,并且因使用默认禁用功能而产生的问题不在 GitLab 支持范围内。

在默认禁用的功能中发现的安全问题会在常规版本中修复,并且在修复程序的后向移植方面,不遵循我们常规的维护策略

禁用已发布功能的风险

在大多数情况下,功能标志代码会在未来的 GitLab 版本中被移除。 如果发生这种情况,从那时起,你将无法再使该功能保持禁用状态。

如何启用和禁用带标志的功能

每个功能都有自己的标志,应使用该标志来启用或禁用它。 每个带标志的功能的文档都包含一个部分,用于说明标志的状态以及启用或禁用它的命令。

启动 GitLab Rails 控制台

要启用或禁用带标志的功能,你必须做的第一件事是启动 GitLab Rails 控制台会话。

对于 Linux 软件包安装:

sudo gitlab-rails console

对于从源代码安装:

sudo -u git -H bundle exec rails console -e production

有关详细信息,请参阅启动 Rails 控制台会话

启用或禁用功能

Rails 控制台会话启动后,相应地运行 Feature.enableFeature.disable 命令。具体的标志可以在功能本身的文档中找到。

要启用功能,请运行:

Feature.enable(:<feature flag>)

例如,要启用一个名为 example_feature 的虚拟功能标志:

Feature.enable(:example_feature)

要禁用功能,请运行:

Feature.disable(:<feature flag>)

例如,要禁用一个名为 example_feature 的虚拟功能标志:

Feature.disable(:example_feature)

某些功能标志可以按项目启用或禁用:

Feature.enable(:<feature flag>, Project.find(<project id>))

例如,要为项目 1234 启用 :example_feature 功能标志:

Feature.enable(:example_feature, Project.find(1234))

某些功能标志可以按用户启用或禁用。例如,要为用户 sidney_jones 启用 :example_feature 标志:

Feature.enable(:example_feature, User.find_by_username("sidney_jones"))

Feature.enableFeature.disable 总是返回 true,即使应用程序并未使用该标志:

irb(main):001:0> Feature.enable(:example_feature)
=> true

当功能准备就绪后,GitLab 会移除该功能标志,启用和禁用它的选项将不复存在。该功能将在所有实例中可用。

检查功能标志是否已启用

要检查标志是启用还是禁用,请使用 Feature.enabled?Feature.disabled?。 例如,对于一个已启用的名为 example_feature 的功能标志:

Feature.enabled?(:example_feature)
=> true
Feature.disabled?(:example_feature)
=> false

当功能准备就绪后,GitLab 会移除该功能标志,启用和禁用它的选项将不复存在。该功能将在所有实例中可用。

查看已设置的功能标志

你可以查看所有由 GitLab 管理员设置的功能标志:

Feature.all
=> [#<Flipper::Feature:198220 name="example_feature", state=:on, enabled_gate_names=[:boolean], adapter=:memoizable>]

# Nice output
Feature.all.map {|f| [f.name, f.state]}

取消设置功能标志

你可以取消设置一个功能标志,使 GitLab 回退到该标志的当前默认值:

Feature.remove(:example_feature)
=> true