🌊
GitHub Action で Railsプロジェクト のCIを回す
GitHub Actionの種類
ワークフローの記述
GitHub Actionは提供当初はHCLで記述するタイプでしたが、現在はYAMLで記述するタイプになっています。
今回はYAML形式のワークフローを記述していきます。
実行環境
GitHub Actionの実行環境は共用VMでのホストモードと、その上でコンテナで稼働させるコンテナモードの2種類が存在しています。
今回はコンテナモードを使用します。
∵ ホストモードの場合、空きポートを探したり、変数で割り当てポートを探してポートを露出する必要がありますが、コンテナモードの場合はその手間がないため、簡単に構築できます
Railsプロジェクトの概要
今回ビルドするサンプルのRailsアプリは下記の仕様のものです。
- DBにMySQLを使用している
- Ruby 2.6.5でbundle installされている
- Rails6.0にWebpackを追加している
- Rakeタスクのデフォルト実行タスクでテストが走るようになっている
※ 実際にはRails5.x系や、APIモードのRailsプロジェクトでも、最後から二行目の bundle exec rails yarn:install db:setup assets:precompile
を bundle 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.5
env:
DATABASE_URL: mysql2://root:mysql123@mysql:3306/rails6_sample
REDIS_URL: redis://redis:6379/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_13.x | bash -
apt-get install -y yarn nodejs
- name: Build and setup
run: |
rm -f config/database.yml
gem install bundler --no-document -v $(grep "BUNDLED WITH" -1 Gemfile.lock | tail -n 1)
bundle config set deployment 'true'
bundle install --jobs 4 --retry 3
bundle exec rails yarn:install db:setup assets:precompile
- name: Exec tests
run: bundle exec rake
その後作成したファイルをリポジトリにプッシュします。コミットメッセージやpush先は適宜設定してください。
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 config set deployment 'true'
- run: bundle install --jobs 4 --retry 3
- run: bundle exec rake
Discussion