前人未踏の領域へ WEB・インフラ・プログラミング全般編

フロントエンド、バックエンド、インフラ、言語など、アプリ開発、IOT以外の記録

CircleCI 2.0 セットアップはまり道

この記事について

Rails + MySQLなプロジェクトをCircleCI上で動作させようとした際に遭遇したエラーの対応メモ。随時加筆、修正。
都度必要な設定しか記載してないのでまるごとコピって使うようなことはできません。
CicleCIのconfig.ymlは2.1が最新なのだけど、現時点でCLIが対応していないらしいので2.0にて対応。

RailsのMASTER KEYが見つからない

Missing encryption key to decrypt file with. Ask your team for your master key and write it to /home/circleci/project/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].

対応

パラメータで渡してあげる。キーは新たに生成しても、development環境と同じでも良いかと思う。

# .circleci/config.yml
jobs: 
  build: 
    docker: 
      - image: circleci/ruby:2.6.5
        environment:
          RAILS_ENV: test
          RAILS_MASTER_KEY: b4d624125c4cb11b2391cf0015cdxxxx

タイムゾーンが異なってテストが通らない

対応

環境変数 TZ をセット。ディストリビューションによってはTZは使えないこともあるらしい

Dockerコンテナのタイムゾーン変更方法 - Qiita

# .circleci/config.yml
jobs: 
  build: 
    docker: 
      - image: circleci/ruby:2.6.5
        environment:
          RAILS_ENV: test
          TZ: Asia/Tokyo
      - image: circleci/mysql:8.0.18 
        environment:
          TZ: Asia/Tokyo

MySQL接続エラー

Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock'

原因

MySQLに対して localhost で接続しようとしている。Docker間ではTCPで接続するために 127.0.0.1 とするのが正解。以下のサイトが詳しい

ローカルポートのmysqlに対してTCPで接続する - Qiita

対応

database.yml をhostを 127.0.0.1 にするか、環境変数 DB_HOST を受け取るようにする

# config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  host: <%= ENV['DB_HOST'] %>

環境変数にした場合は DB_HOSTconfig.yml ででセットする

# .circleci/config.yml
jobs: 
  build: 
    docker: 
      - image: circleci/ruby:2.6.5
        environment:
          RAILS_ENV: test
          DB_HOST: "127.0.0.1"

rspec_junit_formatter が見つからない

cannot load such file -- rspec_junit_formatter
# Gemfile
group :test do
  gem "rspec"
  gem "rspec_junit_formatter"
end
$ bundle install

SSHで踏み台経由のログインができない

こちらを参考に対応する。procycommandに踏み台へのアクセス情報どうやって書くんだろうと思っていたけど configファイルをDcokerに持たせるという方法があったか。

kojirooooocks.hatenablog.com

参考

/* Responsive: yes */