2022年04月05日 - Tomo Masakura    

GitLab Feature Flagsでアプリの外観・機能を切り替えよう!

GitLab Feature Flagsを利用して、アプリケーションの外観や機能を簡単に切り替える方法を紹介します。

アプリケーションの開発をしていて、「アプリケーションの見た目を大きく変えてみたいけど効果あるのかなあ」「新機能を追加したいけどバグが出たらどうしよう」などと悩むことはよくあると思います。Gmailがやっているような、新UIは一部のユーザーのみ有効にする機能がほしいと思いませんか?

まさにそのための機能のGitLab Feature Flagsを紹介します。

GitLab Feature Flagsとは?

GitLab Feature Flagsとは、あなたのアプリケーションの外観や機能をGitLabプロジェクトの機能フラグ画面から簡単に切り替えるための機能です。

上図のGitLabの機能フラグの画面で切り替え(左下図:オフ、右下図:オン)

スクリーンショットでは、機能フラグ画面からトグルスイッチでアンケートを提出するボタンの大きさと色を切り替えています。もちろん、このような見た目の変更だけでなく、機能の有効無効やアルゴリズムの切り替えなどにも利用できます。

もちろん、トグルスイッチだけでなく、条件による切り替えもできます。GitLab Feature Flagsでは戦略と呼んでいます。

  • 開発環境は有効だけど、本番環境は無効
  • 開発者のアカウントでは有効だけど、一般利用者には無効
  • 利用者のうち10%だけ有効

戦略が設定された機能フラグ

GitLab Feature Flagsは、あなたのアプリケーションの機能を切り替えるためにサーバーにログインして設定ファイルを書き換える必要がありません。これはとても大きなことです。

マネージャーは機能の切り替えのタイミングを商業的な理由にて決定したいと考えているでしょう。マネージャーはGitLab Feature Flagsの画面で切り替えができます。切り替えタイミングの調整のための開発者と細かい打ち合わせが不要になります。

開発者は機能フラグの名前をマネージャーに伝えるだけです。切り替えのタイミングや戦略はマネージャーにお任せです。マネージャーから今の設定はどうなってるんだっけ?と聞かれることもなくなるでしょう。

GitLab Feature Flagsでの切り替えを簡単に体験できるように、デモアプリをAzure Web Appsにデプロイしました。この二つの環境は同じアプリケーションですが、環境(developmentもしくはproduction)やユーザーによってアンケートを提出するボタンの外観が変わります。

  • development - 常にアンケートを提出するボタンを目立たせています。
  • production - user1のみアンケートを提出するボタンを目立たせています。右上のログインからuser1やuser2でログインして、切り替わるのを確認してください。

機能フラグの切り替えをやってみたい方は、デモアプリのREADMEをご覧ください。

あなたのアプリケーションにGitLab Feature Flags組み込むのはとても簡単です。興味がある方は、このブログの続きを読んで、ぜひ活用してください。

GitLab Feature Flagsを利用する

それではさっそく、あなたのアプリケーションでGitLab Feature Flagsを利用できるようにしていきましょう。

機能フラグを作成する

GitLab Feature FlagsはGitLabのプロジェクトに対して設定しますので、まずは新しいGitLabプロジェクトを作成してください。

プロジェクトの左側にあるサイドメニューからDeployments->機能フラグを開きます。これが機能フラグの各種設定の画面です。(スクリーンショットではすでに機能フラグが一つ登録されています。まだ未登録の場合は一覧は空です)

プロジェクトの機能フラグ画面

右上にある新しい機能フラグをクリックし、機能フラグの名前にflag1を入力します。

新しい機能フラグを作成

なお、名前は小文字・数字・アンダースコア(_)・ハイフン(-)のみが使えます。先頭にアンダースコアやハイフンを使うことはできません。

説明は必須ではありませんが、機能フラグを利用する他の人のためにわかりやすい説明があったほうがよいでしょう。

入力が終わっったら、機能フラグを作成をクリックして保存します。

以上で機能フラグの作成は完了しました。

アプリケーションに組み込む

続けて、あなたのアプリケーションでGitLab Feature Flagsが使えるようにします。

GitLab Feature FlagsはUnleashというサービスのAPIのサブセットを提供しています。ですので、あなたのアプリケーションへの組み込みはUnleashと同じく、Unleash SDKを組み込みます。

組み込み方法はGitLab公式ドキュメントのIntegrate feature flags with your applicationにありますが、ここではJavaでの使い方を簡単に紹介します。他の言語でも大きくは変わりませんので、参考になると思います。

