Programming Journal

学習したことの整理用です。

CI環境と開発環境でDBパスワードが異なる場合

CI上のパスワードは空でOK, 開発環境上はcredentialでパスワードを設定しています。

以前は開発環境だけで読み込めるようにgem 'dotenv-rails'を使用してパスワードを設定し、Github上にはそのパスワード環境変数をpushしないことでCI上にはパスワードが空になるようにしていました。
酷い力技だったので、わかりやすいように修正しました。

jobs:
  build:
    docker:
      - image: circleci/ruby:2.7.2-node-browsers-legacy
        environment:
          - BUNDLER_VERSION: 2.1.4
          - RAILS_ENV: 'test'
          - DB_HOST: 127.0.0.1
          - LANG: 'ja_JP.UTF-8'
          - TZ: "Japan"
      - image: circleci/mysql:5.7
        environment:
          - MYSQL_ALLOW_EMPTY_PASSWORD: 'true'  # ここ
          - MYSQL_USER: root
          - MYSQL_DB: ci_test
# 略

test:
  <<: *default
  database: ci_test
  host: <%=ENV['DB_HOST'] || '127.0.0.1' %>
  password: <%= Rails.application.credentials.development[:password] %> ##ここ

対処法

database.yml.ciを用意

# 略

test:
  <<: *default
  database: ci_test
  host: <%=ENV['DB_HOST'] || '127.0.0.1' %>
  password: "" #空にする

本来使用するdatabase.ymlからdatabase.yml.ciを入れ替え

      # DBのセットアップ
      - run:
          name: Database Setup
          command: |
            rm ./config/database.yml # ここ
            mv ./config/database.yml.ci ./config/database.yml # ここ
            bundle exec rake db:create
            bundle exec rake db:schema:load

参考

CircleCIを使ってみた(RailsのRSpecとデプロイのサンプル) | RE:ENGINES