【Rails】config/initializers内でDB接続が必要な処理を書いた際のCI対応
はじめに
今回、config/initializers内でDB接続を伴う設定をしたのですが、
- assets:precompile
- testDB作成
でエラーが出たのでその対応についてメモ。
前提
- 使用DBはmysql8
- assets:precompileはDockerfile内
- CircleCIで、docker build、testDB作成などを行なっている
起きたことと対策
bundle exec rails assets:precompile実行時にMysql接続エラー
具体的には、
Mysql2::Error::ConnectionError: Unknown MySQL server host ~
このエラーでした。
プリコンパイルをする際、DB接続をしようとするらしいのですが、CIの際は実際のDBに接続できる訳ではないのでDB接続をしないようにする必要がありました。
そこで利用したのがactiverecord-nulldb-adapter
というgemです。
ソースコードの変更・追加点は、
- Gemfile
gem 'activerecord-nulldb-adapter'
を追加
- database.yml
adapter: mysql2
をadapter: <%= ENV['DB_ADAPTER'] ||= 'mysql2' %>
に変更
こんな感じです。
testDB作成時にunknown databaseエラー
CIの途中、rspecを実行する前にその為のDBを作成する工程があるのですが、そこで
Mysql2::Error: Unknown database
エラーが出ました。
db:create
をする際、実際にDBを作成する処理より前にrailsの初期化が実行されている為、config/initializers内でDB接続している箇所でエラーが出ていたのです。
今回、rspecでは該当の処理を使わなかった為、設定ファイルのDB接続より前の箇所に、
return if Rails.env.test?
を入れて対処しました。
rspecで該当箇所を使う場合は、returnではなくifで分岐して仮の値を入れるなどするといいような気がします。