アーティファクトのビルド、テスト、デプロイ

このページでは、Cloud Build の公式ビルダー イメージを使用して、ソースコードと依存関係を取得し、アーティファクトのビルド、テスト、デプロイを行うビルド構成を作成する方法について説明します。

すでにビルド構成ファイルがあり、Cloud Build でビルドを実行する場合は、手動でのビルドの開始ビルドの自動化をご覧ください。

始める前に

依存関係をフェッチする

docker、git、npm、gsutil などのツールを実行するビルドステップを使用して、ソースコードをフェッチしたり、依存関係をインストールしたりします。

docker

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['pull', 'gcr.io/$PROJECT_ID/latest-image']

git

steps:
- name: 'gcr.io/cloud-builders/git'
  args: ['clone', 'https://github.com/GoogleCloudPlatform/cloud-builders']

npm

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']

gsutil

steps:
- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://mybucket/remotefile.zip', 'localfile.zip']

コンテナ イメージをビルドする

Docker コンテナ イメージをビルドするには、docker ビルドステップを使用し、 コマンドを呼び出します。このビルドステップに渡される引数が docker に直接渡され、このビルドステップで任意の docker コマンドを実行できます。

ビルド構成ファイルに、次の処理を追加します。

  • docker ビルダーを呼び出し、引数を渡して、Docker build コマンドを呼び出します。次のビルド構成では、2 つのイメージをビルドするために Docker ビルドステップが 2 回呼び出されます。「.」で示されているように、ソースコード ファイルはビルド時の現在の作業ディレクトリにあります。gcr.io/my-project/image2 のソースコードは、ビルド時の現在の作業ディレクトリ内のディレクトリである subdirectory に格納されています。
  • images フィールドを追加して、結果のイメージを Container Registry に push します。

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/my-project/image1', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/my-project/image2', '.']
  dir: 'subdirectory'
images: ['gcr.io/my-project/image1', 'gcr.io/my-project/image2']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": ["build", "-t", "gcr.io/my-project/image1", "."]
    },
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": ["build", "-t", "gcr.io/my-project/image2", "."],
      "dir": "subdirectory"
    }
  ],
  "images": ["gcr.io/my-project/image1", "gcr.io/my-project/image2"]
}

コンテナ以外のアーティファクトをビルドする

Cloud Build は、一般的な言語とツールのサポート対象のビルドステップを提供しています。このビルドステップを使用してビルドを実行できます。

コンテナ以外のアーティファクトをビルドするには、maven、gradle、go、bazel などのビルダーを実行するビルドステップ セクションを追加します。

maven

steps:
- name: 'gcr.io/cloud-builders/mvn'
  args: ['install']
- name: 'gcr.io/cloud-builders/mvn'
  args: ['package']

gradle

steps:
- name: 'gcr.io/cloud-builders/gradle'
  args: ['build']

go

steps:
- name: 'gcr.io/cloud-builders/go'
  args: ['build', 'my-package']

bazel

steps:
- name: 'gcr.io/cloud-builders/bazel'
  args: ['build', '//path/to:target']

単体テストと結合テストを実行する

使用可能なソースコードがある場合、ビルドステップとして単体テストと結合テストを実行できます。各ビルドステップは、ローカルの Docker ネットワーク cloudbuild に接続しているコンテナで実行されます。統合テストを機能させるには、ネットワーク名を指定する必要があります。

単体テストを行う JavaScript アプリケーション、Docker イメージをビルドする Dockerfile、その実行中のイメージに対して実行する結合テストがあるとします。

このアプリケーションの単体テストと統合テストを実行するには、ビルド構成ファイルの中に次の命令を追加します。

  • ビルド実行のための依存関係をインストールします。
  • 単体テストを実行します。
  • アプリケーションの Docker イメージをビルドします。
  • Docker の作成を使用して、アプリケーションと依存関係をバックグラウンドで実行します。
  • 実行中の Docker 作成スタックに対して結合テストを実行します。
  • 新しくビルドされたイメージを Container Registry に push します。

    steps:
    - name: 'gcr.io/cloud-builders/npm'
      args: ['install']
    - name: 'gcr.io/cloud-builders/npm'
      args: ['run', 'test:unit']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/$PROJECT_ID/gcb-docker-compose:latest', '.']
    - name: 'docker/compose:1.15.0'
      args: ['up', '-d']
      env:
      - 'PROJECT_ID=$PROJECT_ID'
    - name: 'gcr.io/cloud-builders/npm'
      args: ['run', 'test:integration']
      env:
      - 'HOST=counter' # name of the running container
      - 'PORT=50051'
    images: ['gcr.io/$PROJECT_ID/gcb-docker-compose:latest']
    

