

CodeBuildでnpm installをLOCAL_CUSTOM_CACHEでキャッシュする
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
CodeBuildで毎回npm installが走ってビルドが遅かったので、LOCAL_CUSTOM_CACHEでnode_modulesをキャッシュしてみた。
CfnProject側の設定
cache: { type: "LOCAL", modes: ["LOCAL_CUSTOM_CACHE"],}locationはS3タイプのキャッシュの時だけ必要なプロパティで、LOCALでは不要。
buildspec側の設定
キャッシュ対象はcache.pathsに指定する。一番シンプルなのはnode_modulesをそのまま指定する方法。
version: 0.2phases: pre_build: commands: - npm install build: commands: - npm run buildartifacts: files: - '**/*' base-directory: buildcache: paths: - node_modules/**/*これでnode_modulesがビルドホストにキャッシュされ、次回ビルドではソース取得前にキャッシュから復元された状態でnpm installが走る。差分だけ入れば済むので体感でも速くなった。
ハマったポイント
最初はnode_modulesをtarでまとめて/tmp/node_modules.tarという単一ファイルをcacheのpathsに指定していたが、これはうまくいかなかった。CodeBuildの公式ドキュメント(ProjectCache)に
Only directories can be specified for caching. You cannot specify individual files.
とあり、LOCAL_CUSTOM_CACHEでキャッシュできるのはディレクトリだけで、ファイル単体は指定できないらしい。tar化したファイルをそのまま指定していたのが原因だった。
tarでまとめる形を維持したい場合は、ファイルではなくディレクトリを指定する。
version: 0.2phases: pre_build: commands: - mkdir -p /tmp/cache - if [ -e /tmp/cache/node_modules.tar ]; then tar xf /tmp/cache/node_modules.tar; fi - npm install build: commands: - npm run build post_build: commands: - tar cf /tmp/cache/node_modules.tar node_modulesartifacts: files: - '**/*' base-directory: buildcache: paths: - /tmp/cache/**/*こちらでも動くはずだが、素直にnode_modules/**/*を指定するほうが手数が少ない。
その他の制約
- ローカルキャッシュはビルドホスト単位で保持される。CodeBuildが別のホストを割り当てるとキャッシュヒットしないので、常に効くとは限らない。
- VPC接続を使うCodeBuildプロジェクトはローカルキャッシュ自体が非対応、とドキュメントに書いてある。