はじめに
自動テストツール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につけることができました!!