Skip to content

Instantly share code, notes, and snippets.

@pocke

pocke/Rails.env.md

Created Mar 16, 2020
Embed
What would you like to do?

Rails.envを減らしたい

TL;DR

  • if Rails.env.production?をやめて、if ENV['ENABLE_HOGEHOGE_FEATURE']のように書いていこう

Kibelaの現状

Rails.envがたくさん生えています。 Rails標準の次の3つと、

  • production
  • development
  • test

Kibelaで定義している次の3つがあります。

  • staging
    • よくあるstaging用の環境
  • heroku
    • Herokuで動いているreview apps用の環境
  • admin
    • otama用の環境

このうち、stagingとherokuをproductionに寄せていきたいと思っています。 adminもどうにかしたい気がしますが、正直あんまり触ってないのでどうにかできるのかがわからない…。でもRails.envの役割ではない気がします。

Rails.envとはなんなのか

Rails.envは「Railsというフレームワークの動作モード」です。これは私がどっかで読んだ言葉ですが、一番しっくりきています。

何が言いたいかというと、Rails.envは「環境ごとに機能を出し分けるもの」でも「アクセスするAPIの向き先を変えるもの」でもありません。 そういったものは個別に環境変数で指定しましょう。つまり、コード中にif Rails.env.production?と書くのをやめて、if ENV['ZENDESK_ENABLED']のように書きましょう。

Rails.envを減らすと何が嬉しいのか

stagingのサーバーでもRails.envproductionであれば、その分本番との差が少ない状態だと言えます。 より本番に近い環境でstagingサーバーを稼働させるという意味で、その方が正しいのではないでしょうか。

また、if Rails.env.production?をなくして環境変数でアクセスするAPIの向き先などを変えるようにすると、ローカルでproductionとしてrailsアプリを動かすことができるようになります。 これはパフォーマンスの検証やRails.env.production?でしか発生しないバグの調査などに役立つでしょう。

また、単に沢山の環境向けにif文を書くよりも、各環境変数が設定されていることをif文で書いたほうが分かりやすいというのもあります。 例: https://github.com/bitjourney/kibela/blob/5d6148efa2c08e9f63ffb71c09c36fa1ec5c631c/app/models/search_client.rb#L215

# これよりも
if Rails.env.staging? || Rails.env.heroku?
  require "faraday_middleware/aws_sigv4"
  # ...
end

# こっちのほうが分かりやすい
if ENV['ENABLE_ELASTICSEARCH_SIGV4']
  require "faraday_middleware/aws_sigv4"
  # ...
end

とはいえ、この環境変数をどこで設定すべきなのかという話もあるのですが。

ではどうしていくとよいのか

すぐにRails.envを使わないようにコードを全体的に書き換えるのはあまり現実的ではありません。 今Rails.envの数を減らしたところで得られるメリットがそんなに大きいわけでもないですし。

そのため、新規に書くところはRails.envでの分岐をせずに環境変数で設定をしていく形で書くようにして、既存のコードはおいおい……という形が良いのではないかなと思っています。

参考

「Rails.env staging」とかでググるとそれっぽい記事がいくらか出てきます。

@pocke

This comment has been minimized.

Copy link
Owner Author

@pocke pocke commented Mar 16, 2020

querlyのルール

  - id: kibela.no-rails-env
    pattern:
      - Rails.env
    message:
      環境毎の設定の違いにRails.envを使用せず、個別に環境変数を使えないか検討してください。

      Rails.envで分岐するよりも、個別に環境変数を設定した方が見通しがよいです。
      また将来的にstaging/heroku環境をproduction環境に統合することも見据えています。
      see https://bitjourney.kibe.la/notes/6228
    justification:
      - 既存のコードで環境変数に置き換えるのが難しい場合
      - 一時的なコードで消す予定が立っている場合
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment