シュッと開発日記

学んだことのアウトプット。ポートフォリオ作ってます。

CircleCIのビルドにrubocopを導入する

静的コード解析ツールであるrubocopを 導入するだけなら簡単にできたので記録に残しておきたいと思います。

.rubocop.ymlの準備

# Gemfile

gem 'rubocop'

bundle install

プロジェクトのルートに.rubocop.ymlを配置

# .rubocop.yml

AllCops:
  Exclude:
    - "tmp/**/*"
    - "config/initializers/*"
    - "vendor/**/*"
    - "db/schema.rb"
    - "node_modules/**/*"
    - "db/migrate/*.rb"
    - "bin/*"
  DisplayCopNames: true
  TargetRubyVersion: 2.6.3

Rails:
  Enabled: true

Style/AndOr:
  EnforcedStyle: conditionals

Style/AsciiComments:
  Enabled: false

Style/Documentation:
  Enabled: false

Style/NumericLiterals:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

Bundler/OrderedGems:
  Enabled: false

Lint/ShadowedException:
  Enabled: false

LineLength:
  Enabled: false

Metrics/BlockLength:
  Exclude:
    - 'spec/**/*'
  Max: 40

Metrics/AbcSize:
  Enabled: true
  Max: 20

Metrics/MethodLength:
  Enabled: true
  Max: 15

ほぼほぼ、以下のサイトのかたの設定で作ってしまいました。(ありがとうございます。)

【Rails】GithubとCircleCIを連携してcommit時にrspecとrubocopを動かす

specファイルはブロックが長くなりがちなので、 Metrics/BlockLengthでひっかりまくってしまいます。 そのため、

Exclude:
    - 'spec/**/*'

でspecファイル諸々を対象から除外してしまっています。

CircleCI

あとは普通に実行するには bundle exec rubocopとすれば、 先ほど作成した.rubocop.ymlの設定に基づいて、 ファイルを自動でチェックしてくれます。

bundle exec rubocop -aでできる範囲で自動整形してくれるのが嬉しい…)

CircleCIも普通に実行するだけです。 私は、テストとrubocopのチェックを同じタイミングでするようにしてしまいました。

version: 2
jobs:
  build:
    machine:
      image: circleci/classic:edge
    steps:
      - checkout
      - run:
          name: Decode dotenv file
          command: echo ${ENV} | base64 --decode > /home/circleci/project/.env
      - restore_cache:
          keys:
            - gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
            - gem-cache-{{ arch }}-{{ .Branch }}
            - gem-cache
      - run:
          name: docker-compose build
          command: docker-compose build
      - run:
          name: bundle install
          command: docker-compose run web bundle install --jobs=4 --retry=3
      - save_cache:
          key: gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
          paths:
            - ~/.bundle
      - run:
          name: docker-compose up
          command: docker-compose up -d
      - run:
          name: install dockerize
          command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
          environment:
            DOCKERIZE_VERSION: v0.3.0
      - run:
          name: Wait for DB
          command: dockerize -wait tcp://localhost:5432 -timeout 1m
      - run:
          name: before_test: setup db
          command: docker-compose run web bin/rails db:create db:migrate
      - run:
          name: rubocop
          command: docker-compose run web bundle exec rubocop
      - run:
          name: rspec
          command: docker-compose run web bin/rspec
      - run:
          name: docker-compose down
          command: docker-compose down

今日は以上です。 (にしてもいつもこれ、キャッシュ効いてる気がしない)