概要
Github Actions
を利用してCIを自動化するための手順をまとめました。
リポジトリのコードをチェックアウトし、指定されたRubyバージョンをセットアップします。その後、依存関係のインストール、データベースのセットアップ、RSpecによる単体テストを実行します。
環境
Ruby 3.1
Rails7
MySQL 8.0
config/database.yml.ci 作成
GitHub Actions で Rspec が実行される際に参照されるデータベースの定義ファイルです。
後述のワークフロー内で、config/database.yml.ci → config/database.yml
に上書きコピーします
password
:テストで一時的に起動されるDBコンテナなので、セキュリティは気にしなくて大丈夫です。
host
: 127.0.0.1 localhost指定だと、ワークフローの処理でDB接続エラーになるため
ワークフローファイルの作成
先ほど作成したワークフローを以下のように変更します。
name: Build and CI
on:
push:
branches: [test]
jobs:
setup_and_test_execution:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_ROOT_HOST: '%'
ports:
- 3306:3306
options: --health-cmd "mysqladmin ping -h 127.0.0.1" --health-interval 20s --health-timeout 10s --health-retries 10
# GitHub Actionsでサポートしているruby versionは2.6以降
steps:
- name: Checkout from Repository
uses: actions/checkout@v2
- name: Setup Ruby version
uses: actions/setup-ruby@v1
with:
ruby-version: 3.1.x
- name: bundle install
run: |
bundle install --jobs 4 --retry 3
- name: Setup Database
env:
RAILS_ENV: test
run: |
cp config/database.yml.ci config/database.yml
#./bin/railsは権限エラーになる
#./bin/rails db:create
#./bin/rails db:migrate
bundle exec rake db:create
bundle exec rake db:migrate
# 単体テスト
- name: Run RSpec
run: bundle exec rspec
env:
RAILS_ENV: test
runs-on: ubuntu-latest
GitHub Actionsのホストされている仮想環境で、ubuntu最新バージョン
を利用する。
Dockerfileで指定している ruby:3.1 が debian:11ベース
なので、debian:11を指定したいですが、それだと実行時にエラーになるので、、、
services:
GitHub Actionsにおいて、ワークフローの実行環境を定義する方法として、主に2つのアプローチがあります。
ランナーマシン
(Runner Machine): ワークフローが実行されるホストマシンを指定します。例えば、runs-on: ubuntu-latest のように指定することで、Ubuntu環境での実行が行われます。この場合、ワークフロー内の各ステップは指定したランナーマシン上で実行されます。必要に応じてランナーマシン上で必要なソフトウェアやツールをインストールすることができます。
サービスコンテナ
(Service Container): ワークフロー内で必要なサービスやアプリケーションをコンテナとして実行します。例えば、データベースサービスやキャッシュサービスなど、アプリケーションが依存する外部サービスなど。services セクションを使用して、イメージを指定し、必要な環境変数やポートマッピングを設定することができます。サービスコンテナは、ワークフローのステップからアクセス可能であり、アプリケーションとの相互作用が可能です。※MySQLの部分
MYSQL_ROOT_PASSWORD
database.yml.ci で設定したパスワード
MYSQL_ROOT_HOST
mysqlに外部から接続できるように
options
コンテナのヘルスチェックを定義しておく。この指定がないと、コンテナの準備ができる前にワークフローが進行して、接続エラーになる時がある。
ports
ポートマッピングを指定する。 docker-compose.yml の書き方と同じ。
各ステップの説明
Checkout from Repository
actions/checkout@v2
アクションを使用して、リポジトリの最新のコードをチェックアウト。
Setup Ruby version
actions/setup-ruby@v1
アクションを使用して、指定されたRubyバージョン(3.1.x)をセットアップ。
bundle install
bundle install
コマンドを実行して、Gemfileに指定された依存関係をインストール。
--jobs 4 --retry 3オプションは、並列で4つのジョブを使用して依存関係のインストールを試み、最大3回の再試行を行う。
Setup Database
環境変数 RAILS_ENV を test に設定。
config/database.yml.ci → config/database.yml
にコピー。
テスト用のデータベースの作成とマイグレーション。
Run RSpec
bundle exec rspec
コマンドを実行して、RSpec による単体テストを実行。
RAILS_ENV を test に設定して、テスト環境で実行されるようにする。