Cloud Buildでnode_modulesをキャッシュしてビルド時間を高速化する
Cloud BuildでFirebase Hostingのデプロイを行うようにした。
デプロイ時間を計測してみると3分30秒ほどかかっていた。
ビルドの際にnode_modulesをキャッシュすると高速化できそうなので、公式ドキュメントと下記記事を参考にさせていただきキャッシュすることにした。
対応手順
Cloud Build用のバケットに
build_cache
ディレクトリを追加先にキャッシュ済みの
node_modules
をバケットにアップロードしておく必要があるので、アップロード処理のみを追加してデプロイ実行
# cloudbuild.yaml
steps:
- name: 'node:14-slim'
entrypoint: yarn
args: ['install']
- name: 'node:14-slim'
id: 'build'
entrypoint: yarn
args: ['build']
- name: 'gcr.io/$PROJECT_ID/firebase'
args: ['deploy', '--only=hosting']
- name: bash
id: 'archive'
args: ['tar', 'czf', 'node_modules.tar.gz', 'node_modules']
waitFor: ['build']
- name: gcr.io/cloud-builders/gsutil
args:
[
'cp',
'node_modules.tar.gz',
'gs://<project_id>_cloudbuild/build_cache/node_modules.tar.gz',
]
waitFor: ['archive']
- デプロイが完了したら、Cloud Storageから
node_modules
を取得して解凍する処理も追加
# cloudbuild.yaml
steps:
- name: gcr.io/cloud-builders/gsutil
args:
[
'cp',
'gs://<project_id>_cloudbuild/build_cache/node_modules.tar.gz',
'node_modules.tar.gz',
]
- name: bash
args: ['tar', 'xzf', 'node_modules.tar.gz']
- name: 'node:14-slim'
entrypoint: yarn
args: ['install']
- name: 'node:14-slim'
id: 'build'
entrypoint: yarn
args: ['build']
- name: 'gcr.io/$PROJECT_ID/firebase'
args: ['deploy', '--only=hosting']
- name: bash
id: 'archive'
args: ['tar', 'czf', 'node_modules.tar.gz', 'node_modules']
waitFor: ['build']
- name: gcr.io/cloud-builders/gsutil
args:
[
'cp',
'node_modules.tar.gz',
'gs://<project_id>_cloudbuild/build_cache/node_modules.tar.gz',
]
waitFor: ['archive']
- これで次回のデプロイ以降はキャッシュからデータを取得してビルドを実行し、デプロイ完了後にキャッシュを更新してくれる
キャッシュ導入後
3分25秒 => 2分39秒となり46秒高速化できた。