LoginSignup
31
19

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-08

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先は適宜設定してください。

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 config set deployment 'true'
      - run: bundle install --jobs 4 --retry 3
      - run: bundle exec rake
31
19
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
31
19