[memo]RailsアプリにCircleCIを導入

# 概要
- 現在開発中のオリジナルアプリにCircleCIを導入して、push時に自動でテストが回るようにする

# 参考
- https://circleci.com/docs/ja/2.0/language-ruby/
- https://circleci.com/docs/ja/2.0/circleci-images/#ruby
- ["You must use Bundler 2 or greater with this lockfile" に対応する](https://qiita.com/tanakaworld/items/e15ff9dbdd4b628378c2)

# 公式ガイド参考に導入
- CicleCIからGithubを連携させ、利用したいプロジェクトを登録
- 導入はCircleCIの公式ページに記載ある設定例を参考に

```ruby:設定例
version: 2 # CircleCI 2.0 を使用します
jobs: # ステップの集合
  build: # Workflows を使用しない実行では、エントリポイントとして `build` ジョブが必要
    parallelism: 3 # このジョブのインスタンスを 3つ並列実行します
    docker: # Docker でステップを実行します
      - image: circleci/ruby:2.4.2-jessie-node # このイメージをすべての `steps` が実行されるプライマリコンテナとして使用します
        environment: # プライマリコンテナの環境変数
          BUNDLE_JOBS: 3
          BUNDLE_RETRY: 3
          BUNDLE_PATH: vendor/bundle
          PGHOST: 127.0.0.1
          PGUSER: circleci-demo-ruby
          RAILS_ENV: test
      - image: circleci/postgres:9.5-alpine # データベースイメージ
        environment: # データベースの環境変数
          POSTGRES_USER: circleci-demo-ruby
          POSTGRES_DB: rails_blog
          POSTGRES_PASSWORD: ""
    steps: # 実行可能コマンドの集合
      - checkout # ソースコードを作業ディレクトリにチェックアウトする特別なステップ

      # Bundler のバージョンを指定します

      - run:
          name: Bundler を指定
          command: bundle -v

      # バンドルキャッシュを復元します
      # 依存関係キャッシュについては https://circleci.com/docs/ja/2.0/caching/ をお読みください

      - restore_cache:
          keys:
            - rails-demo-bundle-v2-{{ checksum "Gemfile.lock" }}
            - rails-demo-bundle-v2-

      - run: # Ruby の依存関係をインストールします
          name: バンドルインストール
          command: bundle check || bundle install

      # Ruby の依存関係のバンドルキャッシュを保存します

      - save_cache:
          key: rails-demo-bundle-v2-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle

      # アプリケーションで Webpacker または Yarn を他の何らかの方法で使用する場合にのみ必要です

      - restore_cache:
          keys:
            - rails-demo-yarn-{{ checksum "yarn.lock" }}
            - rails-demo-yarn-

      - run:
          name: Yarn をインストール
          command: yarn install --cache-folder ~/.cache/yarn

      # Yarn または Webpacker のキャッシュを保存します

      - save_cache:
          key: rails-demo-yarn-{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn

      - run:
          name: DB を待機
          command: dockerize -wait tcp://localhost:5432 -timeout 1m

      - run:
          name: データベースをセットアップ
          command: bin/rails db:schema:load --trace

      - run:
          name: RSpec を並列実行
          command: |
            bundle exec rspec --profile 10 \
                              --format RspecJunitFormatter \
                              --out test_results/rspec.xml \
                              --format progress \
                              $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)

      # タイミング解析のテスト結果を保存します

      - store_test_results: # テストサマリー (https://circleci.com/docs/ja/2.0/collect-test-data/) に表示するテスト結果をアップロードします
          path: test_results
      # デプロイコンフィグの例については https://circleci.com/docs/ja/2.0/deployment-integrations/ を参照してください
```

以上が公式ページにあるRubyの場合の設定例です。(2019/07/06時点)

## 自分のプロジェクトに合わせて設定変更
このままではうまく動かないので、適宜設定を自分の使用しているRubyのバージョンやデータベース部分などを変更します。

### imageを自分の使用しているものに合わせて変更
`image`部分をそれぞれ使用しているバージョンに変更し、データベースの環境変数部分も変更。
私が作ってるものでは現状では以下の部分も使用しなかったので、削除しました。
- 参考: https://circleci.com/docs/ja/2.0/circleci-images/#ruby
- 参考: https://circleci.com/docs/ja/2.0/circleci-images/#postgresql

### 不要部分を削除
```ruby:Webpacker/Yarnに関する部分を削除
# アプリケーションで Webpacker または Yarn を他の何らかの方法で使用する場合にのみ必要です

      - restore_cache:
          keys:
            - rails-demo-yarn-{{ checksum "yarn.lock" }}
            - rails-demo-yarn-

      - run:
          name: Yarn をインストール
          command: yarn install --cache-folder ~/.cache/yarn

      # Yarn または Webpacker のキャッシュを保存します

      - save_cache:
          key: rails-demo-yarn-{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn
```

### rubocopの追加
RSpecだけでなく`rubocop`も導入しているので、CircleCIにも`rubocop`用の設定を追加しました。

```ruby:rubocopの設定追加

      - run:
          name: rubocop を実行
          command: |
            bundle exec rubocop
```

## bundleに関するエラーに対処
設定例を参考にCircleCIの設定をしていくと、問題なく設定できているはずでも以下のようなエラーが出てちょっと詰まりました。

```ruby
You must use Bundler 2 or greater with this lockfile.
```
結構このエラーにかかっている人はいるようでした。

私自身、インストールしてるbundlerのバージョンや`schema.rb`を確認してみましたが、バージョンは全て`2.0.1`に統一されていたのでいたので解決できずに詰まってました。

一応、下記のあたりが原因なのかなーと思いつつ、今回は利用する`bundler`のバージョンを下げることで対応しました。

参考: ["You must use Bundler 2 or greater with this lockfile" に対応する](https://qiita.com/tanakaworld/items/e15ff9dbdd4b628378c2)

## まとめ
実際に導入して少し時間経ってるので抜けてる部分や忘れてる部分があるかもですが、とりあえず現状では導入には成功しており、push時にCircleCIも正常に動作してます。

今回も色々とググったりもありましたが、やはり一番は公式サイトを読み解くのが最短距離ですね。