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 FunctionsのNode.jsバージョンを更新する

package.jsonとcloudbuild.yamlを更新

Cloud BuildでFirebase Hostingのデプロイを行う

リポジトリへのpush以外をトリガーにしたい場合に使用

Firebase HostingのデプロイをWebhook(API)経由で行う

デプロイボタンが作れるようになった

CloudRunでnode.jsを動かす

リポジトリにpushしたらCloudRun上に自動デプロイ

IPv6 IPoE環境で自宅のRaspberryPiにsshできるようにする

GCPにssh port forwardingすることで実現できた

CloudRunのレスポンスが429 Rate exceeded.になる

インスタンスの最大数を500に上げたらエラーは消えた