はじめに
自動テストツール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.ymlのscript:に記述すれば「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につけることができました!!


