LoginSignup
2
1

More than 1 year has passed since last update.

【GithubAction】Rails + MySQL で CI を構築する

Last updated at Posted at 2023-06-10

概要

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コンテナなので、セキュリティは気にしなくて大丈夫です。
host127.0.0.1 localhost指定だと、ワークフローの処理でDB接続エラーになるため
image.png

ワークフローファイルの作成

テンプレートの選択はなんでも大丈夫です。
image.png

先ほど作成したワークフローを以下のように変更します。

.yml
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 に設定して、テスト環境で実行されるようにする。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1