CircleCI config.yml ひな型 Rails 6 / PostgreSQL / Rspec（orbと最新のimageの利用）

[前回作ったCircleCIの設定](https://qiita.com/kazutosato/items/9817e746ae760fe27b6e)の続きです。orbを使ったものに書き換えました。

参照: [Language Guide: Ruby - CircleCI](https://circleci.com/docs/2.0/language-ruby/)

```yaml
version: 2.1

orbs:
  ruby: circleci/ruby@1.1.1
  node: circleci/node@4.0.0
  browser-tools: circleci/browser-tools@1.0.1

jobs:
  build:
    docker:
      - image: cimg/ruby:2.6.6-node
    environment:
      BUNDLE_JOBS: "3"
      BUNDLE_RETRY: "3"
    steps:
      - checkout
      - ruby/install-deps:
          bundler-version: 2.1.4
      - node/install-packages: 
          pkg-manager: yarn

  test:
    docker:
      - image: cimg/ruby:2.6.6-node
      - image: circleci/postgres:11.7
        environment:
          POSTGRES_USER: circleci
          POSTGRES_DB: blog_rails6_test
          POSTGRES_HOST_AUTH_METHOD: trust # パスワードなし
    environment:
      BUNDLE_JOBS: "3"
      BUNDLE_RETRY: "3"
      PGHOST: 127.0.0.1
      PGUSER: circleci
      PGPASSWORD: ""
      TZ: "/usr/share/zoneinfo/Asia/Tokyo"
      RAILS_ENV: test

    steps:
      - checkout
      - ruby/install-deps:
          bundler-version: 2.1.4
      - node/install-packages: 
          pkg-manager: yarn
      - browser-tools/install-chrome
      - browser-tools/install-chromedriver
      - run:
          name: DB Initializing
          command: |
            dockerize -wait tcp://localhost:5432 -timeout 1m
            bundle exec rake db:schema:load
      - run:
          name: rspec
          command: |
            bundle exec rspec --format RspecJunitFormatter \
                              --out test_results/rspec.xml \
                              --format documentation
      - store_test_results:
          path: test_results

workflows:
  version: 2
  build_and_test:
    jobs:
      - build
      - test:
          requires:
            - build
```

以下、自分用メモ。

## Orbとは?

いまいち理解できていませんが、次のようなものだと考えます。

- steps に置くコマンドで、よく使うものをまとめたもの。
- docker の欄に指定する image とは関係ない。

orbsの欄にorbの名前を置くと、その機能（コマンド）が使えます。

上記の例では、[circleci/ruby@1.1.1](https://circleci.com/orbs/registry/orb/circleci/ruby) というorbの持っているコマンドが `ruby/install-deps` で、[circleci/node@4.0.0](https://circleci.com/orbs/registry/orb/circleci/node) というorbの持っているコマンドが `node/install-packages` です。`bundler-version` や `pkg-manager` は各コマンドのオプションです。

上記の例では、Gemやnode_modulesをキャッシュしたりキャッシュを戻したりするのに使っています。

CircleCI公式のorbのリストは、[CircleCI Orb Registry](https://circleci.com/orbs/registry/)にあります。


## workflowsとjobs

workflowsを使うと、jobsの下に置いた複数のジョブの順番を指定できます。この例では、まずbuildジョブを実行して、それが終了してからbuildジョブを実行します。

```yml
workflows:
  version: 2
  build_and_test:
    jobs:
      - build
      - test:
          requires:
            - build
```

この例だと全部1つのジョブにまとめても同じようなものですが、parallelismを指定して複数のrspecを並行に動作させる場合に必要になります（あとで記事を追加する予定）。

## 新しいイメージとChromeのインストール

最近CircleCIは "cimg/" で始まる新しいイメージを提供しています。よくわからないけど新しいものの方がよいだろうということで、cimg/ruby:2.6.6-node を使うことにしました。

- [Next-generation Convenience Images](https://circleci.com/docs/2.0/circleci-images/#next-generation-convenience-images)

cimg/ruby:2.6.6-node にはE2Eテスト用のブラウザーが入っていないので、ブラウザーをインストールするorb、[circleci/browser-tools@1.0.1](https://circleci.com/orbs/registry/orb/circleci/browser-tools) を使うことにしました。

```yaml
orbs:
  ruby: circleci/ruby@1.1.1
  node: circleci/node@4.0.0
  browser-tools: circleci/browser-tools@1.0.1
```

次のorbのコマンドでインストールできます。これまでのイメージ circleci/ruby:xxx-node-browsers ではFirefoxもいっしょに入るので、Chromeだけインストールする方が無駄がなくていいかもしれません。

```yaml
    steps:
      # 略
      - browser-tools/install-chrome
      - browser-tools/install-chromedriver
      # 略
```