RailsアプリをCircleCI(2.1)を使ってHerokuにデプロイするときの設定

## はじめに
Railsアプリの開発効率を上げるため、
GitHubにpushしたら静的コード解析(rubocop)と自動テスト(rspec)を実行し、
stagingブランチにマージしたらSTG環境に、masterブランチにマージをしたら本番環境に自動デプロイするように設定した。

## 前提
- Railsのアプリケーションを作成済み
- Rubocop, Rspec設定済み
- Herokuの登録&設定済み
- CircleCIのユーザおよびプロジェクト登録済み&GitHubと連携済み

## 環境
- Ruby 2.5.0
- Rails 5.2.2
- CircleCI 2.1
- SQLite(Rspec実行時)

## 手順
- CircleCIに環境変数を設定する
- .circleci/config.ymlを記述し、GitHubにpushする

### CircleCIに環境変数を設定
Project Settings > Environment Variables にAdd Variableで以下を設定する。

- HEROKU_API_KEY(HerokuのAccount Settings > Account > API Keyの内容を記載)
- HEROKU_APP_NAME_PRD(本番環境のHerokuアプリ名)
- HEROKU_APP_NAME_STG(STG環境のHerokuアプリ名)

### 設定ファイルの記述
以下のファイルを作成する。
masterブランチの時のみ本番環境のHerokuアプリにデプロイされ、
stagingブランチの時のみSTG環境のHerokuアプリにデプロイされる。

```.circleci/config.yml
version: 2.1
orbs:
  ruby-orbs: sue445/ruby-orbs@1.6.0
  heroku: circleci/heroku@1.0.1

workflows:
  build_test_and_deploy:
    jobs:
      - build
      - rubocop:
          requires: 
            - build
      - rspec:
          requires:
            - build
            - rubocop
      - deploy_prd:
          requires:
            - build
            - rspec
          filters:
            branches:
              only:
                - master
      - deploy_stg:
          requires:
            - build
            - rspec
          filters:
            branches:
              only:
                - staging

executors:
  default:
    working_directory: ~/repo
    docker:
      - image: ruby:2.5.0-stretch
        environment:
          BUNDLE_PATH: vendor/bundle
          RAILS_ENV: test

jobs:
  build:
    executor: default
    steps:
      - checkout
      - bundle-install
  rubocop:
    executor: default
    steps:
      - preparate
      - run:
          name: Rubocop
          command: bundle exec rubocop
  rspec:
    executor: default
    steps:
      - preparate
      - run: bundle exec rails db:create
      - run: bundle exec rails db:schema:load
      - run:
          name: Rspec
          command: bundle exec rspec
  deploy_prd:
    executor: heroku/default
    parameters:
      app-name: 
        default: $HEROKU_APP_NAME_PRD
        type: string
      post-deploy:
        default:
          - run:
              command: heroku run rails db:migrate --app $HEROKU_APP_NAME_PRD
        type: steps
    steps:
      - checkout
      - heroku/install
      - heroku/deploy-via-git:
          app-name: << parameters.app-name >>
      - steps: << parameters.post-deploy >>
  deploy_stg:
    executor: heroku/default
    parameters:
      app-name: 
        default: $HEROKU_APP_NAME_STG
        type: string
      post-deploy:
        default:
          - run:
              command: heroku run rails db:migrate --app $HEROKU_APP_NAME_STG
        type: steps
      force:
        default: true
        type: boolean
    steps:
      - checkout
      - heroku/install
      - heroku/deploy-via-git:
          app-name: << parameters.app-name >>
      - steps: << parameters.post-deploy >>

commands:
  bundle-install:
    steps:
      - ruby-orbs/bundle-install:
          bundle_clean: true
          bundle_extra_args: ''
          bundle_gemfile: Gemfile
          bundle_jobs: 4
          bundle_path: vendor/bundle
          bundle_retry: 3
          cache_key_prefix: v1-bundle-dependencies
          restore_bundled_with: true
  preparate:
    steps:
      - checkout
      - bundle-install
```

Rubocop, Rspecもorbを使ったほうがよかったかもしれないです。

### 注意
3rdパーティ製のorb(sue445/ruby-orbs@1.6.0)を利用する場合は、Orb Security Settingsを有効にしておく必要がある。

Organization Settings > Security > Orb Security Settings
Allow Uncertified OrbsをYesにする。

## 参考
- circleci/heroku@1.0.1 Orbドキュメント
    - https://circleci.com/orbs/registry/orb/circleci/heroku
- sue445/ruby-orbs@1.6.0 Orbドキュメント
    - https://circleci.com/orbs/registry/orb/sue445/ruby-orbs
- CircleCI 2.1のorbを作って最速で実アプリに投入した
    - https://sue445.hatenablog.com/entry/2018/11/10/165123
- RailsアプリにCircleCI2.1でCI/CDを導入する設定ファイル【初心者向け】
    - https://qiita.com/K2_Yoshiko/items/cd64ef2c3004ad3a92d3