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のコールドスタートを避けるためにcurlで起こし続ける

定期リクエストを送っている間はコールドスタートは発生していないことが確認できた

GCP VMインスタンスのSSHポートを変更した

Network Internet Egress from Americas to EMEA

[Action Required] Free Container Scanning ends

お試しで使っていたコンテナイメージの脆弱性スキャンを無効にした

GCPの無料インスタンスがF1-microからE2-Microに変わった

メールが来ていたのを見落としていた

[Action Required] Internal error has affected services in Cloud Run that use Cloud Load Balancing

デフォルトURLで利用している場合は対応不要

ローカルディレクトリをCloud Storageに同期する

gsutil rsyncを利用した