CircleCI のキャッシュキーに Contexts で定義した環境変数を指定する

CircleCI のビルド時にライブラリの依存関係をキャッシュする際に指定するキーとして、キーの先頭に `v1` のような固定のプレフィクスを付与してキャッシュを管理する方法がありますが、以下のように [Contexts](https://circleci.com/docs/2.0/contexts/) で定義した環境変数を指定して、キャッシュキーをハードコードせずにキャッシュキーを管理する方法もあります。

```yml
# プレフィクスをキーに含めるパターン
- restore_cache:
    keys:
      - v1-bundler-cache-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
      - v1-bundler-cache-{{ .Branch }}
      - v1-bundler-cache-

# Context をキーに含めるパターン
- restore_cache:
    keys:
      - bundler-cache-{{ .Environment.CACHE_KEY }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
      - bundler-cache-{{ .Environment.CACHE_KEY }}-{{ .Branch }}
      - bundler-cache-
```

## Context をキャッシュキーに含めるメリット

例えば、固定のプレフィクスをキャッシュキーに含めるパターンでキャッシュを管理する場合、キャッシュをクリアする際に「キャッシュキーの固定プレフィクスを変更して ( `v1` を `v2` に変更して ) コミットする」といった手間が発生しますが、Context をキャッシュキーに含めるパターンの場合は CircleCI の設定画面上でキャッシュのクリアが手軽に行えるというメリットがあります。

## Context の設定方法
#### 1. Contexts の設定画面で新しい Context を定義する

例として `ORGANIZATION_CONTEXT` という Context を定義します。
![スクリーンショット_2019-03-16_14_22_23.png](https://qiita-image-store.s3.amazonaws.com/0/12391/8d4d737c-fe7a-681c-0979-7f4c074d0b8f.png)
![スクリーンショット_2019-03-16_14_24_05.png](https://qiita-image-store.s3.amazonaws.com/0/12391/ce50b047-93f7-e9de-b96c-47146d27dfd7.png)

#### 2. 定義した Context でキャッシュキー用の環境変数を定義する

例として `Name` に `CACHE_KEY`、`Value` に `hoghoge` という環境変数を定義します。
![スクリーンショット_2019-03-16_14_27_06.png](https://qiita-image-store.s3.amazonaws.com/0/12391/eaff44cb-8b0c-deab-7df3-a5cf1c9fa4a9.png)
![スクリーンショット_2019-03-16_14_52_52.png](https://qiita-image-store.s3.amazonaws.com/0/12391/57b9db20-4a5e-18b5-08bb-c8eac875d740.png)

#### 3. CircleCI 設定ファイル ( `.circleci/config.yml` ) のキャッシュキーとして、 (2) で定義した環境変数を指定する

`.circleci/config.yml` の記述例

```yml
test:
  executor:
    name: default
  steps:
    - checkout
    - restore_cache:
        keys:
          - bundler-cache-{{ .Environment.CACHE_KEY }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
          - bundler-cache-{{ .Environment.CACHE_KEY }}-{{ .Branch }}
          - bundler-cache-
    - run:
        name: bundle install
        command: bundle install --path vendor/bundle
    - save_cache:
        key: bundler-cache-{{ .Environment.CACHE_KEY }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
        paths:
          - ./vendor/bundle

workflows:
  test-workflow:
    jobs:
      - test:
          context: ORGANIZATION_CONTEXT  # (1) で定義した Context を test ジョブの中で展開する
```

#### 4. CircleCI でビルドすると、キャッシュキーの中で `CACHE_KEY` 環境変数が展開されている

`hogehoge` という環境変数が展開されている。
![スクリーンショット_2019-03-16_14_46_38.png](https://qiita-image-store.s3.amazonaws.com/0/12391/9aa7147b-28ff-75ff-f314-49614fa67a15.png)

## キャッシュをクリアする方法
#### 1. キャッシュキー用の環境変数を削除する
![スクリーンショット_2019-03-16_14_27_593.png](https://qiita-image-store.s3.amazonaws.com/0/12391/0cebced0-43f9-3445-70b5-cb5734807eea.png)

#### 2. キャッシュキー用の環境変数を定義する

前回のキャッシュキーとは異なる、`Name` に `CACHE_KEY`、`Value` に `fugafuga` という環境変数を定義します。
![スクリーンショット_2019-03-16_15_12_53.png](https://qiita-image-store.s3.amazonaws.com/0/12391/ee8e982a-f185-2032-a705-bbb08cd9b354.png)

#### 3. CircleCI でビルドすると、キャッシュキーの中で新しい `CACHE_KEY` の環境変数が展開されている

`fugafuga` という環境変数が展開されている。
![スクリーンショット_2019-03-16_15_20_52.png](https://qiita-image-store.s3.amazonaws.com/0/12391/387c44bc-0df5-b412-a777-14169703de90.png)