Cloud Buildでnode_modulesをキャッシュしてビルド時間を高速化する

公開日時

Cloud BuildでFirebase Hostingのデプロイを行うようにした

デプロイ時間を計測してみると3分30秒ほどかかっていた。

cloud build before

ビルドの際に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秒高速化できた。

cloud build after

参考


Related #gcp

Cloud Runを試す

helloworldコンテナを試した

ngrokの代わりにinletsを使う

固定ドメインが設定できるのでbot開発に便利

inletsで複数ドメインが使えるようにする

CaddyのCloudflare Pluginを使ってワイルドカード証明書を設定した

Cloud Datastoreのローカル環境をDockerで構築する

CloudDatastoreエミュレータとgoogle-cloud-guiの環境を構築

gcloud configでアカウントを切り替える

gcloud config configurations activateで切り替える

Cloud RunアプリをCloud Buildでデプロイできるようにする

特定のブランチにpushしたらデプロイできるようになった