Google Cloud Platformに戻る

Cloud Build

Cloud Buildとは

Cloud Build は、Google Cloud Platform (GCP) が提供するフルマネージドの継続的インテグレーション/継続的デリバリー(CI/CD)プラットフォームです。ソースコードのビルド、テスト、デプロイを自動化し、コンテナイメージやその他のアーティファクトを作成できます。Cloud Buildは、ビルドステップを柔軟に定義でき、さまざまな言語やフレームワークに対応しています。

Cloud Buildの主な特徴

Cloud Buildのアーキテクチャ

Cloud Buildは以下の主要コンポーネントで構成されています:

コンポーネント 説明
ビルド構成ファイル ビルドステップとパラメータを定義するYAMLまたはJSONファイル
ビルドステップ ビルドプロセスの個々のタスク。各ステップは独自のコンテナで実行される
ビルドトリガー 特定のイベント(コミット、タグ作成など)に応じて自動的にビルドを開始する仕組み
ビルドワーカー ビルドを実行する仮想マシン。デフォルトのプールまたはプライベートプールで実行可能
アーティファクト ビルドの結果生成されるファイル(コンテナイメージ、バイナリなど)

Cloud Build と Jenkins の違い

Cloud BuildとJenkinsはどちらもCI/CDツールですが、以下のような違いがあります:

Cloud Buildの使用方法

Cloud Buildは、Google Cloud Console、gcloud CLIツール、またはAPIを使用して利用できます。

ビルド構成ファイルの作成

ビルド構成ファイル(cloudbuild.yaml)は、ビルドプロセスのステップを定義します:

シンプルなビルド構成ファイルの例

steps:
# Dockerイメージをビルド
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/myapp:$COMMIT_SHA', '.']

# ビルドしたイメージをContainer Registryにプッシュ
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/myapp:$COMMIT_SHA']

# GKEにデプロイ
- name: 'gcr.io/cloud-builders/kubectl'
  args:
  - 'set'
  - 'image'
  - 'deployment/myapp'
  - 'myapp=gcr.io/$PROJECT_ID/myapp:$COMMIT_SHA'
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=asia-northeast1-a'
  - 'CLOUDSDK_CONTAINER_CLUSTER=my-cluster'

# ビルド結果のイメージ
images:
- 'gcr.io/$PROJECT_ID/myapp:$COMMIT_SHA'

# ビルドのタイムアウト設定
timeout: '1800s'

gcloud CLIを使用したビルドの実行

ローカルソースからのビルド実行

gcloud builds submit --config=cloudbuild.yaml .

特定のソースリポジトリからのビルド実行

gcloud builds submit --config=cloudbuild.yaml https://github.com/username/repo.git

ビルドトリガーの設定

ビルドトリガーを使用すると、リポジトリの変更に応じて自動的にビルドを実行できます:

  1. Google Cloud Consoleにログイン
  2. Cloud Buildページに移動
  3. 「トリガー」タブを選択
  4. 「トリガーを作成」をクリック
  5. ソースリポジトリを選択(GitHub、Bitbucket、Cloud Source Repositoriesなど)
  6. トリガー条件(ブランチ、タグ、コミットなど)を設定
  7. ビルド構成ファイルの場所を指定
  8. 「作成」をクリックしてトリガーを保存

Cloud Buildの高度な機能

カスタムビルダーの作成

特定のビルドタスク用にカスタムビルダーを作成できます:

# Dockerfile for custom builder
FROM alpine:3.14
RUN apk add --no-cache python3 py3-pip
RUN pip3 install awscli
ENTRYPOINT ["aws"]

カスタムビルダーをビルドしてContainer Registryにプッシュ:

gcloud builds submit --tag gcr.io/$PROJECT_ID/aws-cli .

カスタムビルダーをビルド構成で使用:

steps:
- name: 'gcr.io/$PROJECT_ID/aws-cli'
  args: ['s3', 'cp', 'myfile.txt', 's3://my-bucket/']

