既存コードにRubocopを導入

今の会社のコードにはRubocopが入っているがほとんど適用されていない状態なので インデントがめちゃくちゃだったり、シンタックスが適当だったりで可読性が低い。 LSPにもめちゃくちゃに指摘されてファイル開くとエディタの画面が真っ赤っ赤。

今から.rubocop.ymlを本格的に適用しようにもPullRequestが大量に立っているので 何も考えずやってしまうとコンフリクトは避けられない。

そこでPR内の変更ファイルに対してのみ新しいRubocopルールを適用させていけば コンフリクトもなくコードがきれいになるのではと考えた。

結果、出来上がったのが以下のコード。

# lib/tasks/rubocop.rake
# frozen_string_literal: true

require 'rubocop/rake_task'

module RubocopStrictTask
  def setup_subtasks(name, *args, &task_block)
    namespace(name) do
      desc 'PRの変更ファイルに対して走る強めのrubocop'

      task(:strict, *args) do |_, _task_args|
        RakeFileUtils.verbose(verbose) do
          options = full_options.dup

          if diff_files.empty?
            puts 'Rubocop: No Diff Files'
            exit
          end

          options.push '-c', './.rubocop_strict.yml'
          options.push(*diff_files)
          run_cli(verbose, options)
        end
      end
    end

    super
  end

  RuboCop::RakeTask.prepend self

  private

  def diff_files
    @diff_files ||= `git diff --name-only --diff-filter=ACMR origin/master..HEAD -- '*.rb'`.split
  end
end

RuboCop::RakeTask.new

.rubocop_strict.ymlに設定された新しいRubocopルールが origin/masterと差分のあるファイルのみに適用されるようになっていて、 bundle exec rake rubocop:strictで実行できる。

結果、通常のPRの運用でApproveをもらったら、origin/masterを作業ブランチへマージした後に このRakeタスクで修正してもらい再度pushするという流れになった。