Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What is going on with this article?
@tk_hamaguchi

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

More than 1 year has passed since last update.

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
14
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
14
Help us understand the problem. What is going on with this article?