既存コードに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するという流れになった。