アーティファクトのデプロイ

継続的デプロイ パイプラインの一部として、Cloud Build はコマンドライン ツールを使用してデプロイを実行できます。

GKE、App Engine、Cloud Functions、Firebase にデプロイするには、次の操作を行います。

Kubernetes Engine

GKE にデプロイするには、gke-deploy ビルドステップを呼び出します。

  1. GKE API を有効にします。

  2. クラスタを作成する

  3. GKE の役割をサービス アカウントに追加します。

    1. Cloud Build 設定ページを開きます。

      Cloud Build 設定ページを開く

      [サービス アカウント権限] ページが表示されます。

      サービス アカウント権限ページのスクリーンショット

    2. Kubernetes Engine 開発者役割のステータスを [有効化] に設定します。

  4. ビルド構成ファイルに次のビルドステップのいずれかを追加します。

    • イメージを参照する独自の Kubernetes 構成ファイルを指定する場合は、次のビルド手順を追加します。

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: ["build", "-t", "gcr.io/[PROJECT-ID]/[IMAGE]", "."]
      - name: 'gcr.io/cloud-builders/docker'
        args: ["push", "gcr.io/[PROJECT-ID]/[IMAGE]"]
      - name: 'gcr.io/cloud-builders/gke-deploy:stable'
        args:
        - run
        - --filename=[CONFIG]
        - --image=gcr.io/[PROJECT-ID]/[IMAGE]:[TAG]
        - --location=[LOCATION]
        - --cluster=[CLUSTER]
      
    • イメージ用の Kubernetes 構成ファイルがない場合は、次のビルド手順を追加します。

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: ["build", "-t", "gcr.io/[PROJECT-ID]/[IMAGE]", "."]
      - name: 'gcr.io/cloud-builders/docker'
        args: ["push", "gcr.io/[PROJECT-ID]/[IMAGE]"]
      - name: 'gcr.io/cloud-builders/gke-deploy:stable'
        args:
        - run
        - --image=gcr.io/[PROJECT-ID]/[IMAGE]:[TAG]
        - --location=[LOCATION]
        - --cluster=[CLUSTER]
      

このビルドでは、docker ビルドステップを呼び出して Docker イメージを作成し、Container Registry に push します。次に、ビルドは gke-deploy ビルドステップを呼び出し、GKE クラスタにデプロイします。

この例のビルド構成を使用するには、次の情報を入力します。

  • [PROJECT-ID]、GCP プロジェクト プロジェクト ID
  • [IMAGE] は、イメージの名前です。[TAG] は必要なバージョンまたは commit SHA です。
  • [CLUSTER] は、認証情報がリクエストされるクラスタの名前です。
  • [LOCATION]、リージョン / クラスタのゾーン
  • [CONFIG]、存在する場合は、gke-deploy run が使用する Kubernetes 構成ファイル

App Engine

コンテナ イメージから App Engine にアプリケーションをデプロイするには、gcloud app deploy コマンドの引数を指定して、gcloud ビルドステップを呼び出します。

  1. App Engine API を有効にします。

  2. App Engine の役割をサービス アカウントに追加します。

    1. Cloud Build 設定ページを開きます。

      Cloud Build 設定ページを開く

      [サービス アカウント権限] ページが表示されます。

      サービス アカウント権限ページのスクリーンショット

    2. App Engine 管理者役割のステータスを [有効化] に設定します。

  3. gcloud app deploy を使用するビルド構成ファイルを作成します。

    steps:
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['app', 'deploy']
      timeout: '1600s'
    

