Posted at

GitHub Action で Railsプロジェクト のCIを回す

現在パブリックベータ版が提供されているGitHub Actionで、Ruby on Railsのプロジェクトに対して継続的インテグレーションを実施する設定をしてみる。

GitHub Actionを有効にするためには、 このリンク からサインアップする必要があります。


GitHub Actionの種類


ワークフローの記述

GitHub Actionは提供当初はHCLで記述するタイプでしたが、現在はYAMLで記述するタイプになっています。

今回はYAML形式のワークフローを記述していきます。


実行環境

GitHub Actionの実行環境は共用VMでのホストモードと、その上でコンテナで稼働させるコンテナモードの2種類が存在しています。

今回はコンテナモードを使用します。

∵ ホストモードの場合、空きポートを探したり、変数で割り当てポートを探してポートを露出する必要がありますが、コンテナモードの場合はその手間がないため、簡単に構築できます


Railsプロジェクトの概要

今回ビルドするサンプルのRailsアプリは下記の仕様のものです。


  • DBにMySQLを使用している

  • Ruby 2.6.4でbundle installされている

  • Rails6.0にWebpackを追加している

  • Rakeタスクのデフォルト実行タスクでテストが走るようになっている

※ 実際にはRails5.x系や、APIモードのRailsプロジェクトでも、最後から二行目の bundle exec rails yarn:install db:setup assets:precompilebundle exec rails db:setup とすれば動きます。


手順

手順としては .github/workflows/ 以下にワークフローを記述したYAMLファイルを作成・コミットし、 Gitプッシュするだけで動作します。

今回作成するRailsプロジェクトの場合は、下記のファイルを作成します。


.github/workflows/rails.yml

name: Rails

on: [push]

jobs:

build:
runs-on: ubuntu-latest

services:
mysql:
image: mysql:5.7
options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10
env:
MYSQL_ROOT_PASSWORD: mysql123
redis:
image: redis:5.0-alpine
options: --health-cmd "redis-cli -h localhost ping" --health-interval 10s --health-timeout 5s --health-retries 15

container:
image: ruby:2.6.4
env:
DATABASE_URL: mysql2://root:mysql123@mysql:3306/rails6_sample
REDIS_URL: redis://redis:6370/1

steps:
- uses: actions/checkout@v1
- name: Setup YARN and NodeJS
run: |
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
curl -sL https://deb.nodesource.com/setup_12.x | bash -
apt-get install -y yarn nodejs
- name: Build and setup
run: |
rm -f config/database.yml
gem install bundler --no-document
bundle install --jobs 4 --retry 3 --deployment
bundle exec rails yarn:install db:setup assets:precompile
bundle exec rake


その後作成したファイルをリポジトリにプッシュします。コミットメッセージやpush先は適宜設定してください。


command

git add .github/workflows/rails.yml

git commit -m "Add GitHub Action's workflow."
git push

しばらく経つとワークフローが実行されます。

実行状況や実行結果は、リポジトリの Actions タブで表示することができます。

また、プルリクにもこのビルド結果は表示されます。


ポイント


  • 今回は実行環境としてコンテナモードを使用しているので、空きポートの探索やポートの動的参照が必要なく、service以下に定義した名前でコンテナに対してアクセスし、ジョブを実行しています

  • GitHub Actionではserviceコンテナの起動確認にhealthcheckの結果を使用しているため、MySQL等の起動に時間がかかるものについてもoptionsでhealthcheckの設定を上書きすることで、起動完了まで待った後にジョブを実行しています


おまけ: RubyプロジェクトでのCI

非RailsのRubyプロジェクト(Gem等)も下記の内容で同様にCIを実行することができます。


.github/workflows/ruby.yml

name: Ruby

on: [push]

jobs:

build:
runs-on: ubuntu-latest

container:
image: ruby:2.6.4

steps:
- uses: actions/checkout@v1
- run: gem install bundler --no-document
- run: bundle install --jobs 4 --retry 3 --deployment
- run: bundle exec rake