年代物の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
キャッシュのエラー
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