🌊

RailsにGitHub Actionsの導入(Rspec, Rubocop)

2022/01/20に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

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の内容は以下のように記述します。

.github/workflows/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が実行される際に参照される、データベースの定義ファイルになります。

config/database.yml.ci
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を扱う際の対処方法

こちらの記事が参考になるかと思います。
https://dev.to/vvo/a-rails-and-postgresql-setup-for-github-actions-ci-nc8

github-action.ymlの内容

ファイルに記載されている詳細を説明します。(公式ドキュメントは こちら

name: はワークフローの名前になります。

on: はこのGitHub Actionsをいつ動かすのかを設定するものになります。本ファイルではプッシュ時とプルリクエスト作成時になります。

jobs: は実行するジョブになります。本記事のようにに複数指定することで、各ジョブを並列で実行することができます。並列で実行することができると、すべてのジョブが終わるまでの時間を短縮することができます。

services:こちらの記事が詳しかったので参照してください。

GitHub ActionsのワークフローでDBに接続してテストを行うには、GitHub Actionsのサービスコンテナを使います。このサービスコンテナの正体はDockerコンテナでDocker Hubのイメージを指定し、作成します。

steps: どのようなステップでジョブを実行していくのかを記載します。記述通りのことをやっているので、説明は省きます。

Discussion