【CircleCI×Rails】ローカルでrspec実行しながらエラーを潰す過程

年代物のRails案件(6年目!)に初めてrspecを導入してCI回すという過酷なプロジェクトの過程です。

現状とゴール

6年目のRails案件だけど活発に機能追加していてコードが複雑化、肥大化している
怖くてRailsやRubyのバージョンアップできない
rspecは最近ようやく書き始めたがCI環境がないためあまり活用できていない

rspecちゃんと作ってCI回して機能追加に強くバージョンアップも容易にしたい!

まずはCircleCIを学ぶ

こちらの記事がとても参考になりました。
いまさらだけどCircleCIに入門したので分かりやすくまとめてみた – Qiita

rspecの実行に必要な環境はすべて用意されていて、config.ymlとかいう設定ファイルを書くだけで良いようです。
※このとき簡単そうと思ったのは間違いでした…。

ローカルでCircleCI

ローカルでconfig.ymlのデバッグができるようです。
以下を参考に、ローカルにCircleCI CLIをインストールしました。
CircleCI ローカルでCircleCIを使いたい
CircleCI のローカル CLI の使用 – CircleCI

config.yml

まずは最少設定で…。

jobs:
  rspec:
    docker:
      - image: cimg/ruby:2.4
    steps:
      - checkout

実行方法
circleci local execute --job rspec

dockerにもハマったのですが、なんとかイメージが起動してソースコードのチェックアウトが動くことが確認できました。

少しずつトライアンドエラーしながら必要な設定をしていきましたが、年代物のプロジェクトなので、謎なgemや依存しているライブラリが多くて非常に苦労しました…。現状ここまで。

jobs:
  rspec:
    docker:
      - image: cimg/ruby:2.4
      - image: cimg/mysql:5.7
        environment:
          MYSQL_ROOT_HOST: '%'
          MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
    environment:
      RAILS_ENV: rspec
      MECAB_PATH: /usr/bin/mecab
    steps:
      - run:
          name: apt install
          command: |
            sudo apt update
            sudo apt install libmysqlclient-dev
            sudo apt install mecab
            sudo apt install tzdata
            sudo apt install pkg-config
            sudo apt install libmagickcore-dev
            sudo apt install imagemagick
      - checkout
      - restore_cache:
          keys:
            - dependencies-{{ checksum "Gemfile.lock" }}
      - run:
          name: install dependencies
          command: |
            gem install bundler -v 2.0.2
            bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          key: dependencies-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle
      - run:
          name: run rspec
          command: bundle exec rspec spec

この状態だとmigrationを実行していませんのでテストはパスしませんが、rspecの起動まで到達できました(すでに疲弊)

言語ガイド: Ruby – CircleCI
データベースの設定例 – CircleCI
依存関係のキャッシュ – CircleCI
【CircleCI】Bundle installの結果をキャッシュしてCIを高速化した – 紙一重の積み重ね
CircleCI Local CLI で Cannot find a job named xxxx to run in the jobs: section of your configuration file. – memo.log

発生したエラー

mysql2でエラー

mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or
'yum install mysql-devel', and try again.
An error occurred while installing mysql2 (0.4.9), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.4.9' --source 'https://rubygems.org/'`
succeeds before bundling.

mysql clientがない!?
cimg/mysql:5.7イメージに含まれていると思いますが、なぜかないと言われます。
以下を追加すると解決できました。
sudo apt install libmysqlclient-dev

CircleCIでのみbundle installが失敗する(mysql2)

mecabのエラー

LoadError:
  Please set MECAB_PATH to the full path to libmecab.so

MECAB_PATHを設定しろというメッセージですが、そもそもmecabをインストールしていないことに気づき、以下を追加。
sudo apt install mecab
再実行するも、同様のエラーです。
libmecab.soとかいうのがmecabの実行ファイル?これがどこかにあるはずで、場所を調べてMECAB_PATHを設定すれば良さそうです。ただ、circleCIのイメージの中をログインして探し回ることってできるのでしょうか。私にはやり方がわからなかったので、config.ymlに以下を追加してログから調査することにしました。
dpkg -L mecab
※遠回りな気がしますね…もっと良い方法教えて下さい。

この方法でmecabの場所が判明しましたので以下を追加。
MECAB_PATH: /usr/bin/mecab

デプロイ時にrubyのmecabでエラーが発生します。

キャッシュのエラー

Skipping cache - error checking storage: not supported
これはcircleciのローカル実行だと必ず起こるようです。ローカルではキャッシュの確認はできないようです。

tzinfoのエラー

TZInfo::DataSourceNotFound: tzinfo-data is not present
これは、タイムゾーンを扱うためのソフトウェアなんでしょうか…tzinfo-dataというgemもなんなのかわかりませんが、とにかく通さないといけません。
sudo apt install tzdataを追加して解決できました。

Deviseのエラー

Devise.secret_key was not set. Please add the following to your Devise initializer
config/secrets.ymlにsecret_key_baseを定義していなかったため。ログに出力されたキーをそのまま設定して解決できました。
【Rails】Capistranoでデプロイするとき「Devise.secret_key was not set. Please add the following to your Devise initializer:」が発生する – FujiYasuの日記

rmagickのエラー

最初のエラー
ERROR: Can't install RMagick 4.1.2. Can't find pkg-config in Version: ImageMagick 6.9.7-4 Q16 x86_64

config.ymlにsudo apt install pkg-configを追加して再実行。

別のエラーになりました。

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/circleci/project/vendor/bundle/ruby/2.4.0/gems/rmagick-4.1.2/ext/RMagick
/usr/local/bin/ruby -I /usr/local/lib/ruby/site_ruby/2.4.0 -r
./siteconf20220531-1431-n8v9fa.rb extconf.rb
checking for brew... no
checking for pacman... no
checking for Ruby version >= 2.3.0... yes
checking for pkg-config... yes
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found


ERROR: Can't install RMagick 4.1.2.
Can't find the ImageMagick library or one of the dependent libraries.
Check the mkmf.log file for more detailed information.

PKG_CONFIG_PATHを設定すればよいのか?と思って試したのですが効かず。
結局、sudo apt install libmagickcore-devを追加して解決。(これなにかわかってません…)

gem install rmagickで失敗する。 – Qiita
Can’t find the ImageMagick library or one of the dependent libraries · Issue #76 · CircleCI-Public/cimg-ruby · GitHub

タイトルとURLをコピーしました