🥡
circle ciのrestore_cacheでNo cache is found for keyになる
circle ciでキャッシュするには
-
save_cache
{{ checksum "filename" }}
restore_cache
という構文がサポートされている。これを使うだけでOK!
https://circleci.com/docs/ja/configuration-reference/#savecache
https://circleci.com/docs/ja/caching/#using-caching-in-monorepos
実際にあった設定ミス
restore_cache
しようとすると、No cache is found for key
になってしまう。
設定ファイルは以下の順番になっている
steps:
- checkout
- restore_npm
- setup_github_token
- run:
name: Install dependencies
command: npm install --legacy-peer-deps
- save_npm
また、save-npmの対象はnode_modules
、Keyは npm-{{ checksum "package-lock.json" }}-{{ checksum "package.json" }}
になっているとする。
restore_npm
で探しているKeyと、save_npm
で保存しているKeyが異なっていた。
途中のnpm install --legacy-peer-deps
で、package-lock.jsonの中身が変わっている可能性があるため。
どうやって解決するか
- npm installはpackage-lock.jsonを書き換える可能性があるので、npm ci を使うことで、package-lock.jsonをもとにライブラリのインストールを行わせることができる。npm ciを使う場合も以下の2パターンのキャッシュ戦略を選ぶことができる
- node_modulesをキャッシュする場合
chacheのKeyと同一のものがある場合、package-lock.jsonが変わっていない=node_modulesのものをそのまま使うことができるので高速になる。Keyが見つからなかったり期限が切れている場合はnpm ciを実行する。そうすると、node_modulesは削除されて再度ダウンロードが始まる。つまり、キャッシュヒットしない場合に全インストールの時間がかかってしまうのがデメリット。 - ~/.npmをキャッシュする場合
npm ciはキャッシュヒットにかかわらず常に実行する必要がある。
キャッシュヒットした場合は、npm ci後node_modulesは削除されるが、~/.npmにあるものからコピーして再配置するだけなので、インストールの時間が短くなる
キャッシュヒットしない場合は、npm ci後node_modulesは削除される。~/.npmに無いものだけインストールされ、node_modulesにコピーされる。node_modulesをキャッシュする場合
よりも、インストールのフォールバックを利用できる点で早くなると見込める。
- node_modulesをキャッシュする場合
参考にさせていただいた記事
Discussion