質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

Q&A

2回答

1865閲覧

Rails + CircleCIでRSpecを実行しようとするとDBのエラーが出る

batacon

総合スコア1

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

0グッド

0クリップ

投稿2020/08/17 00:46

編集2020/08/19 06:51

前提・実現したいこと

RailsのアプリケーションでCircleCIを使おうと思ったのですが、CI側でRSpecを実行する際にデータベースのセットアップでエラーが出ました。
.circleci/config.ymlは https://circleci.com/docs/2.0/language-ruby/ を元に作りました。

発生している問題・エラーメッセージ

#!/bin/bash -eo pipefail # bundle exec rails db:create # bundle exec rails db:schema:load --trace could not translate host name "db" to address: Name or service not known Couldn't create 'book_manager_test' database. Please check your configuration. rails aborted! PG::ConnectionBad: could not translate host name "db" to address: Name or service not known

該当のソースコード

.circleci/config.yml

yml

1version: 2.1 # Use 2.1 to enable using orbs and other features. 2 3# Declare the orbs that we'll use in our config. 4# read more about orbs: https://circleci.com/docs/2.0/using-orbs/ 5orbs: 6 ruby: circleci/ruby@1.0 7 node: circleci/node@2 8 9jobs: 10 build: # our first job, named "build" 11 docker: 12 - image: cimg/ruby:2.6.6-node # use a tailored CircleCI docker image. 13 steps: 14 - checkout # pull down our git code. 15 - ruby/install-deps # use the ruby orb to install dependencies 16 # use the node orb to install our packages 17 # specifying that we use `yarn` and to cache dependencies with `yarn.lock` 18 # learn more: https://circleci.com/docs/2.0/caching/ 19 - node/install-packages: 20 pkg-manager: yarn 21 cache-key: 'yarn.lock' 22 23 rubocop: 24 docker: 25 - image: cimg/ruby:2.6.6-node # use a tailored CircleCI docker image. 26 environment: 27 RAILS_ENV: test 28 POSTGRES_HOST: 127.0.0.1 29 - image: circleci/postgres:9.5-alpine 30 environment: # add POSTGRES environment variables. 31 POSTGRES_USER: circleci-demo-ruby 32 POSTGRES_DB: rails_blog_test 33 POSTGRES_PASSWORD: '' 34 steps: 35 - checkout 36 - ruby/install-deps 37 - node/install-packages: 38 pkg-manager: yarn 39 cache-key: 'yarn.lock' 40 # Rubocop 41 - run: 42 name: Rubocop 43 command: bundle exec rubocop 44 45 test: # our next job, called "test" 46 # we run "parallel job containers" to enable speeding up our tests; 47 # this splits our tests across multiple containers. 48 # parallelism: 3 49 # here we set TWO docker images. 50 docker: 51 - image: cimg/ruby:2.6.6-node # this is our primary docker image, where step commands run. 52 - image: circleci/postgres:9.5-alpine 53 environment: # add POSTGRES environment variables. 54 POSTGRES_USER: postgres 55 POSTGRES_DB: rails_blog_test 56 POSTGRES_PASSWORD: password 57 # environment variables specific to Ruby/Rails, applied to the primary container. 58 environment: 59 BUNDLE_JOBS: '3' 60 BUNDLE_RETRY: '3' 61 PGHOST: 127.0.0.1 62 PGUSER: postgres 63 PGPASSWORD: password 64 RAILS_ENV: test 65 # A series of steps to run, some are similar to those in "build". 66 steps: 67 - checkout 68 - ruby/install-deps 69 - node/install-packages: 70 pkg-manager: yarn 71 cache-key: 'yarn.lock' 72 # Here we make sure that the secondary container boots 73 # up before we run operations on the database. 74 - run: 75 name: Wait for DB 76 command: dockerize -wait tcp://localhost:5432 -timeout 1m 77 - run: 78 name: Database setup 79 command: | 80 bundle exec rails db:create 81 bundle exec rails db:schema:load --trace 82 # Run rspec in parallel 83 - ruby/rspec-test 84 85# We use workflows to orchestrate the jobs that we declared above. 86workflows: 87 version: 2 88 build_and_test: # The name of our workflow is "build_and_test" 89 jobs: # The list of jobs we run as part of this workflow. 90 - build # Run build first. 91 - rubocop: 92 requires: 93 - build 94 - test: # Then run test, 95 requires: # Test requires that build passes for it to run. 96 - build # Finally, run the build job. 97

config/database.yml

yml

1default: &default 2 adapter: postgresql 3 encoding: unicode 4 host: db 5 username: postgres 6 password: password 7 pool: 5 8 9development: 10 <<: *default 11 database: book_manager_development 12 13test: 14 <<: *default 15 database: book_manager_test 16

Dockerfile

1FROM ruby:2.6 2 3RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ 4 && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list 5 6RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarn 7 8RUN mkdir /book_manager 9WORKDIR /book_manager 10COPY Gemfile /book_manager/Gemfile 11COPY Gemfile.lock /book_manager/Gemfile.lock 12RUN bundle install 13COPY . /book_manager 14 15# Add a script to be executed every time the container starts. 16COPY entrypoint.sh /usr/bin/ 17RUN chmod +x /usr/bin/entrypoint.sh 18ENTRYPOINT ["entrypoint.sh"] 19EXPOSE 3000 20 21# Start the main process. 22CMD ["rails", "server", "-b", "0.0.0.0"] 23

docker-compose.yml

yml

1version: '3' 2services: 3 web: 4 build: . 5 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 6 volumes: 7 - .:/book_manager 8 ports: 9 - '3000:3000' 10 depends_on: 11 - db 12 db: 13 image: postgres 14 volumes: 15 - ./tmp/db:/var/lib/postgresql/data 16 environment: 17 - POSTGRES_PASSWORD=password 18 ports: 19 - '5432:5432'

試したこと

database.ymlを

yml

1test: 2 <<: *default 3 database: book_manager_test 4 host: localhost

のようにhost: localhostを追加するとCI側では正しくテストが走るようになりましたが、
この状態で手元でRSpecを実行すると以下のエラーが出ます。

PG::ConnectionBad: could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432? could not connect to server: Cannot assign requested address Is the server running on host "localhost" (::1) and accepting TCP/IP connections on port 5432?

補足情報(FW/ツールのバージョンなど)

Ruby 2.6.6
Rails 6.0.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

おそらくローカル環境でもDockerを使用されていますよね
"db"はおそらくそのホスト名だと思います
ローカル環境でtestするにはhost: dbに(docker-compose.ymlの設定に依存)
CI環境ではhost: localhost(.circleci/config.ymlの設定に依存)
にそれぞれ接続する必要があるためにこのようなトレードオフが生じていると思われます

database.yml

test: <<: *default database: book_manager_test host: <%= ENV['PGHOST'] || 'db' %>

として、CircleCI環境上でのみ
環境変数PGHOSTにlocalhostを定義することで
CircleCI上 -> localhost
ローカル環境 -> db(PGHOSTが定義されていないので)
と使い分けが可能です

よければご参考に
DockerでRailsチュートリアルのローカル開発環境構築 - RSpec導入 & CircleCIでHerokuデプロイ- - Qiita

投稿2020/08/20 17:04

naokit-dev

総合スコア424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こちらにあるようにdatabase.yml中のhostにlocalhostではなくデータベースのコンテナ名(bataconさんの例でも)dbを指定してみてはいかがでしょうか?

投稿2020/08/20 16:12

mfunaki

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問