はじめに
CircleCI実行時にRubocopを実行させようとした時に、発生したエラーとその対処方法について、メモしておきます。
実行環境
ruby 3.0.2
rails 6.1.4
rubocop 1.24.1
circleci version 2.1
発生したエラー
.config.yml
を以下のように記述し、CIを実行しようとしたところ、rubocopを実行する部分でエラーが発生しました。
config.yml
version: 2.1
orbs:
ruby: circleci/ruby@1.4.0
jobs:
build:
docker:
- image: cimg/ruby:3.0.2
working_directory: ~/appname_backend
steps:
- checkout:
path: ~/appname_backend
- ruby/install-deps
test:
docker:
- image: cimg/ruby:3.0.2
- image: cimg/mysql:8.0.27
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: appname_test
MYSQL_USER: user
environment:
BUNDLE_JOBS: "3"
BUNDLE_RETRY: "3"
APP_DATABASE_HOST: "127.0.0.1"
RAILS_ENV: test
working_directory: ~/appname_backend
steps:
- checkout:
path: ~/appname_backend
- ruby/install-deps
- run:
name: Wait for DB
command: sleep 30
- run:
name: Database setup
command: bundle exec rails db:create db:migrate
- run:
name: rubocop
command: bundle exec rubocop
- run:
name: test
command: bundle exec rspec
workflows:
version: 2
build_and_test:
jobs:
- build
- test:
requires:
- build
発生したエラー
Unable to find gem rubocop-discourse; is the gem installed? Gem::MissingSpecError
/home/circleci/appname_backend/vendor/bundle/ruby/3.0.0/gems/rubocop-1.24.1/lib/rubocop/config_loader_resolver.rb:278:in `rescue in gem_config_path'
/home/circleci/appname_backend/vendor/bundle/ruby/3.0.0/gems/rubocop-1.24.1/lib/rubocop/config_loader_resolver.rb:268:in `gem_config_path'
/home/circleci/appname_backend/vendor/bundle/ruby/3.0.0/gems/rubocop-1.24.1/lib/rubocop/config_loader_resolver.rb:69:in `block (2 levels) in resolve_inheritance_from_gems'
/home/circleci/appname_backend/vendor/bundle/ruby/3.0.0/gems/rubocop-1.24.1/lib/rubocop/config_loader_resolver.rb:67:in `reverse_each'
・
・
・
/home/circleci/.rubygems/bin/bundle:23:in `load'
/home/circleci/.rubygems/bin/bundle:23:in `<main>'
Exited with code exit status 2
解決方法
.rubocop.yml
に以下を追記する
rubocop.yml
AllCops:
Exclude:
- 'vendor/**/*'
なぜこの記述がないとエラーになるのか
CircleCIでは、bundle installしたgemsをvendor/bundle配下にロードしているようです。
test:
steps:
- checkout:
path: ~/journey_backend
- ruby/install-deps
↑ このコマンド中にbundle installを実行している
このため、rubocopがvendor配下のgemsたちまでチェックしてしていたようです。
そこで、.rubocop.yml
にvendorディレクトリ以下をrubocopの対象から外す記述をすればエラーがなくなるというわけですね。
以上、どなたかの参考になれば幸いです。