あらかじめJavaとGradleのインストールが完了しているものとして、コンソールアプリケーションに組み込んでいきます。

まずはコンソールアプリケーションプロジェクトを作成します。

mkdir demo
cd demo
gradle init

質問Select type of project to generate:2: applicationを選んでください。それ以外の質問はデフォルトで構いません。

プロジェクトが問題なく作成できてるかを確認するために次のコマンドを実行します。(Windowsのコマンドプロンプトを利用している場合、gradlew runとしてください)

./gradlew run

...

Hello, world!

...

app/build.gradleにUnleash SDKが使えるようdependenciesに登録します。

dependencies {
	// ...

    implementation 'no.finn.unleash:unleash-client-java:4.4.1'

	// ...
}

Unleashの初期化に必要なAPI URLやインスタンスIDを取得します。GitLabのプロジェクトの機能フラグ画面を開き、設定ボタンをクリックし、必要な情報を表示してください。

Unleashの初期化情報

app/src/main/java/demo/App.javaファイルを次のように書き換えます。

package demo;

import no.finn.unleash.*;
import no.finn.unleash.util.UnleashConfig;

public class App {
    public static void main(String[] args) throws InterruptedException {
        // Unleashを初期化します。
        UnleashConfig config = UnleashConfig.builder()
                .appName("development")
                // インスタンス ID をソースコード中に直接書くのは実際には避けてください。
                .instanceId("<インスタンスID>")
                .unleashAPI("<API URL>")
                .build();
        Unleash unleash = new DefaultUnleash(config);

        while (true) {
            Thread.sleep(1000);

            // 機能フラグを問い合わせます。
            System.out.println(unleash.isEnabled("flag1"));
        }
    }
}

new DefaultUnleahs(config)で、バックグラウンドで定期的に機能フラグの設定を取得するジョブが開始されます。これ以後、Unleashオブジェクトを利用して機能フラグを問い合わせます。

アプリケーションを起動します。

./gradlew run

...

true
true

...

一秒おきに機能フラグの状態を表示し続けます。機能フラグの画面のトグルスイッチでflag1機能フラグをオフにしてください。しばらくすると表示がfalseに切り替わります。(既定では30秒おきに機能フラグの設定を取得していますので、最大で30秒かかります)

機能フラグを無効にする

今回は機能フラグの状態を表示するだけでしたが、実際のアプリケーションでは機能フラグの状態によって処理を分岐することになります。

if (unleash.isEnabled("flag1")) {
    // 機能フラグが有効なときの処理。
} else {
    // 機能フラグが無効なときの処理。
}

機能フラグの戦略の作成

この状態の機能フラグはトグルスイッチでしか切り替えることができません。戦略を使うことで、特定のユーザーのみや特定の環境のみ有効といったことができます。

開発環境だけ有効にする

開発中の機能をテストのために使えるようにしたいけど、本番ではまだ有効にしたいくないことはよくあります。GitLab Feature Flagsで開発環境のみ機能を有効するように戦略を設定します。

機能フラグ画面のflag1機能フラグの編集ボタンをクリックします。もしflag1機能フラグが無効になっていたら有効にしてください。

戦略環境+をクリックし、developmentと入力します。Create developmentをクリックして環境を追加します。

戦略に環境を追加

変更を保存をクリックして、保存します。

この環境名はUnleashの初期化のときにappNameに設定します。(Unleashの設定の中にはenvironmentもあるのですが、GitLab Feature FlagsではappNameを使うので注意してください)

UnleashConfig config = UnleashConfig.builder()
    .appName("development") // 開発環境
    // .appName("production") // 本番環境
    // インスタンス ID をソースコード中に直接書くのは実際には避けてください。
    .instanceId("<インスタンスID>")
    .unleashAPI("<API URL>")
    .build();

Unleash unleash = new DefaultUnleash(config);

環境をdevelopmentからproductionに書き換えて、アプリケーションを再起動してください。developmentのときだけ機能フラグが有効なのがわかります。

ここではサンプルコードですので、環境名をソースコードに直接書いていますが、実際には環境変数から読み込むのがよいでしょう。

特定のユーザーだけ有効にする

開発中の機能の実装やテストが終わっても、いきなり誰でも使えるようにするのではなく、まずは社員の人に使ってもらってフィードバックを反映してから利用者に公開したいということはよくあるあります。GitLab Feature Flagsで特定のユーザーのみ有効にする戦略を設定します。

ユーザーの指定には二種類の方法があります。

一つ目は、ユーザーIDをカンマ区切りで並べる方法です。

ユーザーIDを指定する

もう一つは、社員・開発者・ベータテスターなどのユーザーリストをあらかじめ作成しておき、そのユーザーリストを指定する方法です。

