🥡

circle ciのrestore_cacheでNo cache is found for keyになる

2025/01/20に公開

circle ciでキャッシュするには

実際にあった設定ミス

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をキャッシュする場合よりも、インストールのフォールバックを利用できる点で早くなると見込める。

参考にさせていただいた記事

https://bufferings.hatenablog.com/entry/2023/03/15/215044

Discussion