![見出し画像](https://assets.st-note.com/production/uploads/images/133289499/rectangle_large_type_2_b1ac0255fe706ee56808abeac03f9853.png?width=1200)
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で管理できるようにする。
テーブル設計は以下の通りとした。
![](https://assets.st-note.com/img/1708266763693-joJystR29J.png)
モデルはこんな感じにしてみた。
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
修正コードがデプロイされ次第、デプロイ担当者は機能フラグを削除する。
この記事が気に入ったらサポートをしてみませんか?