【GitHub Actions】を導入しテストとデプロイを自動化


学習のアウトプットとして投稿しています。
何かご指摘がございましたらお願いいたします。

 GitHub Actions とは

GitHub Actionsは、GitHub上にあるリポジトリの変更を検知し、自動でテストを実行したりデプロイを行ってくれるCI/CDツールのこと。パブリックリポジトリでは無料で使用できる。
テストコードを実行する際、bundle exec rspecなど手動でコマンドを実行する必要があったが、その部分を自動化できるため手間が減り、実行を忘れてしまうことも防ぐことができる。

 GitHub Actionsの導入

ファイルの作成

GitHub Actionsは、YAML 構文を使用して、イベント、ジョブ、およびステップを定義します。 これらの YAML ファイルは、コードリポジトリの .github/workflows というディレクトリに保存されます。
引用: サンプルワークフローを作成する

以上から.github/workflowsディレクトリにsample.ymlファイルを作成します。
まずはテストを自動化する設定を書きます。

.github/workflows/sample.yml
name: Tests and Deproy
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Ruby 2.6.7
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.6.7
        env:
          RAILA_ENV: test
        run: |
          sudo apt-get -yqq install libsqlite3-dev
          bundle install
          bin/rails db:create
          bin/rails db:migrate
          bin/yarn install
          bundle exec rubocop
          bundle exec rspec

ファイル構成

on: の部分でイベントを作成します。今回はpush時とpull_request時にGitHub Actionosが起動します。ブランチを指定することもできます。

runs-on:で実行環境のOSを指定します。

steps:以下でアクションやコマンドなどを記述していきます。

uses: actions/checkout@v2コミュニティーアクションを使い対象コードを実行環境内に取り込みます。

uses: ruby/setup-ruby@v1コミュニティーアクションを使いRuby実行環境を用意します。with:ruby-versionでバージョンを指定できます。今回は2.6.7に設定してあります。

run:以下で実行したいコマンドを記述していきます。今回はDBにsqliteを使います。テストコマンドにbundle execはつけなくても良いかもしれませんが一様つけておきます。

ここまでのファイルでリポジトリにコードが新しくpush,pull_requestされた際、テストが自動で動いてくれるようになります。

Herokuデプロイの自動化

Heroku Deployを参考にファイルに追記します。

.github/workflows/sample.yml
name: Tests and Deproy
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Ruby 2.6.7
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.6.7
        env:
          RAILA_ENV: test
        run: |
          sudo apt-get -yqq install libsqlite3-dev
          bundle install
          bin/rails db:create
          bin/rails db:migrate
          bin/yarn install
          bundle exec rubocop
          bundle exec rspec
  heroku-deproy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: akhileshns/[email protected]
        with:
          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
          heroku_app_name: "YOUR APP's NAME"
          heroku_email: "YOUR EMAIL"

ジョブは、同じランナーで実行される一連のステップです。 デフォルトでは、複数のジョブを含むワークフローは、それらのジョブを並行して実行します。 ジョブを順番に実行するようにワークフローを設定することもできます。 たとえば、ワークフローにコードのビルドとテストという2つのシーケンシャルなジョブを持たせ、テストジョブをビルドジョブのステータスに依存させることができます。 ビルドジョブが失敗した場合は、テストジョブは実行されません。
引用:ジョブ

以上より、テストとデプロイがデフォルトでは同時に実行されてしまうのでneeds: buildでbuildが成功したらデプロイするようにしています。

HEROKU_API_KEYを対象リポジトリの環境変数に設定しなければいけないので、そちらも設定しておきます。

これで、GitHub Actionsの設定が終わりです。

 GitHubへPush


これで自動テストと自動デプロイが導入できました。

参考

Understanding GitHub Actions
GitHub Action Deploy to Heroku
リポジトリに暗号化されたシークレットを作成する
パーフェクト Ruby on Rails 【増補改訂版】