# Feature Flags

> 原文：[https://docs.gitlab.com/ee/operations/feature_flags.html](https://docs.gitlab.com/ee/operations/feature_flags.html)

*   [How it works](#how-it-works)
*   [Create a feature flag](#create-a-feature-flag)
*   [Rollout strategy (legacy)](#rollout-strategy-legacy)
*   [Feature flag strategies](#feature-flag-strategies)
    *   [All users](#all-users)
    *   [Percent of Users](#percent-of-users)
    *   [User IDs](#user-ids)
    *   [User List](#user-list)
    *   [Enable or disable feature flag strategies](#enable-or-disable-feature-flag-strategies)
*   [Disable a feature flag for a specific environment](#disable-a-feature-flag-for-a-specific-environment)
*   [Disable a feature flag for all environments](#disable-a-feature-flag-for-all-environments)
*   [Integrate feature flags with your application](#integrate-feature-flags-with-your-application)
    *   [Get access credentials](#get-access-credentials)
    *   [Choose a client library](#choose-a-client-library)
    *   [Feature flags API information](#feature-flags-api-information)
    *   [Golang application example](#golang-application-example)
    *   [Ruby application example](#ruby-application-example)
*   [Feature Flag Related Issues](#feature-flag-related-issues)
    *   [Enable or disable Feature Flag Related Issues](#enable-or-disable-feature-flag-related-issues-core-only)

# Feature Flags[](#feature-flags-premium "Permalink")

在 GitLab 11.4 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7433) .

借助功能标志，您可以将应用程序的新功能部署到较小的批量生产中. 您可以将功能打开或关闭到部分用户，以帮助您实现持续交付. 功能标记有助于降低风险，使您能够进行受控测试，并将功能交付与客户发布分开.

有关实际使用的功能标志的示例，请参阅[用于部署的 GitLab，功能标志和错误跟踪](https://www.youtube.com/embed/5tw2p6lwXxo) .

## How it works[](#how-it-works "Permalink")

GitLab 使用功能切换服务[Unleash](https://github.com/Unleash/unleash) .

通过在 GitLab 中启用或禁用标记，您的应用程序可以确定要启用或禁用的功能.

您可以在 GitLab 中创建功能标记，并使用应用程序中的 API 来获取功能标记及其状态的列表. 必须将应用程序配置为与 GitLab 进行通信，因此，开发人员可以使用兼容的客户端库并将[功能标记集成到您的应用程序中](#integrate-feature-flags-with-your-application) .

## Create a feature flag[](#create-a-feature-flag "Permalink")

要创建并启用功能标志：

1.  导航到项目的" **操作">"功能标志"** .
2.  单击**新功能标志**按钮.
3.  输入一个以字母开头的名称，该名称仅包含小写字母，数字，下划线（ `_` ）或破折号（ `-` ），并且不以破折号（ `-` ）或下划线（ `_` ）结尾.
4.  输入描述（可选，最多 255 个字符）.
5.  Enter details about how the flag should be applied:
    *   在 GitLab 13.0 和更早版本中，添加**Environment specs** . 对于每个环境，包括" **状态"** （默认启用）和" [**部署"策略**](#rollout-strategy-legacy) （默认为" **所有用户"** ）.
    *   在 GitLab 13.1 和更高版本中，添加 Feature Flag [**Strategies**](#feature-flag-strategies) . 对于每种策略，请包括" **类型"** （默认为" [**所有用户"**](#all-users) ）和" **环境"** （默认为所有环境）.
6.  Click **创建功能标志**.

您可以通过单击 列表中任何功能标志旁边的（编辑）按钮.

## Rollout strategy (legacy)[](#rollout-strategy-legacy "Permalink")

在 GitLab 12.2 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/8240) .

在 GitLab 13.0 和更早版本中，" **推出"策略**设置会影响哪些用户将启用该功能. 选择要启用该功能的用户百分比. 如果禁用环境规范，则推出策略将无效.

可以设置为：

*   全部用户
*   [Percent of users](#percent-of-users)
    *   （可选）您可以单击" **包括其他用户 ID"**复选框，并添加特定用户 ID 列表以启用该功能.
*   [User IDs](#user-ids)

## Feature flag strategies[](#feature-flag-strategies "Permalink")

版本历史

*   在 GitLab 13.0 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/35555) .
*   它部署在功能标记后面，默认情况下处于禁用状态.
*   在 GitLab.com 上启用了它.
*   要在 GitLab 自管实例中使用它，请让 GitLab 管理员[启用它](#enable-or-disable-feature-flag-strategies) .

您可以在多个环境中应用功能标记策略，而无需多次定义策略.

GitLab 功能标志使用[Unleash](https://unleash.github.io)作为功​​能标志引擎. 在"释放"中，有用于粒度特征标志控件的[策略](https://unleash.github.io/docs/activation_strategy) . GitLab 功能标志可以有多种策略，支持的策略有：

*   [All users](#all-users)
*   [Percent of Users](#percent-of-users)
*   [User IDs](#user-ids)
*   [User List](#user-list)

可以在[创建](#create-a-feature-flag)功能部件标记时将策略添加到功能部件标记，也可以在[创建](#create-a-feature-flag)后通过导航到" **操作">"功能部件标记"**并单击以编辑现有功能部件标记 （编辑）.

### All users[](#all-users "Permalink")

为所有用户启用该功能. 它使用[`default`](https://unleash.github.io/docs/activation_strategy#default)释放激活策略.

### Percent of Users[](#percent-of-users "Permalink")

为一定百分比的已认证用户启用该功能. 它使用[`gradualRolloutUserId`](https://unleash.github.io/docs/activation_strategy#gradualrolloutuserid)释放激活策略.

例如，将值设置为 15％即可为 15％的经过身份验证的用户启用该功能.

推出百分比可以从 0％到 100％.

**注意：**对于已登录的用户，但对于匿名用户，保证了粘性（同一用户的一致应用程序行为）.**警告：**如果选择此策略，则**必须**为 Unleash 客户端提供一个用户 ID，以启用该功能. 请参见下面的[Ruby 示例](#ruby-application-example) .

### User IDs[](#user-ids "Permalink")

在 GitLab 12.2 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/8240) . [更新](https://gitlab.com/gitlab-org/gitlab/-/issues/34363)为在 GitLab 12.6 中按环境定义.

为目标用户列表启用该功能. 它是使用 Unleash [`userWithId`](https://unleash.github.io/docs/activation_strategy#userwithid)激活策略实现的.

输入用户 ID 作为逗号分隔的值列表. 例如， `user@example.com, user2@example.com`或`username1,username2,username3`等.

**注意：**用户 ID 是您的应用程序用户的标识符. 他们不必是 GitLab 用户.**注意：** **必须**为 Unleash 客户端提供用户 ID，才能为目标用户启用该功能. 请参见下面的[Ruby 示例](#ruby-application-example) .

### User List[](#user-list "Permalink")

在 GitLab 13.1 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/35930) .

为使用[Feature Flag User List API](../api/feature_flag_user_lists.html)创建的[用户列表](../api/feature_flag_user_lists.html)启用功能. 与[用户 ID](#user-ids)相似，它使用 Unleash [`userWithId`](https://unleash.github.io/docs/activation_strategy#userwithid)激活策略.

### Enable or disable feature flag strategies[](#enable-or-disable-feature-flag-strategies "Permalink")

此功能正在开发中，但已准备好进行测试. 它部署在**默认情况下禁用**的功能标志的后面. [有权访问 GitLab Rails 控制台的 GitLab 管理员](../administration/feature_flags.html)可以为您的实例启用它.

要启用它：

```
Feature.enable(:feature_flags_new_version) 
```

禁用它：

```
Feature.disable(:feature_flags_new_version) 
```

## Disable a feature flag for a specific environment[](#disable-a-feature-flag-for-a-specific-environment "Permalink")

在[GitLab 13.0 和更早版本中](https://gitlab.com/gitlab-org/gitlab/-/issues/8621) ，要为特定环境禁用功能标志：

1.  导航到项目的" **操作">"功能标志"** .
2.  对于要禁用的功能标志，请单击"铅笔"图标.
3.  禁用标志：

    *   在 GitLab 13.0 和更低版本中：滑动环境的"状态"切换. 或者，要删除环境规范，请单击右侧的" **删除（X）"**图标.
    *   在 GitLab 13.1 及更高版本：对于每一个战略，它适用于在**环境** ，删除环境.
4.  Click **保存更改**.

## Disable a feature flag for all environments[](#disable-a-feature-flag-for-all-environments "Permalink")

禁用所有环境的功能标志：

1.  导航到项目的" **操作">"功能标志"** .
2.  对于要禁用的功能标志，请将状态切换滑动到**禁用** .

功能标志显示在" **禁用"**选项卡上.

## Integrate feature flags with your application[](#integrate-feature-flags-with-your-application "Permalink")

要在应用程序中使用功能标志，请从 GitLab 获取访问凭据. 然后使用客户端库准备您的应用程序.

### Get access credentials[](#get-access-credentials "Permalink")

要获取您的应用程序需要与 GitLab 通信的访问凭据：

1.  导航到项目的" **操作">"功能标志"** .
2.  单击**配置**按钮以查看以下内容：
    *   **API URL** ：客户端（应用程序）连接以获取功能标志列表的 URL.
    *   **实例 ID** ：授权检索功能标志的唯一令牌.
    *   **应用程序名称** ：运行环境的名称. 例如，如果应用程序为生产服务器运行，则应用程序名称将为`production`或类似名称. 该值用于环境规格评估.

**注意：**这些字段的含义可能会随着时间而改变. 例如，我们不确定**实例 ID**是分配给**Environment 的**是单个令牌还是多个令牌. 另外， **应用程序名称**可以描述应用程序的版本，而不是运行环境.

### Choose a client library[](#choose-a-client-library "Permalink")

GitLab 实现与 Unleash 客户端兼容的单个后端.

使用 Unleash 客户端，开发人员可以在应用程序代码中定义标志的默认值. 如果提供的配置文件中不存在该标志，则每个功能标志评估都可以表达所需的结果.

目前，Unleash [提供了许多用于各种语言和框架的 SDK](https://github.com/Unleash/unleash#client-implementations) .

### Feature flags API information[](#feature-flags-api-information "Permalink")

有关 API 的内容，请参见：

*   [Feature Flags API](../api/feature_flags.html)
*   [功能标志规范 API](../api/feature_flag_specs.html) （已[在 GitLab 14.0 中](https://gitlab.com/gitlab-org/gitlab/-/issues/213369)弃用并[计划将其删除](https://gitlab.com/gitlab-org/gitlab/-/issues/213369) .）
*   [Feature Flag User Lists API](../api/feature_flag_user_lists.html)
*   [Legacy Feature Flags API](../api/feature_flags_legacy.html)

### Golang application example[](#golang-application-example "Permalink")

这是一个如何在 Golang 应用程序中集成特征标记的示例：

```
package main

import (
    "io"
    "log"
    "net/http"

    "github.com/Unleash/unleash-client-go"
)

type metricsInterface struct {
}

func init() {
    unleash.Initialize(
        unleash.WithUrl("https://gitlab.com/api/v4/feature_flags/unleash/42"),
        unleash.WithInstanceId("29QmjsW6KngPR5JNPMWx"),
        unleash.WithAppName("production"),
        unleash.WithListener(&metricsInterface{}),
    )
}

func helloServer(w http.ResponseWriter, req *http.Request) {
    if unleash.IsEnabled("my_feature_name") {
        io.WriteString(w, "Feature enabled\n")
    } else {
        io.WriteString(w, "hello, world!\n")
    }
}

func main() {
    http.HandleFunc("/", helloServer)
    log.Fatal(http.ListenAndServe(":8080", nil))
} 
```

### Ruby application example[](#ruby-application-example "Permalink")

这是一个如何在 Ruby 应用程序中集成功能标记的示例.

为 Unleash 客户端提供了一个用户 ID，以与" **百分比"卷展栏（已登录用户）卷**展策略或" **目标用户"**列表一起使用.

```
#!/usr/bin/env ruby

require 'unleash'
require 'unleash/context'

unleash = Unleash::Client.new({
  url: 'http://gitlab.com/api/v4/feature_flags/unleash/42',
  app_name: 'production',
  instance_id: '29QmjsW6KngPR5JNPMWx'
})

unleash_context = Unleash::Context.new
# Replace "123" with the id of an authenticated user.
# Note that the context's user id must be a string:
# https://unleash.github.io/docs/unleash_context
unleash_context.user_id = "123"

if unleash.is_enabled?("my_feature_name", unleash_context)
  puts "Feature enabled"
else
  puts "hello, world!"
end 
```

## Feature Flag Related Issues[](#feature-flag-related-issues "Permalink")

版本历史

*   在 GitLab 13.2 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36617) .
*   它部署在默认情况下启用的功能标志后面.
*   在 GitLab.com 上启用了它.
*   不能根据项目启用或禁用它
*   建议用于生产.
*   对于 GitLab 自我管理的实例，GitLab 管理员可以选择禁用它.

您可以将相关问题链接到功能标志. 在" **链接的问题"**部分中，单击`+`按钮，然后输入问题参考编号或问题的完整 URL.

此功能类似于[相关问题](../user/project/issues/related_issues.html)功能.

### Enable or disable Feature Flag Related Issues[](#enable-or-disable-feature-flag-related-issues-core-only "Permalink")

与功能标记相关​​的问题正在开发中，但已准备好用于生产. 它部署在**默认情况下启用**的功能标志的后面. [有权访问 GitLab Rails 控制台的 GitLab 管理员](../administration/feature_flags.html)可以选择为您的实例禁用它.

禁用它：

```
Feature.disable(:feature_flags_issue_links) 
```

To enable it:

```
Feature.enable(:feature_flags_issue_links) 
```