見出し画像

RailsにオレオレFeature Flags(Release Toggles)を実装して遊んでみた


はじめに

リリースとデプロイを分離する手法として、Feature Flags特にRelease Togglesが気になっており、Railsでどうやって実装するのかを考えてみた。ちなみにFeature Flagsは以下のような種類がある。

  • Release Toggles(開発途中機能の管理)

  • Experiment Toggles(A/Bテスト)

  • Ops Toggles(パフォーマンス調整)

  • Permissioning Toggles(特定ユーザーへの有効化)

やりたいこと

  • 開発者はプロジェクトのソースコード内でフラグ管理したい

  • リリース担当者はアプリ管理画面(RailsAdmin/Active Admin等)でリリースをコントロールしたい

実装

シンプルな機能であるため外部サービスは一旦検討から外す。また管理画面で簡単にON/OFF切り替えられるようにするため、よくある環境変数での管理ではなくRDBMSで管理できるようにする。

テーブル設計は以下の通りとした。

モデルはこんな感じにしてみた。

class ReleaseToggle < ApplicationRecord
  enum feature_name: {
    post: "post",
    mail: "mail"
  }

  validates :feature_name, presence: true, uniqueness: true

  feature_names.keys.each do |feature_name|
    define_singleton_method("#{feature_name}_enabled?") do
      where(feature_name: feature_name, enabled: true).exists?
    end
  end
end

開発者が新しい機能フラグを追加する場合、enumに機能名を追加する。enumを追加すると、フラグ判定メソッドも自動生成するようにした。

判定箇所の実装イメージはこんな感じ。

def something_method
  p "処理を開始します"

  if ReleaseToggle.mail_enabled?
    send_mail
  else
    p "メール機能がオフになっています"
  end
end

リリース担当者はデプロイが完了後、任意のタイミングで該当機能のレコードを作成してリリースすることができる。

Release Togglesは長く生存させるものではないので、リリース完了後特に問題なければ速やかにコードの掃除を行う。

class ReleaseToggle < ApplicationRecord
  enum feature_name: {
    post: "post"
  }

    (略)

end
def something_method
  p "処理を開始します"

  send_mail
end

修正コードがデプロイされ次第、デプロイ担当者は機能フラグを削除する。


この記事が気に入ったらサポートをしてみませんか?