【Rails】Travis CIを導入してdb:createで詰まったこと


はじめに

自動テストツールTravis CIを導入するときにつまづいたことを書きます。

環境

・Ruby 2.6.5
・Rails 6.0.3.2
・Mysql Ver 14.14 Distrib 5.6.47

問題点

以下のような.travis.ymlに記述しているdb:createがどうしても通らないという問題が発生しました。


script:
  - bundle exec rake db:create RAILS_ENV=test
  - bundle exec rake db:migrate RAILS_ENV=test
  - bundle exec rspec

Travis CIの画面ではこのようなエラーメッセージがでました。

Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

いろいろ調べてみるとソケットファイルが無いということがわかりました。
database.ymlの記述のソケットファイルへのパスが誤っているということです。
今回使用したDBは MySQLです。


test:
  <<: *default
  database: (myapp)_test
  adapter: mysql2
  encoding: utf8
  username: root
  password:
  socket: (ここの記述)

解決策

でもローカルではないTravis CIのなかのファイル構成はどうしてもわからなかったので自力で確認することにしました。

まずはソケットファイルの場所を調べるコマンドは以下です。

$ mysql_config --socket

ローカル環境ではこれでわかるので、もしかしたら.travis.ymlscript:に記述すれば「Travis CI上のmysqld.sockの場所がわかるかもと思い、この記述をプラスしました。(正しいやり方かはわかりませんけど・・・)


script:
  - mysql_config --socket  (←ソケットファイルを確認する)
  - bundle exec rake db:create RAILS_ENV=test
  - bundle exec rake db:migrate RAILS_ENV=test
  - bundle exec rspec

すると、

なんと値が返ってきました!515行目の記述です!

/var/run/mysql/mysqld.sock

これをdatabase.ymlに記述すれば、無事にdb:createが通りました!

ローカルの時とTravisCIの時の使い分け

このままだと逆にローカルでのテストがうまくいかないのでTravisCIでのテストの時には上記でしらべたソケットを参照するようにします。

TravisCI専用としてdatabase_travis.ymlを作成し以下のような記述。


test:
  <<: *default
  database: (myapp)_test
  adapter: mysql2
  encoding: utf8
  username: root
  password:
  socket: /var/run/mysqld/mysqld.sock

そして.travis.ymlに以下を追記


before_script:
  - "cp config/database_travis.yml config/database.yml"

この時だけ書き換えるようにしたらローカルでもTravisCIでもテストが動きました。
データベースのエラーはなかなか原因にたどり着けなく苦労しました。

無事にこのバッジをReadmeにつけることができました!!