91s

プログラミング関係、日記などを書きます

【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: mysql2adapter: <%= 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で分岐して仮の値を入れるなどするといいような気がします。