ビルド変数とサブスティテューション

ビルド構成ファイルで変数を使用して柔軟性を高めることができます:

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}:${_VERSION}', '.']

substitutions:
  _SERVICE_NAME: myapp
  _VERSION: 1.0.0

options:
  env:
  - 'NODE_ENV=production'

コマンドラインから変数を上書き:

gcloud builds submit --config=cloudbuild.yaml \
  --substitutions=_SERVICE_NAME=newapp,_VERSION=2.0.0 .

Cloud Buildのセキュリティベストプラクティス

Secret Managerとの統合例

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    gcloud secrets versions access latest --secret=my-api-key > /workspace/api-key.txt
    
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '--build-arg', 'API_KEY=$(cat /workspace/api-key.txt)', '-t', 'gcr.io/$PROJECT_ID/myapp', '.']

Cloud Buildのモニタリングとロギング

Cloud BuildはGoogle Cloud Monitoringおよびロギングと統合されており、ビルドの状態とパフォーマンスを監視できます:

主なモニタリング機能

ビルド通知の設定

Pub/Subを使用してビルド通知を設定できます:

gcloud pubsub topics create cloud-builds

gcloud pubsub subscriptions create cloud-builds-subscription --topic=cloud-builds

gcloud services enable cloudbuild.googleapis.com

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
  --role=roles/pubsub.publisher

Cloud Buildのコスト最適化

Cloud Buildのコストを最適化するためのベストプラクティス:

依存関係のキャッシュ例(Node.js)

steps:
# キャッシュからnode_modulesを復元
- name: 'gcr.io/cloud-builders/gsutil'
  id: 'restore-cache'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    gsutil cp gs://$PROJECT_ID-cache/node-modules.tar.gz /tmp/ || exit 0
    if [ -f /tmp/node-modules.tar.gz ]; then
      tar -xzf /tmp/node-modules.tar.gz
    fi

# 依存関係をインストール
- name: 'node:14'
  id: 'install'
  entrypoint: 'npm'
  args: ['install']

# node_modulesをキャッシュに保存
- name: 'gcr.io/cloud-builders/gsutil'
  id: 'save-cache'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    tar -czf /tmp/node-modules.tar.gz node_modules
    gsutil cp /tmp/node-modules.tar.gz gs://$PROJECT_ID-cache/node-modules.tar.gz

# ビルドを実行
- name: 'node:14'
  id: 'build'
  entrypoint: 'npm'
  args: ['run', 'build']

Cloud Buildのユースケース

Cloud Buildは以下のようなユースケースに適しています:

Cloud Buildとの統合サービス

Cloud Buildは他のGoogle Cloudサービスと統合して、より強力なCI/CDパイプラインを構築できます:

サービス 統合の利点
Artifact Registry コンテナイメージ、言語パッケージ、その他のアーティファクトの安全な保存
Cloud Deploy 複数環境への段階的なデプロイの管理と自動化
GKE Kubernetesクラスタへのコンテナアプリケーションのデプロイ
Cloud Run サーバーレス環境へのコンテナのデプロイ
Cloud Source Repositories プライベートGitリポジトリとの統合
Secret Manager ビルドプロセスでの機密情報の安全な管理
Binary Authorization 信頼できるコンテナイメージのみをデプロイするポリシーの適用

まとめ

Cloud Build は、Google Cloud Platform上でのCI/CDパイプラインの構築と実行を簡素化するフルマネージドサービスです。柔軟なビルド構成、多様なソース統合、セキュリティ機能などにより、開発チームはインフラストラクチャの管理ではなく、アプリケーション開発に集中できます。

Cloud Buildの主な利点は以下の通りです:

Cloud Buildを効果的に活用するには、ビルド構成の最適化、キャッシュの活用、適切なセキュリティ対策の実装が重要です。また、他のGCPサービスと組み合わせることで、エンドツーエンドの自動化されたデプロイパイプラインを構築することができます。