RailsにGitHub Actionsの導入(Rspec, Rubocop)
株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
Rails on RailsのプロジェクトにGitHub ActionsでのCI/CDの導入を行う際の手順をまとめました。
本記事ではRspec
, Rubocop
をGitHub Actionsで実行し、テストが落ちていることやコード規約に沿っていないことをGitHub上で検知できるようにします。
※前提として、RspecやRubocopの実行に必要なGemや設定などは導入済みであるものとします。
github-action.ymlの作成
Railsプロジェクト内で.github/workflows
のディレクトを作成し、その中にgithub-action.yml
を作成します。
github-action.yml
の内容は以下のように記述します。
name: Run rspec, rubocop
on:
push:
pull_request:
jobs:
rspec:
runs-on: ubuntu-latest
timeout-minutes: 10
services:
mysql:
image: mysql:8.0
ports:
- 3306:3306
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
options: --health-cmd "mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 10
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: Cache node modules
uses: actions/cache@v2
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node-
- name: Bundler and gem install
run: |
gem install bundler
bundle install --jobs 4 --retry 3 --path vendor/bundle
- name: Yarn install
run: yarn install --check-files
- name: Database create and migrate
run: |
cp config/database.yml.ci config/database.yml
bundle exec rails db:create RAILS_ENV=test
bundle exec rails db:migrate RAILS_ENV=test
- name: Run rspec
run: bundle exec rspec
rubocop:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: Run rubocop
run: bundle exec rubocop
次にconfig/database.yml.ci
を作成します。
これはGitHub ActionsでRspecが実行される際に参照される、データベースの定義ファイルになります。
test:
adapter: mysql2
encoding: utf8
username: root
password:
host: 127.0.0.1
database: <データベース名>_test
これをコミットし、GitHubにプッシュしプルリクエストを作成すると、以下の画像のようにGitHub Actionsが自動で実行されます。
これで導入は完了です。
CIが落ちている際の対処法
テストが落ちているとGitHub Actionsの実行欄に赤い「×」がつきます。その際には、実行欄の横の「Details」をクリックすると、失敗したGitHub Actionsの内容を見ることができます。
credentialsを扱う際の対処方法
こちらの記事が参考になるかと思います。
github-action.ymlの内容
ファイルに記載されている詳細を説明します。(公式ドキュメントは こちら )
name:
はワークフローの名前になります。
on:
はこのGitHub Actionsをいつ動かすのかを設定するものになります。本ファイルではプッシュ時とプルリクエスト作成時になります。
jobs:
は実行するジョブになります。本記事のようにに複数指定することで、各ジョブを並列で実行することができます。並列で実行することができると、すべてのジョブが終わるまでの時間を短縮することができます。
services:
はこちらの記事が詳しかったので参照してください。
GitHub ActionsのワークフローでDBに接続してテストを行うには、GitHub Actionsのサービスコンテナを使います。このサービスコンテナの正体はDockerコンテナでDocker Hubのイメージを指定し、作成します。
steps:
どのようなステップでジョブを実行していくのかを記載します。記述通りのことをやっているので、説明は省きます。
Discussion