CodeBuildでnpm installをLOCAL_CUSTOM_CACHEでキャッシュする

  • AWS
  • CodeBuild
  • CI/CD

この記事は、構成と文章の整理に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.2
phases:
pre_build:
commands:
- npm install
build:
commands:
- npm run build
artifacts:
files:
- '**/*'
base-directory: build
cache:
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.2
phases:
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_modules
artifacts:
files:
- '**/*'
base-directory: build
cache:
paths:
- /tmp/cache/**/*

こちらでも動くはずだが、素直にnode_modules/**/*を指定するほうが手数が少ない。

その他の制約

  • ローカルキャッシュはビルドホスト単位で保持される。CodeBuildが別のホストを割り当てるとキャッシュヒットしないので、常に効くとは限らない。
  • VPC接続を使うCodeBuildプロジェクトはローカルキャッシュ自体が非対応、とドキュメントに書いてある。