👋

RailsでGitHubActions(CI)を導入してみた

2024/06/17に公開

GitHubActionsとは

GitHubによるCI/CD(継続的インテグレーションおよび継続的デリバリー)サービスです。
これを使うと、コードのビルド、テスト、デプロイなどを自動化できます。

導入メリット

新しくブランチを切って作業する時、rubocop と RSpec は通った状態でマージするのがいいですよね。
どちらも手動で実行するのですが、実行漏れがあってそのまま commit, push、PR作成まですると、
漏れに気づかずマージしてしまうと、エラー時に、どの段階でエラーが出たのか、わからなくなります。

CI を導入することで、これらの作業を自動で実行してくれて、問題があったら教えてくれる

こちらも参考にしてみてください。

https://qiita.com/Hashimoto-Noriaki/items/4a30f06be4fd3c5a4956

できること

調べてみたら以下のことができるみたいです。

1.自動テスト
誰かが新しいコードを追加すると、すぐにそのコードが動くかどうか自動的に確認するテストが実行します。

2.コードチェック
新しいコードが読みやすいか、エラーがないかなどを自動的にチェックします。

3.通知
問題が見つかったら、チームのメンバーに自動的に通知を送ります。

注意

RailsでCIを導入する際に、参考にしてもらって構わないです。
ただ丸コピはおすすめしません。プロジェクトやアプリなどによって変わってくるので、
ご自身で考えて構築してください。

導入方法

1.github-action.ymlの作成

Railsのプロジェクト内に、.github/workflowsのディレクトを作成し、
その中にサービス名.ymlを作成します。自分の場合は、rails_netflix_appにしました。

GitHub Actionsを使ってRailsプロジェクトの継続的インテグレーション(CI)を設定するためのもので、
コードの変更がdevelopmentブランチにプッシュされたとき、またはそのブランチに対するPRが作成されたときに
トリガーされます。

name: Rails CI

on:
  push:
    branches:
      - development
  pull_request:
    branches:
      - development

jobs:
  build:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:12
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: rails_netflix_app_test

    env:
      RAILS_ENV: test
    
    steps:
      - name: Git checkout
        uses: actions/checkout@v2

      - name: Setup Ruby 3.1.3
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.1.3

      - name: Setup bundler
        run: gem install bundler

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

      - name: Install gems
        run: bundle install --path vendor/bundle --jobs 4

      - name: Setup Database
        run: |
          cp -v config/database.yml.ci config/database.yml
          bundle exec rails db:create
          bundle exec rails db:schema:load
        env:
          RAILS_ENV: test
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres

      - name: Run tests
        run: bundle exec rspec
      - name: RuboCop
        run: bundle exec rubocop

1の解説

  • name: Rails CI
    ワークフローの名前で、GitHub Actionsのインターフェース上で表示。

  • on
    ワークフローのトリガー条件を定義。

  • push:

  • branches: developmentブランチにプッシュされたときにワークフローを実行。

  • pull_request:

  • branches: developmentブランチに対するプルリクエストが作成されたときにワークフローを実行。

  • jobs
    このセクションは、ワークフローの各ジョブを定義。ここではbuildというジョブを設定しています。

  • runs-on: ubuntu-latest
    このジョブが実行される環境を指定します。ubuntu-latestは最新のUbuntu環境を意味。

  • services
    このセクションでは、テスト用のサービス(データベースなど)を定義します。

  • postgres:
    PostgreSQLデータベースサービスを設定しています。

  • image:
    使用するPostgreSQLのDockerイメージ。

  • ports:
    コンテナのポート設定。

  • env:
    データベースの環境変数(ユーザー名、パスワード、データベース名)。

  • env
    全体のジョブに適用される環境変数を設定します。ここでは、Railsの環境をtestに設定しています。

  • steps
    このジョブで実行される具体的なステップを定義します。

  • Git checkout
    コードをチェックアウトします。

  • uses: actions/checkout@v2
    GitHub Actionsの公式アクションを使用。

  • Setup Ruby 3.1.3
    Rubyの設定をします。

  • uses: ruby/setup-ruby@v1
    Rubyのバージョンを3.1.3に設定します。

  • Setup bundler
    Bundlerをインストールします。

  • run: gem install bundler
    で実行されます。

  • Cache gems
    依存関係のインストールを高速化するため、gemをキャッシュします。

  • actions/cache@v2
    vendor/bundleディレクトリをキャッシュします。

  • Install gems
    依存関係(gem)をインストールします。

  • run: bundle install --path vendor/bundle --jobs 4

  • Setup Database
    データベースの設定を行います。
    congig/database.yml.ciファイルをconfig/database.ymlにコピーし、データベースを作成してスキーマをロードします。

  • Run tests
    テストを実行します。

  • run: bundle exec rspec
    RSpecのテストスイートを実行。

  • RuboCop
    コードスタイルのチェックを行います。

  • run: bundle exec rubocop
    RuboCopを実行。

2.config配下にdatabase.yml.ci作成

CIで使うテスト用のDBの設定ファイルを追加します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: localhost
  username: postgres
  password: postgres
  pool: 5

test:
  <<: *default
  database: rails_netflix_app_test_ci

これらをコミットし、GitHubにプッシュしプルリクエストを作成したら起動します。
自分の場合は、最初はdevelopmentブランチにpushし、masterブランチ反映前に起動しました。

成功、起動中、失敗の画面

動作中はこんな感じの画面です。

スクリーンショット 2024-06-15 3.35.08.png

こんな感じの画面になると成功です。

スクリーンショット 2024-06-15 3.12.23.png

失敗の画面はこんな感じです。
テストがうまくいかない時は、GitHub Actionsの実行欄に***赤い「×」***がつきます。
その際には、実行欄の横の「Details」をクリックすると、失敗したGitHub Actionsの内容を見れます。
特に自分はSetUpDataBaseのDB関連で苦戦しました。😅

スクリーンショット 2024-06-17 0.11.18.png

スクリーンショット 2024-06-17 0.11.31.png

引用  https://zenn.dev/ryouzi/articles/cd6857c08e60e7

RuboCopのエラーの対処

bundle exec rubocop -a

で対処しました。

credentialsを扱う場合

以下の記事を参考資料で記載されていたので載せておきます。

https://dev.to/vvo/a-rails-and-postgresql-setup-for-github-actions-ci-nc8

GitHubアカウント

こちらを参考にしてみてください。

https://github.com/Hashimoto-Noriaki/rails_netflix_app/pull/22

公式ドキュメント

https://docs.github.com/ja/actions

参考資料

ChatGPT

https://qiita.com/tomtang/items/bb56e206d757dca1ac8b#github-actionsとは

https://zenn.dev/ryouzi/articles/cd6857c08e60e7

Discussion