機能フラグの背後にデプロイされたGitLab機能の有効化と無効化

GitLabは機能フラグ戦略を採用し、開発者の早い段階で機能をデプロイし、インクリメンタルにロールアウトできるようにしました。

永続的に利用できるようにする前に、機能フラグをデプロイすることができます

  • 機能をテストするため。
  • 機能開発の初期段階で、ユーザーや顧客からフィードバックを得るため。
  • ユーザーの採用を評価するため。
  • GitLabのパフォーマンスにどのような影響を与えるかを評価します。
  • リリースの間、より細かく構築するため。

フラグの背後にある機能は、通常、徐々にロールアウトすることができます:

  1. デフォルトでは無効になっています。
  2. この機能はデフォルトで有効になります。
  3. 機能フラグは削除されます。

これらの機能を有効にしたり無効にしたりして、ユーザーの使用を許可したり禁止したりすることができます。これは、Rails コンソール機能フラグ APIにアクセスできる GitLab 管理者が行います。

機能フラグを無効にすると、その機能はユーザーから隠され、すべての機能がオフになります。例えば、データは記録されず、サービスは実行されません。

特定の機能を使用し、バグ、誤動作、エラーを確認した場合、フィードバックを提供することが非常に重要です。 フィードバックフラグに隠れている間に改善したり修正したりすることができます。GitLabをアップグレードすると、機能フラグのステータスが変わることがあります。

開発中の機能を有効にする際のリスク

本番環境のGitLabで無効になっている機能フラグを有効にする前に、潜在的なリスクを理解することが重要です。

caution
デフォルトでは無効になっている機能を有効にすると、データの破損、安定性の低下、パフォーマンスの低下、セキュリティのイシューが発生する可能性があります。

デフォルトで無効になっている機能は、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.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.enableFeature.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