LoginSignup
8
1

More than 3 years have passed since last update.

GitHub Actionsで動かすRubocopを高速化する

Last updated at Posted at 2020-02-10

TL;DR

Rubocopはキャッシュファイルを生成し、2回目以降は差分スキャンをおこないます。GiuHub Actionsのキャッシュ機能で、キャッシュファイルを保持すると実行時間を大きく削減できます。

Rubocopのキャッシュ

Rubocopはスキャンを高速化するため、実行後にホームディレクトリの.cache以下にキャッシュファイルを生成します。ルールに変更がない場合、2回目以降のスキャンでは変更されたファイルのみ検査します。
GitHub Actionsは環境が毎回クリアされるため、GitHub Actiosのキャッシュ機能を使って、Rubocopのキャッシュファイルを流用できるようにします。

設定例(抜粋)

.github/workflows/rails.yml
    - name: Cache rubocop
      uses: actions/cache@v1
      with:
        path: ~/.cache/rubocop_cache
        key: ${{ runner.os }}-rubocop-${{ github.head_ref }}
        restore-keys: |
          ${{ runner.os }}-rubocop-
          ${{ runner.os }}-rubocop-${{ github.base_ref }}
          ${{ runner.os }}-rubocop-${{ hashFiles('**/.rubocop.yml') }}
    - name: Rubocop
      run: bundle exec rubocop --parallel

設定内容

Rubocopの前に指定します。キャッシュのキーワードを何にするかという問題がありますが、プルリクエストをトリガーに動かしているので、"ソースブランチ名">"ターゲットブランチ名">"rubocop.ymlのハッシュ"という順番で指定しています。
なるべくキャッシュを有効に使いたいところですが、キャッシュ生成時と現在のコード差分が大きくなると、結局スキャンするファイル数が増えてしまいます。
そこで、通常はソースブランチ名をキーにキャッシュし、はじめて実行するブランチの場合は、ターゲットブランチのキャッシュを使い回します。ターゲットブランチのキャッシュもない場合は、.rubocop.ymlのハッシュをキーにしたキャッシュを使います。
これにより、ブランチ単位で違うキャッシュを使って、効率的にテストできます。

--parallelオプション

本筋とは関係ありませんが、rubocopに--parallelオプションを付与すると並列実行されます。
GitHub Actionsが実行される環境は2vCPUなので速くなります。

効果

差分がないコードで実行してみました。

設定前

1分27秒かかっています
87秒.png

設定後

3秒で終わってます
3秒.png

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1