発生した事象
CICDフローにおいて、CircleCi上でrspecを実行するために準備としてrails db:create
を実行した。
しかし、実行中にDB接続エラーが発生した。
結論
CircleCIのジョブ実行において複数のイメージ指定する場合、DBの接続ホスト指定はlocalhost
を指定ではなく127.0.0.1
を使おう。
失敗時のエラーメッセージ
rails aborted!
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
良くあるrailsからDBへの接続エラーですね。
ローカルのmysqlを参照しにいこうとしている様子。
現状の設定見直し
接続エラーなので、DBの接続情報の設定を見直してみる。
Circleciのconfig.yml
接続コマンドや環境変数やRAILS_ENV
も適切で問題なさそう。
Ruby on Railsで利用している database.yml
設定ファイル上に、DB接続ホスト、ユーザ名、DB名が指定してあるため接続には問題なさそう。
調査
調査を進めると次の記事にヒットしました。
また、各コンテナ間の連携には localhost を使うことはできません。 127.0.0.1 を指定するようにすることと、Rails であれば config/database.yml で以下のような記述を追加することを忘れないようにしましょう。
https://tech.smarthr.jp/entry/2017/07/12/073000
対応
上記の記事より、本件も同一事象と仮定しrailsで指定しているDBのhost指定を、localhost
ではなく、127.0.0.1
に変更し動作確認。
jobの確認
#!/bin/bash -eo pipefail
bundle exec rails db:create
bundle exec rails db:migrate
bundle exec rspec
Created database 'hoge'
(中略)
Finished in 0.00373 seconds (files took 0.87988 seconds to load)
実行も完了し、ジョブも正常終了したのでOK!。