記事の背景
Ruby on Rails本番環境で再現していたバグをテスト環境で確認する為、テスト環境を本番環境に変更してバグ修正を試みようと思ったが、テスト環境を本番環境にするのにかなり詰まった為、記事を書いてみました。
まず、環境を変えるとはどういうことか??
テスト環境では環境変数testで実行していたものをproductionに変える(RAILS_ENV=testをRAILS_ENV=productionに変える)
詰まったこと
- テスト環境でRAILS_ENV=productionが実行出来ない。
- コンソールが使用が出来ない。
- テスト環境のデータベースが反映されない。
- アセットプリコンパイルしてもcssや画像が反映されない。
各事象と解決方法
①テスト環境でRAILS_ENV=productionが実行出来ないの解決方法
事象
下記コマンドを打つと、
$ bundle exec rails assets:precompile RAILS_ENV=production
下記のエラーが表示され、本番環境のコマンドが実行出来ない。
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
原因
railsアプリケーションconfig配下にcredentials.yml.encファイルがある事が原因。credentials.yml.enc が本番環境のキーとあってない為のエラーが発生。
$ ls
application.rb cable.yml database.yml environments leaflet.rb puma.rb spring.rb
boot.rb credentials.yml.enc environment.rb initializers locales routes.rb storage.yml
解決方法
下記コマンドでcredentials.yml.encを消し、
アプリ名(config)$ rm credentials.yml.enc
下記コマンドでキーを再生成する。※vimコマンドが開きますが、何も編集せず抜けてOK。
$ EDITOR=vim rails credentials:edit
②コンソールが使用が出来ないの解決方法
事象
下記コマンドを打つと、
$ rails c
下記エラーが表示されて、コンソールが起動しない。
/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/bootsnap-
1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:
in `require': Could not load the 'listen' gem. Add `gem 'listen'`
to the development group of your Gemfile (LoadError)
原因
gemのlistenが開発環境にしかないということらしい…。
解決方法
下記コマンド、
$ rails c production
もしくは下記コマンドのように環境を定義した上で起動すればOK
$ export RAILS_ENV=production
$ rails c
③テスト環境のデータベースが反映されないの解決方法
事象
エラーが出てデータベースに接続出来ない。
原因
本来は実行環境がテスト環境なので、テスト環境に紐づくDBしか参照にもかかわらず、環境変数を本番環境に指定して実行しているので、本番環境のDBを参照しようとしているが、テスト環境からは接続が出来ないのでエラーが発生している。
解決方法
DBは本番環境を参照出来ないので、テスト環境を参照するよう変更する。
アプリケーションファイルconfig/database.ymlの本番環境設定を下記のように変更する。
production:
<<: *default
database: テスト環境のDB名
username: テスト環境のユーザー名
password: テスト環境パスワード
host: テスト環境のホスト名
④アセットプリコンパイルしてもcssや画像が反映されないの解決方法
事象
下記コマンドでアセットプリコンパイルしてもcssや画像が反映されず、画面上HTMLだけの寂しい画面になってしまう…。
bundle exec rails assets:precompile RAILS_ENV=production
原因
アプリケーションファイルconfig/environments/production.rbで静的コンテンツの公開がfalseになっている為。
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
解決方法
falseの場合、public配下のファイルが公開されないので、trueにするとうまく行く。
下記コマンドを実行するとtrueになる。
$ export RAILS_SERVE_STATIC_FILES=true
そしてサーバーを再起動する。
まとめ
ネット記事を読み漁り、何とかテスト環境で本番環境を再現する事が出来ました。この方法まずいんじゃないか、もっとこうした方がいいんじゃないかという意見がある方は、コメント頂けたら嬉しいです。
参考記事
https://mattun-programming.hatenablog.com/entry/2020/01/16/123811
https://www.task-notes.com/entry/20160920/1474343389
https://qiita.com/yuiko_akiyoshi/items/263fc49414fb3c7a0162
https://qiita.com/aiandrox/items/408724ab8a4482fb5873