CircleCI2.0の機能と.circleci/config.yml の書き方

# 概要

CircleCI2.0の機能と `.circleci/config.yml` の書き方についてメモ

# 構造

ざっくり書くとこんな感じ

- `jobs`
    - `< job name >`
        - `environment`
        - `machine`
        - `branches`
        - `steps`
- `workflows`
    - `< work_flow_name >`
        - `triggers`
        - `jobs`

# workflow

`job` をいつどの順番で実行するかを定義できます

## triggers

`workflow_name` に定義した `workflow` を `cron` で実行する時間の指定ができます
また、 `branches` を指定して、実行するブランチ絞ったり、除外したりすることもできます

[公式ドキュメント](https://circleci.com/docs/2.0/configuration-reference/#triggers)

## jobs

`workflow_name` に定義した `job`  の実行する順番の指定ができます
また、指定した `job` に対し、以下の属性を持たせることができます

| 属性 | 説明 |
| --- | --- |
| type | `approval ` を指定して、WEB上で手動でボタンを押さない限り `job` の実行が始まらないようにする |
| require | 指定した `job` が成功するまで `job` の実行が始まらないようにする |
| filters | `branches` を指定して、実行するブランチ絞ったり、除外したりする |

```yml
      - hold:
          type: approval
          requires:
            - test1
            - test2
      - deploy:
          requires:
            - hold
            - 
 ```

# jobs

## environment

環境変数の定義ができます
セキュリティ上との理由でプロジェクトメンバーに見られたくない場合は `Environment Variables` に設定することもできます

## machine

CIを動かすマシンを指定できます

## branches

`only` や `ignore ` を指定して、CIのビルドパイプラインを動かすブランチを絞ったり除外したりできます

詳しくは [公式ドキュメント](https://circleci.com/docs/2.0/configuration-reference/#branches) をみてみてください

## steps

`job` で実行する処理を順に定義できます
`steps` では、 `run`, `checkout`, `restore_cache`, `deploy`, `store_artifacts`, `store_test_results`, `persist_to_workspace` 等が定義できます

詳しくは [公式ドキュメント](https://circleci.com/docs/2.0/configuration-reference/#steps) をみてみてください

以下、よく使う `steps` について紹介します

### restore_cache

以前 `key` を指定して保存したデータを  `paths` で指定したディレクトリに復元することができます

```yml
      - restore_cache:
          name: restore docker image cache
          key: docker-{{ checksum "docker-compose.yml" }}
          paths: ~/caches
```

詳しくは [公式ドキュメント](https://circleci.com/docs/2.0/configuration-reference/#restore_cache) をみてみてください

### run

`command` に指定したコマンドを実行できます
テストデータの作成やテストの実行はここで指定します

### save_cache

`paths` で指定したディレクトリ or ファイルを `key` を指定して保存することができます

例えば、`~/caches` 以下のデータを、docker-compose.ymlのchecksumの値をキーにして  `docker-{{ checksum "docker-compose.yml" }}` 

```yml
      - save_cache:
          - name:  save docker image cache
          - key: docker-{{ checksum "docker-compose.yml" }}
          - paths: ~/caches
```

のように保存できます
また、 他のファイルの `checksum` を組み合わせて、

```yml
      - save_cache:
          - name:  save docker image cache
          - key: docker-{{ checksum "docker-compose.yml" }}-{{ checksum "db/schema.rb" }}
          - paths: ~/caches
```

のようにすることもできます

`key` には `checksum` 以外にも、 `.Branch`, `.BuildNum`, `.Revision`, `.CheckoutKey `, `.Environment.variableName`, `epoch `, `arch `
などが指定できます

詳しくは [公式ドキュメント](https://circleci.com/docs/2.0/configuration-reference/#save_cache) をみてみてください

### store_artifacts

CIでの処理実行中にできた成果物を `artifacts` に保存して、終了後にCircleCIのWEB上からダウンロードすることができます

```yml
      - store_artifacts:
          path: ~/caches/dump.sql
          destination: db/dump.sql
```

[公式ドキュメント](https://circleci.com/docs/2.0/configuration-reference/#store_artifacts)

# Example

公式ドキュメントの例を載せておきます
https://circleci.com/docs/2.0/configuration-reference/#example-7