【CircleCI】config.ymlの書き方

# 概要
- テスト環境のビルドとテストの実行を目的とする
- CircleCIとGitHubの連携
- config.ymlファイルの記述方法の確認

# CircleCIとGitHubの連携
- 公式ページのガイダンスに則って連帯
- 無料枠は1ジョブまでのようなので注意

# config.ymlファイルの記述方法の確認
- 連帯を行うと、強制的に当該ファイルをpushされる
- プッシュ時にCircleCIが行う検証（検査？）の内容を記述する

|キー|詳細|
|---|---|
|jobs|jobを定義する、jobが一つの場合にはbuildから記述|
|docker|jobの一つとしてDockerのイメージ構築について記述|
|steps| Docker意外のタスクを定義|
|checkout| working_directoryにリポジトリをプルする（要はスタート）|
|restore_cache|キャッシュをリストアしてcircleCIの動作速度を向上させる|
|save_cache|パッケージなどのファイルをキャッシュセーブする、複数あればkeysと記述|
|paths|キャッシュするファイルを指定|
|run|コマンドの実行|
|name|runコマンドにつける任意の名称|
|commands|runコマンドの実体|
|workflows|jobを個別に実行できる|
|orbs|executorsやcommandsなどの構成要素をまとめた塊、メソッドのようなイメージで、動作を定義する|
|executors|読んで字の如く、実行環境を定義する|
- 以下はrspecとrubocopを行う記述のサンプル（正しい記述ではないかもしれませんが、バリデーションはクリアしました）

```config.yml
version: 2.1
jobs:
  rspec:
    docker:
      - image: circleci/ruby:2.6.5-node-browsers
        environment:
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
          DB_USERNAME: root
          # DB_PASSWORD: password
      - image: circleci/mysql:5.6
        environment:
          - MYSQL_DATABASE: fitness_app01_test
          - MYSQL_USER: root
          # - MYSQL_ROOT_PASSWORD: password
    working_directory: ~/fitness_app01
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
            - v1-dependencies-
      - run:
          name: update bundler
          command: |
            gem update --system
            gem install bundler:2.1.4
      - run: bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
          paths:
            - ./vendor/bundle
      - run: bundle exec rails db:create RAILS_ENV=test
      - run: bundle exec rails db:schema:load RAILS_ENV=test
      - run:
          name: yarn Install
          command: yarn install
      - run: bundle exec bin/webpack
      - run:
          name: RSpec
          command: bundle exec rspec
  rubocop:
    docker:
      - image: circleci/ruby:2.6.5-node-browsers
        environment:
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
          DB_USERNAME: root
          # DB_PASSWORD: password
      - image: circleci/mysql:5.6
        environment:
          - MYSQL_DATABASE: fitness_app01_test
          - MYSQL_USER: root
          # - MYSQL_ROOT_PASSWORD: password
    working_directory: ~/fitness_app01
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
            - v1-dependencies-
      - run:
          name: update bundler
          command: |
            gem update --system
            gem install bundler:2.1.4
      - run: bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
          paths:
            - ./vendor/bundle
      - run: bundle exec rails db:create RAILS_ENV=test
      - run: bundle exec rails db:schema:load RAILS_ENV=test
      - run:
          name: RuboCop
          command: bundle exec rubocop

workflows:
  version: 2.1
  rspec_and_rubocop_workflow:
    jobs:
      - rspec
      - rubocop
```

# bundlerのバージョン2の衝突への対処
- バージョンを指定してコマンドを走らせる

```config.yml
- run:
   name: update bundler
   command: |
     gem update --system
     gem install bundler:2.1.4
```

# javascriptに係るエラーへの対処
- yarnをインストールすればほぼ対処可能

```config.yml
- run:
   name: yarn Install
   command: yarn install
 - run: bundle exec bin/webpack
```

- config.ymlのバリデーションチェク

```
% circleci config validate -c .circleci/config.yml
```