gcloud ビルドステップでは、gcloud app deploy コマンドを呼び出して、ソースコードでコンテナ イメージを作成し、App Engine にイメージをデプロイします。

Cloud Functions

Cloud Functions にアプリケーションをデプロイするには、gcloud ビルドステップを呼び出して gcloud functions deploy を呼び出します。

  1. Cloud Functions API を有効にします。

  2. Cloud Functions の役割をサービス アカウントに追加します。

    1. Cloud Build 設定ページを開きます。

      Cloud Build 設定ページを開く

      [サービス アカウント権限] ページが表示されます。

      サービス アカウント権限ページのスクリーンショット

    2. Cloud Functions 開発者役割のステータスを [有効化] に設定します。

    3. [すべてのサービス アカウントにアクセス件を付与] を選択して、ページのプロジェクトのすべてのサービス アカウントに、サービス アカウント ユーザーの役割を付与します。

  3. gcloud functions deploy を使用するビルド構成ファイルを作成します。

    steps:
    - name: 'gcr.io/cloud-builders/gcloud'
      args:
      - functions
      - deploy
      - [FUNCTION_NAME]
      - --source=.
      - --trigger-http
    

これにより、アプリケーションのソースコードがビルドされ、gcloud functions deploy が呼び出されて Cloud Functions にアプリケーションがデプロイされます。

Cloud Run

Cloud Run にアプリケーションをデプロイするには、gcloud ビルドステップを呼び出して gcloud beta run deploy を呼び出します。

  1. Cloud Run API を有効にします。

  2. Cloud Run の役割をサービス アカウントに追加します。

    1. Cloud Build 設定ページを開きます。

      Cloud Build 設定ページを開く

      [サービス アカウント権限] ページが表示されます。

      サービス アカウント権限ページのスクリーンショット

    2. Cloud Run 管理者役割のステータスを [有効化] に設定します。

    3. [すべてのサービス アカウントにアクセス件を付与] を選択して、ページのプロジェクトのすべてのサービス アカウントに、サービス アカウント ユーザーの役割を付与します。

  3. gcloud beta run deploy を使用するビルド構成ファイルを作成します。

    steps:
      # build the container image
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/$PROJECT_ID/[SERVICE-NAME]', '.']
      # push the container image to Container Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'gcr.io/$PROJECT_ID/[SERVICE-NAME]']
      # Deploy container image to Cloud Run
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['beta', 'run', 'deploy', '[SERVICE-NAME]', '--image', 'gcr.io/$PROJECT_ID/[SERVICE-NAME]', '--region', '[REGION]', '--platform', 'managed']
    images:
    - gcr.io/$PROJECT_ID/[SERVICE-NAME]
    

[SERVICE-NAME][REGION] は、デプロイ先の Cloud Run サービスの名前と場所で置き換えます。

GKE で Cloud Run を使用している場合は、managed の代わりに gke を使用し、--region パラメータの代わりに --cluster--cluster-location を使用します。

これにより、アプリケーションのソースコードがビルドされ、gcloud run deploy が呼び出されて Cloud Run にアプリケーションがデプロイされます。

Cloud Run へのイメージのデプロイについての詳細は、Cloud Run へのデプロイをご覧ください。

Firebase

ビルドで Firebase を使用するには、Firebase カスタム ビルドステップを作成します。

Firebase ビルドステップを作成するには、Dockerfile と次の例のビルド構成ファイルを作成します。

Dockerfile ファイルを作成し、次の内容を追加します。これにより、ビルドから呼び出されたときに Firebase コマンドライン ツール firebase がインストールされます。

# use latest Node LTS (Boron)
FROM node:boron
# install Firebase CLI
RUN npm install -g firebase-tools

ENTRYPOINT ["/usr/local/bin/firebase"]

cloudbuild.yaml というビルド構成を作成し、次の内容を追加します。このビルド構成では、Dockerfile を使用して firebase-toolsfirebase としてコンテナ化します。このビルドでは次に、後のビルドで使用できるように、コンテナ化されたイメージを Container Registry に push します。

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/[PROJECT_ID]/firebase', '.' ]
images:
- 'gcr.io/[PROJECT_ID]/firebase'

