未分類

【初心者・最低限の設定】PostgresqlでCircleCiを使ってRspecをテストする方法

初めてCircleCiを動かす人向けの記事になります。
・Postgresql9.6
・ruby 2.6.3
・githubのmasterブランチにpushすればrspecを回してくれる設定です。
・自動でデプロイする昨日は今回はつけていません。

 

※本番環境への自動デプロイはgithubのmasterブランチにpushしてrspecを動かせるようになってからの設定をおすすめします。

 

config.ymlの設定はCircleCiの公式設定をそのままパクっています。

###まずは公式HPの設定をそのままconfig.ymlに貼り付けてから下記を参考にすると、エラーが少なく設定できると思います。

https://circleci.com/docs/ja/2.0/postgres-config/

config.yml

version: 2
jobs:
   build:
      docker:
        #アプリのバージョンを指定
        - image: circleci/ruby:2.6.3-node
          environment:
            #自身の登録しているユーザに変える。
            POSTGRES_USER: postgres 
            PGHOST: 127.0.0.1
            RAILS_ENV: test
        #使ってるデータベースとバージョンを指定する。# 「host: localhost」でアクセスできるサービスコンテナイメージ。
        - image: circleci/postgres:9.6
          environment:
            #それぞれ設定
            POSTGRES_USER: postgres
            #下記を書けばパスワードなしでデータベースにログインしてくれる。 
            POSTGRES_HOST_AUTH_METHOD: trust
            POSTGRES_DB: portfolio_test
      #自身のアプリ名にする
      working_directory: ~/Portfolio
      steps:
        - checkout
        #bundle キャッシュをリストアする。公式の設定通り。
        - restore_cache:
            keys:
              - v1-dependencies-{{ checksum "Gemfile.lock" }}
              - v1-dependencies-
        # bundle install で依存関係をインストールする。公式の設定と多少異なってます。
        - run:
            name: install dependencies
            command: |
              gem install bundler -v 2.1.4
              bundle install --jobs=4 --retry=3 --path vendor/bundle

        # bundle キャッシュを保存する。公式の設定通り。
        - save_cache:
            key: v1-dependencies-{{ checksum "Gemfile.lock" }}
            paths:
              - ./vendor/bundle
              
        #↓追加する
        - run:
            name: DBの起動を待つ
            command: dockerize -wait tcp://127.0.0.1:5432 -timeout 120s
        
        - run: bundle exec rake db:create
        - run: bundle exec rake db:schema:load
        
        # rspecを実行する
        - run:
            name: rspecを実行
            command: bundle exec rspec

 

この状態でgithubに

 

$ git add -A

$ git commit -m"CI"

$ git push origin master

 

をすれば動きます。

##遭遇したエラー
###

以下のエラー。

 

server started
psql: could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?
LOG: received SIGHUP, reloading configuration files
LOG: parameter "listen_addresses" cannot be changed without restarting the server
LOG: configuration file "/var/lib/postgresql/data/postgresql.conf" contains errors; unaffected changes were applied

原因はconfig.yml以下にPGHOST: 127.0.0.1を書いていなかった。

 

version: 2
jobs:
build:
docker:
#アプリのバージョンを指定
- image: circleci/ruby:2.6.3-node
environment:
POSTGRES_USER: postgres
PGHOST: 127.0.0.1
RAILS_ENV: test

 

環境変数が読み込めない

以下のエラー。

Error: Database is uninitialized and superuser password is not specified.
You must specify POSTGRES_PASSWORD to a non-empty value for the
superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".

You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
connections without a password. This is *not* recommended.

See PostgreSQL documentation about "trust":
https://www.postgresql.org/docs/current/auth-trust.html

postgresは.envの書き方で格納してしまうと読み込めません。
したがって私はユーザ名は直接記入しました。(後々調べて環境変数に格納します。)

 

ymlファイルの構文エラー

 

masterにpushした際に構文エラーが出るとだるいので一度config.ymlを書いたら下記コマンドで構文が正しいかチェックしましょう。

$ circleci config validate


###bundle install で依存関係をインストールする場所のバージョンエラー


# bundle install で依存関係をインストールする。公式の設定と多少異なってます。
- run:
name: install dependencies
command: |
gem install bundler -v 2.1.4
bundle install --jobs=4 --retry=3 --path vendor/bundle

 

 

 

CircleCiを動かすポイント

公式サイトのconfig.ymlをそのまま自身の設定にして、とりあえずmasterにpushして動かすことが一番エラーが出ないかと思われます。
エラーが出たら、circleciの画面に入りエラー文をみながら修正しましょう。
意外と親切に最低限の必要なコマンド、コメントアウトが残されているので参考にしないてはありません。