CircleCI 2.1 設定サンプル（Node + MySQL + 複数DB起動）

# 環境

- Circle CI 2.1
- Yarn 1.x
- cimg 利用
  - 詳細: https://hub.docker.com/r/cimg/base
- Node + MySQL（ですが、主にCircle CIの設定のため、←の環境には大きく依存していません）
  - [cimg/node:16.13.1](https://circleci.com/developer/images/image/cimg/node)
  - [cimg/mysql:8.0](https://circleci.com/developer/images/image/cimg/mysql) 
- MySQLの複数DBを立ち上げる場合の設定は、以下に加えて[【CircleCI】MySQLで複数DBを構築する](https://qiita.com/piggydev/items/d02f94c6f3cc7e39e625)も参照して下さい。


# 設定例

```yaml
version: 2.1

orbs:
  node: circleci/node@3.0.0

executors:
  default:
    docker:
      - image: cimg/node:16.13.1
  extended:
    docker:
      - image: cimg/node:16.13.1
      - image: cimg/mysql:8.0l
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
          MYSQL_DATABASE: your_database_name_comes_here

commands:
  restore_yarn_cache:
    steps:
      - restore_cache:
          name: Restore Yarn Package Cache
          keys:
            - v1-yarn-packages-{{ checksum "yarn.lock" }}
  install_yarn_dependencies:
    steps:
      - run:
          name: Install Yarn Dependencies
          # to avoid "Extracting tar content of undefined failed"
          # https://github.com/yarnpkg/yarn/issues/7212
          command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn --network-concurrency 1
  save_yarn_cache:
    steps:
      - save_cache:
          name: Save Yarn Package Cache
          key: v1-yarn-packages-{{ checksum "yarn.lock" }}
          paths:
            - .yarn/cache
  wait_for_db_start_up:
    steps:
      - run:
          name: Wait for db start up
          command: dockerize -wait tcp://127.0.0.1:3306 -timeout 1m
  run_test:
    steps:
      - run:
          name: Run test
          command: yarn run test
  run_lint:
    steps:
      - run:
          name: Run lint
          command: yarn run lint

jobs:
  build:
    executor: default
    steps:
      - checkout
      - restore_yarn_cache
      - install_yarn_dependencies
      - save_yarn_cache
  test:
    executor: extended
    steps:
      - checkout
      - restore_yarn_cache
      - wait_for_db_start_up
      - run_test
  lint:
    executor: default
    steps:
      - checkout
      - restore_yarn_cache
      - run_lint

workflows:
  build_and_test:
    jobs:
      - build
      - lint:
          requires:
            - build
      - test:
          requires:
            - build
```

# ポイント

- `2.1`の機能（`executors`、`commands`）を使って、設定をわかりやすくする。
- `executor`を最適化する。
  - 例えば、DBのセットアップは数十秒かかるので（※実測で20秒程）、不要なところでは行わない。
  - 上記の例では、`build`（`yarn install`）にDBは不要なので、DBが無い`executor`（= default）を使っています。
  - `executor`の名前（defaultやextended）は任意です。
- テスト実行前に、DBの起動待ちをする（`dockerize -wait`）。
- `step`内で`name`を付ける。
  - 無くてもいいですが、その場合はCircleCIのデフォルトが使われます。`restore_cache`などは全て`Restoring Cache`となり、中を見ないとどのステップか分からなくなるので、付けています。

# 参照先

#### Caching Dependencies

https://circleci.com/docs/caching/

> By default, cache storage duration is set to 15 days. This can be customized on the CircleCI web app
 by navigating to Plan > Usage Controls. Currently, 15 days is also the maximum storage duration you can set.

> Tip: Caches are immutable, so it is helpful to start all your cache keys with a version prefix, for example v1-.... This allows you to regenerate all of your caches just by incrementing the version in this prefix.

#### `yarn install` に `--frozen-lockfile` オプションを付ける
- https://circleci.com/docs/ja/2.0/yarn/
- https://classic.yarnpkg.com/ja/docs/cli/install/#toc-yarn-install-frozen-lockfile

#### `version: 2.1` では `workflows` の version 指定は不要。
- https://github.com/CircleCI-Public/config-preview-sdk/issues/129

# その他

- ソースコードが大きくなってきたら、[ソースコードのキャッシュ](https://circleci.com/docs/ja/2.0/caching/#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5)も検討する（※デフォルトでやっておいてもいいかもしれない）。