Dockerfilecloudbuild.yaml を同じディレクトリに入れ、シェルまたはターミナル ウィンドウから次のコマンドを実行します。

gcloud builds submit --config=cloudbuild.yaml .

gcloud builds コマンドを実行すると、ビルドが Cloud Build に送信され、cloudbuild.yaml ビルド構成と現在のディレクトリ(. で指定)のソースが使用されます。このビルドは環境内に firebase ツールをインストールします。その後、ツールがコンテナ化され、Container Registry に push されます。

ビルドで firebase を呼び出すには、gcr.io/[PROJECT_ID]/firebase ビルドステップをビルド構成に追加します。

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'install' ]
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'test' ]
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'run', 'build.prod' ]
- name: 'gcr.io/[PROJECT_ID]/firebase'
  args: [ 'deploy', '-P', 'js-demo-fe-staging', '--token', '[FIREBASE_TOKEN]']

このビルド構成を使用するには、生成する Firebase 認証トークンの [FIREBASE_TOKEN] 値を入力する必要があります。

ビルド構成ファイルの例

GitHub からトリガーされたビルド

次に、GitHub からトリガーされる簡単なビルドの構成を示します。このタイプの構成は通常、CI / CD パイプラインで使用されます。

この例では、

  • npm ビルドステップが呼び出され、依存関係のインストールと単体テストが実行されます。
  • docker ビルドステップが呼び出されてアプリケーションの Docker イメージがビルドされ、Container Registry に push されます。
  • gke-deploy ビルドステップが呼び出され、ビルドイメージが Kubernetes クラスタにデプロイされます。

YAML

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
- name: 'gcr.io/cloud-builders/npm'
  args: ['test']
- name: 'gcr.io/cloud-builders/docker'
  args: ["build", "-t", "gcr.io/my-project/my-image:$REVISION_ID", "."]
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "gcr.io/my-project/my-image:$REVISION_ID"]
- name: 'gcr.io/cloud-builders/gke-deploy:stable'
  args:
  - 'run'
  - '--image=gcr.io/my-project/my-image:$REVISION_ID'
  - '--location=us-east4-b'
  - '--cluster=my-cluster'

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/npm",
        "args": [
            "install"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/npm",
        "args": [
            "test"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "build",
            "-t",
            "gcr.io/my-project/my-image:$REVISION_ID",
            "."
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "push",
            "gcr.io/my-project/my-image:$REVISION_ID"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/gke-deploy:stable",
        "args": [
            "run",
            "--image=gcr.io/my-project/my-image:$REVISION_ID",
            "--location=us-east4-b",
            "--cluster=my-cluster"
        ]
    }
    ]
}

イメージを push しないでビルド リクエストを作成する

Cloud Build を使用すると、Docker イメージを作成しないで任意のタスクを実行できます。

次の例では、以下を実行します。

  • docker を使用して分析ツールをビルドします
  • data-to-analyze ディレクトリから一部のデータを取り出します
  • 分析結果を Cloud Storage バケットに push します

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'analyzer', '.']

- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://my-data-warehouse/data-to-analyze.tgz', '.']

- name: 'debian'
  args: ['tar', '-xzf', 'data-to-analyze.tgz']

- name: 'analyzer'
  args: ['--output=results.csv']
  dir: 'data-to-analyze'

- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'data-to-analyze/results.csv', 'gs://my-data-warehouse/results.tgz']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": [
        "build",
        "-t",
        "analyzer",
        "."
      ]
    },
    {
      "name": "gcr.io/cloud-builders/gsutil",
      "args": [
        "cp",
        "gs://my-data-warehouse/data-to-analyze.tgz",
        "."
      ],
    },
    {
      "name": "debian",
      "args": [
        "tar",
        "-xzf",
        "data-to-analyze.tgz"
      ],
    },
    {
      "name": "analyzer",
      "args": [
        "--output=results.csv"
      ],
      "dir": "data-to-analyze"
    },
    {
      "name": "gcr.io/cloud-builders/gsutil",
      "args": [
        "cp",
        "data-to-analyze/results.csv",
        "gs://my-data-warehouse/results.tgz"
      ]
    }
  ]
}

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Build のドキュメント