作成済みのユーザーリストを指定する

おすすめのユーザーリストでの設定方法を紹介します。

機能フラグ画面の右上のView user listsをクリックして、ユーザーリストを表示してください。画面右上のNew user listをクリックします。Name社員と入力し、Createボタンでユーザーリストを作成します。(ユーザーリストの名前には日本語が使えます)

新しいユーザーリストの作成

そのまま右上のAdd Usersボタンでユーザーを追加します。

ユーザーリストにユーザーを追加

User IDsにカンマ区切りでユーザーIDを入力します。説明にも書いてありますが、ここで指定するユーザーIDはGitLabのユーザー名ではなく、あなたのアプリケーションでのユーザーIDです。ここでは、user1,user2と入力してAddボタンで追加します。これでユーザーリストの作成は終わりました。

機能フラグ画面に戻って、flag1編集ボタンをクリックします。Add strategyボタンをクリックして、増やした戦略のTypeUser Listを、User List社員を選んで、変更を保存で保存します。

ユーザーリストを戦略に追加

以上で、GitLab側の作業は終わりです。あなたのアプリケーションで、機能フラグを問い合わせる際にユーザーIDを指定するようにします。

UnleashContext unleashContext = UnleashContext.builder()
    // ユーザーを指定する。
    .userId("user1")
    .build();
System.out.println(unleash.isEnabled("flag1", unleashContext));

環境がdevelopmentのままだとどのユーザーでも機能フラグが有効になってしまうので、appName("staging")などと環境をdevelopment以外にソースコードを書き換えた上で実行してください。

ソースコードのユーザーIDをuser2user3などに書き換えて、機能フラグが有効になっているかどうかを確認します。

組み合わせる

development環境は全員使えるように、production環境は社員のみにしたいことはよくあると思います。環境とユーザーの指定の組み合わせもできます。

組み合わせの戦略

ロールアウト

戦略のTypeにはPercent rolloutというのもあります。利用者のうち10%にだけ有効にするといったことができます。詳しくは公式ドキュメントのPercent Rolloutをご覧ください。

もう一つPercent of Usersというものもあるのですが、Percent rolloutUser IDsを指定したときと同じなので、Percent rolloutを使うのがよいでしょう。

その他の機能

GitLab Featuree Flagsのその他の機能です。

この二つの機能はPremium以上が必要です。残念ながら、GitLab.comのFreeプランでの公開プロジェクトには開放されていないようです。

FAQ

GitLabが落ちていたらどうなりますか?

Unleash SDKは、バックグラウンドで30秒おきにGitLab Feature Flagsにアクセスし、その結果をファイルにキャッシュしています。もしGitLab Feature Flagsにアクセスできなくても、キャッシュの値を返します。GitLabが落ちていたとしても、Feature Flagsの状態が変わることはありません。

(上記挙動はUnleash SDKの.NET版で確認しました)

Feature Flagsの制限はありますか?

登録できるFeature Flagsの個数はプロジェクトあたり200個までです。ただし、GitLab.comのFreeプランは50まで、Premiumプランは150までに制限されています。

詳しくは公式ドキュメントをご覧ください。

メトリクスは収集できますか?

A/Bテストでは機能フラグによる切り替えだけでなく、どちらが利用者にとってよりよいかの判断のため、メトリクスを収集します。

Unleashにはメトリクス収集の機能がありますが、GitLab Feature Flagsでは実装されていないようです。

メトリクス収集は他のサービスを利用することになります。

もしGitLabから他のサービスにプロジェクトを移動したら困るんじゃ…

GitLab Feature FlagsはUnleashというサービスのサブセットです。Unleashへの移行はほんのちょっとの修正で済みます。

もしGitLabの利用を辞めたとしても、Unleashに移行するだけです。心配する必要はありません。

終わりに

GitLab Feature Flagsを使うと、本番で開発中の機能のフィードバックを取ったりテストを続けたりした上で、一般の利用者に機能を公開するといったことが手軽にできます。もちろん、専用のサービスと比べると簡単なことしかできません。しかし、専用のサービスのアカウントを作らなくてもすぐに使い始められるのは大きなメリットです。

GitLab Feature Flagsと専用サービスのどちらを使うか悩んだら、まずはGitLab Feature Flagsを導入してください。機能が不足しているようなら、少しの修正で済むUnleashへ乗り換えるとよいでしょう。

最後に。GitLab Feature Flagsは導入が簡単な上に効果は高いです。ぜひあなたの開発しているアプリケーションに導入してください。

Gitlab x icon svg