本記事は、先日投稿したNuxtアプリをGitHub ActionsでGAE環境にデプロイするのRailsアプリ版です
やりたいこと
- GitHub Actions上で「RuboCop/ESLint」のチェックを実行する
- 上記の実行結果をSlackに通知する
- ワークフローの高速化のために
bundle install
とyarn install
の結果をキャッシュする
対応内容
以下の設定で実現できました
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.
公式のマーケットプレイスを利用する選択肢
GitHubの公式マーケットプレイスには、お手軽にRuboCop/ESLintでエラーと警告のチェックが実現できる仕組みが用意されています。
本当はこれを利用したかったのですが、以下のエラーが発生し解決することができませんでした...
※ ESLintも同じようなDockerのエラーが発生
そのため、今まで手動で実行していたRubocop/eslintコマンドをGitHub Actionsにそのまま移植して実行する方法を採用しました