機能フラグ

GitLab 11.4で導入されました

機能フラグを使用すると、アプリケーションの新機能を本番環境に小ロットでデプロイできます。 ユーザのサブセットに対して機能のオン/オフを切り替えることができ、継続的デリバリーの実現に役立ちます。 機能フラグを使用すると、管理されたテストを実施し、機能デリバリーと顧客ローンチを分離できるため、リスクを低減できます。

機能フラグのアクションの例については、GitLab forデプロイ、機能フラグ、エラートラッキングをご覧ください。

どのように動作するか

GitLabはUnleashという機能トグルサービスを使っています。

GitLabのフラグを有効にしたり無効にしたりすることで、アプリケーションはどの機能を有効にしたり無効にしたりするかを決めることができます。

GitLab で機能フラグを作成し、アプリケーションから API を使って機能フラグのリストとステータスを取得することができます。 アプリケーションが GitLab と通信できるように設定する必要があるので、互換性のあるクライアント・ライブラリを使い、アプリに機能フラグをインテグレーションするのは開発者次第です。

特集フラグの作成

機能フラグを作成し、有効にするには:

  1. プロジェクトのオペレーション>機能フラグに移動します。
  2. 新規機能フラグボタンをクリックします。
  3. 文字で始まり、小文字、数字、アンダースコア(_)、ダッシュ()の_みを含み_-、ダッシュ(-)またはアンダースコア(-)で終わらない-_名前を入力してください。
  4. 説明を入力します(オプション、最大255文字)。
  5. フラグの適用方法の詳細を入力します:
    • GitLab 13.0以前では、Environment specsを追加します。 各環境について、Status(デフォルトは有効)と ロールアウト戦略(デフォルトはAll users)を含めてください。
    • GitLab 13.1以降では、機能フラグを追加してください。 ストラテジーを追加します。 全てのユーザー)と環(デフォルトはすべての環境)を含めます。
  6. 機能フラグを作成」をクリックします。

リストの機能フラグの横にある{pencil}(edit)ボタンをクリックすると、これらの設定を変更できます。

ロールアウト戦略(レガシー)

GitLab 12.2で導入されました

GitLab 13.0以前では、ロールアウト戦略の設定は、どのユーザーが機能を有効として体験するかに影響します。 機能を有効にするユーザーの割合を選択してください。 環境仕様が無効の場合、ロールアウト戦略は影響しません。

に設定できます:

機能フラグ戦略

  • GitLab 13.0から導入されました
  • フィーチャーフラグで有効・無効を切り替えることができ、デフォルトでは無効になっています。
  • GitLab.comで有効になっています。
  • GitLabセルフマネージドインスタンスで使うには、GitLab管理者に頼んで有効にしてもらいましょう。

ストラテジーを何度も定義することなく、複数の環境に機能フラグストラテジーを適用できます。

GitLab Feature Flagsは機能フラグエンジンとしてUnleashを使用しています。 Unleashでは、機能フラグを細かく制御するためのストラテジーがあります。 GitLab Feature Flagsは複数のストラテジーを持つことができ、サポートされているストラテジーは以下の通りです:

ストラテジーは、機能フラグを作成するときに追加するか、または作成後に既存の機能フラグを編集するときに、オペレーション> 機能フラグに移動して{鉛筆}(編集)をクリックします。

すべてのユーザー

defaultUnleash アクティベーション戦略を使用します。

ロールアウト率(ログインユーザー)

gradualRolloutUserIdUnleash アクティベーション戦略を使用します。

たとえば、認証されたユーザーの15%に対してこの機能を有効にするには、15%という値を設定します。

ロールアウトのパーセンテージは0%から100%まで。

注意:このストラテジーを選択した場合、Unleashクライアントがこの機能を有効にするためのユーザーIDを取得する必要があります。 以下のRubyの例を参照してください。

ユーザーID

GitLab 12.2で導入され、GitLab 12.6では環境ごとに定義されるように更新されました。

UnleashuserWithIdアクティベーション・ストラテジーを使用して実装されています。

ユーザーIDをカンマで区切った値のリストとして入力します。例えば、user@example.com, user2@example.comusername1,username2,username3などです。

注意:Unleashクライアントが対象ユーザーに対して機能を有効にするには、ユーザーIDを付与する必要があります。 以下のRubyの例を参照してください。

リスト

GitLab 13.1で導入されました。

機能フラグユーザーリストAPIで作成されたユーザーリストの機能を有効にします。ユーザーIDと同様に、UnleashuserWithIdアクティベーションストラテジーを使用します。

機能フラグ戦略の有効化または無効化

この機能は開発中ですが、テストする準備はできています。デフォルトでは無効になっている機能フラグの後ろにデプロイされています。 GitLab RailsコンソールにアクセスできるGitLab管理者は、インスタンスでこの機能を有効にすることができます。

有効にするには:

Feature.enable(:feature_flags_new_version)

無効化するには:

Feature.disable(:feature_flags_new_version)

特定の環境で機能フラグを無効にします。

GitLab13.0以前では、特定の環境で機能フラグを無効にします:

  1. プロジェクトのオペレーション>機能フラグに移動します。
  2. 無効にしたい機能フラグで、鉛筆アイコンをクリックします。
  3. フラグを無効にするには
    • GitLab 13.0以前の場合:環境のStatusトグルをスライドさせます。 または、環境スペックを削除するには、右側のRemove(X)アイコンをクリックします。
    • GitLab 13.1以降では:適用される各ストラテジーについて、[Environments]で環境を削除してください。
  4. 変更を保存する]をクリックします。

すべての環境で機能フラグを無効にします。

すべての環境で機能フラグを無効にするには:

  1. プロジェクトのオペレーション>機能フラグに移動します。
  2. 無効にしたい機能フラグについて、StatusトグルをDisabledにスライドさせます。

機能フラグは「無効」タブに表示されます。

機能フラグとアプリケーションのインテグレーション

機能フラグをアプリケーションで使うには、GitLabからアクセス認証情報を取得します。 そして、クライアントライブラリを使ってアプリケーションを準備します。

アクセス認証情報の取得

アプリケーションがGitLabと通信するために必要なアクセス認証情報を取得します:

  1. プロジェクトのオペレーション>機能フラグに移動します。
  2. Configure(設定)ボタンをクリックすると、以下のように表示されます:
    • API URL:クライアント(アプリケーション)が機能フラグのリストを取得するために接続するURL。
    • インスタンスID:機能フラグの検索を作成者に許可する一意のトークン。
    • アプリケーション名: 実行環境の名前。インスタンスンスンス、アプリケーションが本番サーバーで実行される場合、アプリケーション名はproduction などとなります。この値は環境仕様の評価に使用されます。
注:これらのフィールドの意味は、時間の経過とともに変更される可能性があります。 たとえば、インスタンスIDが単一のトークンになるか、環境に割り当てられた複数のトークンになるかは不明です。 また、アプリケーション名は、実行環境の代わりにアプリケーションのバージョンを表す可能性があります。

クライアントライブラリの選択

GitLabはUnleashクライアントと互換性のある単一のバックエンドを実装しています。

Unleashクライアントでは、開発者はアプリケーションコードでフラグのデフォルト値を定義することができます。 各機能フラグの評価では、提供された設定ファイルにフラグが存在しない場合に望ましい結果を表現することができます。

Unleashは現在、さまざまな言語やフレームワーク用のSDKを多数提供しています。

機能フラグ API情報

APIの内容については、こちらをご覧ください:

Golangアプリケーションの例

機能フラグを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アプリケーションの例

機能フラグを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