【GitHub Actions】 RailsアプリをRuboCop/ESLintチェック＋Slack通知＋キャッシュする

本記事は、先日投稿した[NuxtアプリをGitHub ActionsでGAE環境にデプロイする](https://qiita.com/curosuke/items/a8d4a6cf456160d8a3ed)の**Railsアプリ版**です

## やりたいこと
- GitHub Actions上で「RuboCop/ESLint」のチェックを実行する
- 上記の実行結果をSlackに通知する
- ワークフローの高速化のために`bundle install`と`yarn install`の結果をキャッシュする

## 対応内容
以下の設定で実現できました

```yml:.github/workflows/feature.yml
name: Rubocop & ESLint checks

on:
  push:
    branches:
      - feature/*
      - hotfix/*

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        ruby: [ '2.6.x' ]

    steps:
      - uses: actions/checkout@v1

      - name: Set up Ruby version
        uses: actions/setup-ruby@master
        with:
          ruby-version : ${{ matrix.ruby }}

      - name: apt-get
        run: |
          sudo apt-get update
          sudo apt-get install libmysqlclient-dev

      - name: Set up bundler
        run: gem install bundler

      - name: Cache gems
        uses: actions/cache@preview
        with:
          path: vendor/bundle
          key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gem-

      - name: Cache node modules
        uses: actions/cache@preview
        with:
          path: node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: bundle install
        run: bundle install --path vendor/bundle

      - name: yarn install
        run: yarn install

      - name: Rubocop checks
        run: bundle exec rubocop

      - name: ESLint checks
        run: yarn run eslint:check

      - name: Slack Notification(Failed)
        if: failure()
        uses: rtCamp/action-slack-notify@master
        env:
          SLACK_CHANNEL: github-actions
          SLACK_ICON: https://github.co.jp/assets/images/features/actions/actions-icon-actions.svg
          SLACK_MESSAGE: 'Actions Failed :-1:'
          SLACK_TITLE: 'feature/hotfix'
          SLACK_USERNAME: GitHub Actions
          SLACK_WEBHOOK: {Incoming Webhookで設定したURLを指定}
          SLACK_COLOR: '#FF0000'

```

この設定は`feature/*`と`hotfix/*`ブランチのpush時にワークフローが走りますが、これらのブランチは頻繁にpushが起きると思うのでワークフローの成功時のSlack通知は設定してません
（developにマージする前にエラーは検知したいので、失敗時は通知するようにしています）

### ハマりどころ
mysql2のgemを利用している場合、事前に`sudo apt-get install libmysqlclient-dev`でMySQLクライアントを入れておかないと`bundle install`を実行時に以下のエラーで怒られます

```
mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or
'yum install mysql-devel', and try again.
```

## 公式のマーケットプレイスを利用する選択肢
- [Rubocop checks · Actions · GitHub Marketplace](https://github.com/marketplace/actions/rubocop-checks)
- [ESLint Action · Actions · GitHub Marketplace](https://github.com/marketplace/actions/eslint-action)

GitHubの公式マーケットプレイスには、お手軽にRuboCop/ESLintでエラーと警告のチェックが実現できる仕組みが用意されています。
本当はこれを利用したかったのですが、以下のエラーが発生し解決することができませんでした...
<img width="1034" alt="スクリーンショット 2019-11-20 22.04.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165108/152eb2de-99bc-97d3-b4dc-8bfd0e4dff54.png">
※ ESLintも同じようなDockerのエラーが発生

そのため、今まで手動で実行していたRubocop/eslintコマンドをGitHub Actionsにそのまま移植して実行する方法を採用しました

## 参考
- [actions/setup-ruby: Set up your GitHub Actions workflow with a specific version of Ruby](https://github.com/actions/setup-ruby)
- [github actionsでRailsをCIして結果をslackに流す(キャッシュあり) - Qiita](https://qiita.com/ham0215/items/41a66a17190dd7c319a7)