Pada tulisan kali ini gw mau ngobrolin tentang Flipper.

Sebuah paket di lingkungan Ruby, untuk membantu developing aplikasi feature toggle.

Apa itu feature toggle yang kalo dibahasa indonesia-in mungkin jadi saklar fitur (?)

Dengan fitur ini kita bisa menganti sifat dari aplikasi tanpa harus ada perubahan dari kodenya. Mamfaatnya juga ada banyak, bisa untuk prototyping, atau bisa digunakan sebagai strategi deployment atau switcher untuk fitur yang relatif besar, dan juga bisa untuk backward compatibility dengan lebih cepat dibandingnya revert deployment.


Seperti pada biasanya gw akan mencontohnya penggunaaan Flipper dengan studi kasus.

Misalnya kita dapat task untuk mendevelop dashboard baru. Dashboard ini misalnya ada 20 halaman, dan kita tidak ingin melakukan 1 deployment untuk mengganti 20 halaman ini, namun misalnya dengan 1 halaman 1 deployment.

Artinya kita ingin akan ada spesific user di production yang menggunakan fitur new dashboard dari deployment pertama. Dan user lain tetap menggunakan dashboard lama, hingga semua halaman terdevelop dengan benar.

Oke, kira-kira begitu kasusnya, mari mulai develop.

Silahkan bikin projek rails baru, dan generate simple controller

$> bundle exec rails g controller dashboards index

Pada routes.rb, bisa diupdate jadi gini:

Rails.application.routes.draw do
  root 'dashboards#index'
end

Edit viewnya dan akses urlnya, maka responsenya akan begini:

GET /

Dashboards#index
Welcome to dashboards

Oke, sekarang kita install flippernya, dengan tambah gem ini:

gem 'flipper'
gem 'flipper-ui'
gem 'flipper-active_record'

Jalankan bundle install.

Dengan buat file initializernya config/initializers/flipper.rb

require 'flipper'

Flipper.configure do |config|
  config.default do
    # use active records as the flipper adapter.
    adapter = Flipper::Adapters::ActiveRecord.new

    # pass adapter to handy DSL instance
    Flipper.new(adapter)
  end
end

Kita akan menggunakan database (active record) instead memory untuk alasan kesehatan mental :)

Sekarang tambahkan routes UI-nya, di routes.rb:

Rails.application.routes.draw do
  mount Flipper::UI.app(Flipper) => '/flipper'

  root 'dashboards#index'
end

Oke, sekarang kita bisa akses halaman /flipper dan akan muncul UI dari Flipper. Flipper gem yang cukup terkenal, jadi ada kemungkinan ada orang yang bisa akses ke UInya. Untuk alasan keamanan anda bisa wrap halaman ini dengan otentikasi, atau bisa sembuyikan UI-nya dengan random url, untuk ini saya udah pernah tulis caranya di tulisan Menyembunyikan spesifik routes di Rails.

Sekarang pada halaman /flipper, klik button add feature lalu masukkan new_dashboard dan tekan add feature kembali.

Maka kita akan dibawa ke halaman managemen fiturnya. Pada halaman ini anda bisa tambahkan aktor baru dan masukkan string 123. Ini kita anggap user idnya. Jadi dengan ini kita akan anggap user new dashboard akan hanya bisa dipakai oleh user 123, selain id ini akan menggunakan user lama.

Kita bikin servicenya, app/services/new_dashboard_feature.rb:

class NewDashboardFeature
  def self.enabled?(user_id)
    new.enabled?(user_id)
  end

  def enabled?(user_id)
    return true if Flipper.enabled?(:new_dashboard)
    return false if user_id.blank?

    actors = Flipper::Adapters::ActiveRecord::Gate.where(
      feature_key: 'new_dashboard',
      key: 'actors'
    )
    return false if actors.blank?

    user_ids = actors.pluck(:value)
    return false unless user_ids.include?(user_id)

    true
  end
end

Sekarang pada viewsnya kita update jadi seperti ini:

<h1>Dashboards#index</h1>
<% if  NewDashboardFeature.enabled?(params[:user_id]) %>
  <p>Welcome to new dashboards</p>
<% else %>
  <p>Welcome to dashboards</p>
<% end %>

Sekarang kembali akses halaman localhost:3000/

Dashboards#index
Welcome to dashboards

Masih menggunakan dashboard lama, sekarang kita masukkan user_id 123 localhost:3000?user_id=123

Dashboards#index
Welcome to new dashboards

Dan jika yang akses user id lain, misalnya localhost:3000?user_id=1234:

Dashboards#index
Welcome to dashboards

Dan jika anda butuh user lain, tinggal tambahkan idnya di aktor pada halaman fitur new_dashboard. Dan jika sudah aman, dan ingin fitur new dashboard ini digunakan di semua user tinggal klik tombol “Fully enable” di halaman managemen fitur new_dashboard di Flipper UI-nya.

Maka semua user termasuk user id 123 localhost:3000?user_id=123 akan menggunakan dashboard baru:

Dashboards#index
Welcome to new dashboards

Dan jika ternyata ada issue, ingin melakukan revert, bisa klik tombol “Disable” di index page Flipper UI. Maka semua user akan menggunakan dashboard lama, termasuk user_id 123 localhost:3000?user_id=123:

Dashboards#index
Welcome to dashboards

Mungkin itu saja tulisan kali ini, jika tertarik dengan kode sumbernya bisa ditemukan disini: https://github.com/sugar-for-pirate-king/play-with-flipper.

Happy hacking~~