wassupdee / RUNTEQ_portfolio

1 stars 0 forks source link

GitHubActionsにおける、db接続エラーについて #167

Closed wassupdee closed 2 months ago

wassupdee commented 2 months ago

実装したいもの・解決したいもの

GitHubActionsにおいて、rspecを実行するための環境構築を実行したいです。 DBを作成する際、MySQLコンテナに接続できず、エラーが起きてしまいます。 このエラーを解消したいです。

エラー内容

Run cp config/database.yml.ci config/database.yml
  cp config/database.yml.ci config/database.yml
  bundle exec rails db:create RAILS_ENV=test
  bundle exec rails db:migrate RAILS_ENV=test
  shell: /usr/bin/bash -e {0}
  env:
    OPENAI_ACCESS_TOKEN: ***
    LINE_CHANNEL_ID_LOGIN: ***
    LINE_CHANNEL_SECRET_LOGIN: ***
There is an issue connecting with your hostname: db.

Please check your database configuration and ensure there is a valid connection to your database.
Couldn't create 'myapp_test' database. Please check your configuration.
bin/rails aborted!
ActiveRecord::DatabaseConnectionError: There is an issue connecting with your hostname: db. (ActiveRecord::DatabaseConnectionError)

エラーの意味とエラー内容から推測される原因

エラーの意味

推測される原因

config/database.yml.ci

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

test:
  <<: *default
  database: myapp_test

実装する際に参考にした資料

以下、ChatGPTの回答です。


このエラーメッセージから、MySQLサーバーが正しく起動していないか、あるいはRailsがMySQLサーバーに接続できていない可能性が考えられます。いくつかの原因が考えられるので、順番に確認してみましょう。

1. MySQLサーバーの起動確認

MySQLサーバーがGitHub Actionsの環境で正しく起動していない可能性があります。servicesセクションでMySQLを指定していますが、サービスの起動が完了する前に接続を試みている可能性があります。

確認方法:

- name: Wait for MySQL to be ready
  run: sleep 10

2. MySQLのhost設定が正しいか

エラーメッセージにUnknown MySQL server host 'db'とありますが、host: dbが正しく設定されていない可能性もあります。host: dbが正しいサービス名であることを確認してください。

対策:

3. MySQLコンテナの起動確認

MySQLコンテナ自体が正しく起動していない可能性があります。この場合、GitHub Actionsのサービスログを確認して、MySQLサービスが正しく起動しているかどうかを確認します。

対策:

4. Dockerのヘルスチェックを追加する

MySQLが完全に起動する前にRailsがデータベースに接続しようとしているためにエラーが発生している可能性もあります。その場合、Dockerのヘルスチェックを追加することで、MySQLが完全に起動した後に次のステップが実行されるように設定できます。

例:

docker-compose.ymlでのhealthcheckの設定例を参考に、MySQLサービスにヘルスチェックを追加してみてください。

services:
  db:
    image: mysql:8.0
    ports:
      - 3307:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
    healthcheck:
      test: mysqladmin ping -h 127.0.0.1 -uroot -ppassword
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 30s

5. MySQLコンテナが作成されているか確認

MySQLコンテナが実際に作成されていない場合も考えられます。これは、docker-composeやGitHub Actionsの設定が正しくない場合に発生することがあります。

対策:

まとめ

上記のチェックポイントを確認しながら、エラーの原因を絞り込んでください。特に、MySQLが正しく起動しているか、Railsが正しいホストとポートでMySQLに接続しようとしているかを確認することが重要です。

Tsuchiya2 commented 2 months ago

cp config/database.yml.ci config/database.yml

↑実行していますが、GitHub上に config/database.yml.ci ファイルが見当たらなかったので、その辺り確認・検証してみてください。

wassupdee commented 2 months ago

ご回答どうもありがとうございます。

config/database.yml.ciファイルは、wassupdee-patch-1ブランチ上に存在しております。 (このブランチをプッシュした際に、GitHubActionsが実行され、今回のエラーが発生いたしました) https://github.com/wassupdee/RUNTEQ_portfolio/blob/wassupdee-patch-1/config/database.yml.ci

cp config/database.yml.ci config/database.yml この処理は、wassupdee-patch-1ブランチ上のファイルを参照しているかと存じますが、私の理解で合っておりますでしょうか?

この様に考える理由は、

ChatGPTとの確認内容

現在の設定では、cp config/database.yml.ci config/database.yml はブランチAに存在する config/database.yml.ci ファイルを参照して処理が行われます。mainブランチのファイルは参照されません。GitHub Actionsはトリガーされたブランチの内容で>ジョブを実行するため、ブランチAの状態がそのまま使用されます。

Tsuchiya2 commented 2 months ago

参照されている記事のdatabase.ymlの host はdbではなく、127.0.0.1 になっているので、まずは参考にされている記事通りで現在の状況が変わるのかを仮説・検証してみてください。(記事の一部だけでなく、記事通りで動くかなど)

wassupdee commented 2 months ago

的確なアドバイス大変ありがとうございました。解決いたしました。 範囲を狭めて原因を特定する方法、勉強になりました。

原因

DBのhost名の設定ミスだった。ジョブがランナーマシン上で動いているのに、DBのコンテナ名を使ってDBを作ろうとしていた