RailsでGitHubActions(CI)を導入してみた
GitHubActionsとは
GitHubによるCI/CD(継続的インテグレーションおよび継続的デリバリー)サービスです。
これを使うと、コードのビルド、テスト、デプロイなどを自動化できます。
導入メリット
新しくブランチを切って作業する時、rubocop と RSpec は通った状態でマージするのがいいですよね。
どちらも手動で実行するのですが、実行漏れがあってそのまま commit, push、PR作成まですると、
漏れに気づかずマージしてしまうと、エラー時に、どの段階でエラーが出たのか、わからなくなります。
CI を導入することで、これらの作業を自動で実行してくれて、問題があったら教えてくれる
こちらも参考にしてみてください。
できること
調べてみたら以下のことができるみたいです。
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ブランチ反映前に起動しました。
成功、起動中、失敗の画面
動作中はこんな感じの画面です。
こんな感じの画面になると成功です。
失敗の画面はこんな感じです。
テストがうまくいかない時は、GitHub Actionsの実行欄に***赤い「×」***がつきます。
その際には、実行欄の横の「Details」をクリックすると、失敗したGitHub Actionsの内容を見れます。
特に自分はSetUpDataBaseのDB関連で苦戦しました。😅
RuboCopのエラーの対処
bundle exec rubocop -a
で対処しました。
credentialsを扱う場合
以下の記事を参考資料で記載されていたので載せておきます。
GitHubアカウント
こちらを参考にしてみてください。
公式ドキュメント
参考資料
ChatGPT
Discussion