Rails 8.1でのRuboCop関連のアップデート

Rails 8.1.0がリリースされました。ハイライトはリリース記事を読むと良いです。

rubyonrails.org

ここで取り上げるのは、Rails 8.1.0 で更新された GitHub Actions 向けに生成される RuboCop 実行ワークフローのテンプレートについての小ネタです。

github.com

以下の設定は、この PR で更新された bin/rails new におけるテンプレートを元にした差分のサンプルです。ファイルとしては .github/workflows/ci.yml に相当します。

   lint:
     runs-on: ubuntu-latest
+    env:
+      RUBY_VERSION: <%= ENV["RBENV_VERSION"] || ENV["rvm_ruby_string"] || "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}" %>
+      RUBOCOP_CACHE_ROOT: tmp/rubocop
     steps:
       - name: Checkout code
         uses: actions/checkout@v5

       - name: Set up Ruby
         uses: ruby/setup-ruby@v1
         with:
-          ruby-version: <%= ENV["RBENV_VERSION"] || ENV["rvm_ruby_string"] || "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}" %>
+          ruby-version: ${{ env.RUBY_VERSION }}
           bundler-cache: true

+      - name: Prepare RuboCop cache
+        uses: actions/cache@v4
+        env:
+          DEPENDENCIES_HASH: ${{ hashFiles('.ruby-version', '**/.rubocop.yml', '**/.rubocop_todo.yml', 'Gemfile.lock' )}}
+        with:
+          path: ${{ env.RUBOCOP_CACHE_ROOT }}
+          key: rubocop-${{ runner.os }}-${{ env.RUBY_VERSION }}-${{ env.DEPENDENCIES_HASH }}-${{ github.ref_name == github.event.repository.default_branch && github.run_id || 'default' }}
+          restore-keys: |
+            rubocop-${{ runner.os }}-${{ env.RUBY_VERSION }}-${{ env.DEPENDENCIES_HASH }}-

       - name: Lint code for consistent style
         run: bin/rubocop -f github

この設定は RuboCop 実行においてキャッシュ利用での高速化を狙った更新です。コードベースの大きさによりますが、この PR を開いた人のアプリケーションでは 8 分掛かっていたものが 40 秒に短縮されたとのこと。bin/rails app:update で更新されるものではないので、既存コードに対する適用への関心があれば手動で行うことになります。

詳しくは PR を参照して導入を検討してみてください。ちょっと読むの面倒だなあという人は、Rails 8.1 と同日に OpenAI からリリースされた AI ブラウザーである ChatGPT Atlas なんか使って PR のサマリーなどプロンプティングしても面白いかもしれません。

それではハックを続けましょう。