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

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

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

#　GitHub Actionsの導入
### ファイルの作成
>GitHub Actionsは、YAML 構文を使用して、イベント、ジョブ、およびステップを定義します。 これらの YAML ファイルは、コードリポジトリの .github/workflows というディレクトリに保存されます。
引用: [サンプルワークフローを作成する](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions#create-an-example-workflow)

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

```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](https://github.com/marketplace/actions/deploy-to-heroku#heroku-deploy)を参考にファイルに追記します。

```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
  heroku-deproy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: akhileshns/heroku-deploy@v3.12.12
        with:
          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
          heroku_app_name: "YOUR APP's NAME"
          heroku_email: "YOUR EMAIL"

```

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

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

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

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

#　GitHubへPush

![スクリーンショット 2021-10-03 15.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090824/e11cbbd0-294f-4c18-10c7-6176d5d30e1a.png)
これで自動テストと自動デプロイが導入できました。

## 参考
[Understanding GitHub Actions](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions)
[GitHub Action Deploy to Heroku](https://github.com/marketplace/actions/deploy-to-heroku#heroku-deploy)
[リポジトリに暗号化されたシークレットを作成する](https://docs.github.com/ja/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository)
[パーフェクト Ruby on Rails 【増補改訂版】](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Ruby-Rails-%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-Perfect/dp/4297114623)