🌊

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

2020/01/19に公開

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: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.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