Google Cloud Deploy と CI システムの統合

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このドキュメントでは、継続的インテグレーション(CI)システムから Google Cloud Deploy デリバリー パイプラインを呼び出す方法について説明します。

Google Cloud Deploy と CI システムの統合は、Google Cloud Deploy の gcloud CLI への呼び出しを追加するだけで簡単です。この呼び出しは、アプリケーションのデプロイ準備ができた CI パイプラインで発生します。

始める前に

このページで説明する手順では、次の条件を満たしている必要があります。

CI パイプラインからの Google Cloud Deploy の呼び出し

次のコマンドで新しいリリースが作成され、デリバリー パイプライン インスタンスが呼び出されます。

gcloud deploy releases create RELEASE_NAME \
  --delivery-pipeline=PIPELINE_NAME \
  --region=REGION
  --annotations=[KEY=VALUE,...]
  --images=[IMAGE_LIST]

ここで...

  • RELEASE_NAME

    は、このリリースに付ける名前です。この値は必須です。

    動的なリリース名を指定するには、'$DATE''$TIME'、またはその両方を指定します。たとえば、このコマンドを UTC 午後 3 時 07 分に呼び出すと、'rel-$TIME'rel-1507 に解決されます。'$DATE''$TIME' は、単一引用符で囲む必要があります。

  • PIPELINE_NAME

    は、登録されたデリバリー パイプラインの名前です。この値は必須です。

  • REGION

    は、このリリースを作成するリージョンです。リージョンは、最終的にアプリケーションをデプロイするリージョンと同じにする必要はありません。

  • [KEY=VALUE,...]

    は、リリースに適用する 1 つ以上のアノテーションのリストです(省略可)。Key-Value ペアの形式で指定します。

    アノテーションを使用して、リリースの出所を追跡できます。たとえば、commitId=0065ca0 などのアノテーションを渡します。リリースのすべてのアノテーションは、リリースに対して list または get を実行すると返され、Google Cloud Console にリリースと一緒に表示されるため、リリースの出所も確認できます。

  • [IMAGE_LIST]

    は、イメージ名からイメージパスへの置換のカンマ区切りリストです。例: --images=image1=path/to/image1:v1@sha256:45db24,image2=path/to/image2:v1@sha256:55xy18

    この値は、Skaffold ビルド アーティファクトの出力ファイルを指定する --build-artifacts を渡す場合には必要ありません。

    Google Cloud Deploy がマニフェストをレンダリングすると、レンダリングされていないマニフェスト内のイメージ名は、レンダリングされたマニフェストの完全なイメージ参照に置き換えられます。つまり、この例の image1 は、レンダリングされていないマニフェスト内にあり、レンダリングされたマニフェストで path/to/image1:v1@sha256:45db24 に置き換えられます。

直接イメージ参照の使用例

次のコマンドは、新しいリリースを作成し、ビルド アーティファクト ファイルではなく、イメージ参照を直接渡します。

gcloud deploy releases create my-release \
  --delivery-pipeline=web-app \
  --region=us-central1
  --images=image1=path/to/image1:v1@sha256:45db24

この例では、my-release がリリース名です。日付または時刻に基づいてリリース名を生成する場合は、'$DATE' または 'TIME'、あるいはその両方を指定します。時刻は、コマンドを呼び出すマシン上の UTC 時間です。'$DATE''$TIME' は単一引用符で囲む必要があります。

次に例を示します。

gcloud deploy releases create rel-'$DATE'-'$TIME' \
  --delivery-pipeline=web-app \
  --region=us-central1
  --images=image1=path/to/image1:v1@sha256:45db24

この例では、コマンドに接頭辞 rel- と日付と時刻が付いたリリース名が生成されます(例: rel-20220131-1507)。

また、リリース名で Git SHA を使用するのが一般的です。このドキュメントの Cloud Build と Docker の例をご覧ください。

ビルド アーティファクトとイメージ

gcloud deploy releases create コマンドには、一連のイメージ参照またはビルド アーティファクト ファイル参照を渡すことができます。

  • --images=[NAME=TAG,...] を使用して 1 つ以上の個々のコンテナ イメージを参照します。

    この値は、イメージのフルパスの置換への個々のイメージ名のコレクションへの参照です。次に例を示します。

    gcloud deploy releases create my-release --images=image1=path/to/image1:v1@sha256:45db24

  • --build-artifacts= を使用して、Skaffold ビルド アーティファクトの出力ファイルを指定します。

ビルド アーティファクト ファイルを渡す Cloud Build の例

Docker ビルドの例

次の YAML ファイルは、Docker のビルドイメージ push のための Cloud Build を示し、最終的に Google Cloud Deploy リリースを作成します。

この例では、イメージをビルドしてアーティファクト リポジトリに push します。また、短い commit SHA に基づいてリリース名を使用してリリースを作成するコマンドを作成します。この例は、$COMMIT_SHA 変数に依存しているため、Cloud Build SCM トリガーとして使用する必要があります。

この例では、ソース リポジトリの commit ハッシュと同じ Docker ラベルにイメージを push します。次に、同じ commit ハッシュが Docker ラベルとして、release-command 引数から参照されます。

steps:
# Build and tag using commit sha
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '.', '-t', 'REPO_LOCATION/$PROJECT_ID/IMAGE_NAME:${COMMIT_SHA}', '-f', 'Dockerfile']
# Push the container image
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'REPO_LOCATION/$PROJECT_ID/IMAGE_NAME:${COMMIT_SHA}']
# Create release in Google Cloud Deploy
- name: gcr.io/google.com/cloudsdktool/cloud-sdk
  entrypoint: gcloud
  args:
    [
      "deploy", "releases", "create", "rel-${SHORT_SHA}",
      "--delivery-pipeline", "PIPELINE_NAME",
      "--region", "us-central1",
      "--annotations", "commitId=${REVISION_ID}",
      "--images", "IMAGE_NAME=REPO_LOCATION/$PROJECT_ID/IMAGE_NAME:${COMMIT_SHA}"
    ]

この例の最後のイメージ名は、レンダリングされたマニフェストで "--images", "IMAGE_NAME= が完全なイメージ参照で置き換えられています。

Skaffold を使用した Cloud Build 構成の例

次の YAML ファイルは、日付に基づくリリース名を使用して、リリースを作成するための Google Cloud Deploy 呼び出しを含む Cloud Build ビルド構成の内容です。この例では、ビルドに Skaffold を使用しています。

steps:
- name: gcr.io/k8s-skaffold/skaffold
  args:
    - skaffold
    - build
    - '--interactive=false'
    - '--file-output=/workspace/artifacts.json'
- name: gcr.io/google.com/cloudsdktool/cloud-sdk
  entrypoint: gcloud
  args:
    [
      "deploy", "releases", "create", "rel-${SHORT_SHA}",
      "--delivery-pipeline", "PIPELINE_NAME",
      "--region", "us-central1",
      "--annotations", "commitId=${REVISION_ID}",
      "--build-artifacts", "/workspace/artifacts.json"
    ]

アノテーションを使用してリリースの出所を追跡する

--annotations= フラグを使用すると、このコマンドで作成するリリースに任意の Key-Value ペアを適用できます。このフラグを gcloud deploy releases create コマンドに追加します。

たとえば、次の Key-Value ペアを使用して、デプロイするイメージのソースを追跡できます。

次に例を示します。

gcloud deploy releases create web-app-1029rel \
  --delivery-pipeline=web-app \
  --region=us-central1
  --annotations=commitId=0065ca0,author=user@company.com
  --images=image1=path/to/image1:v1@sha256:45db24

たとえば、pull リクエストを指す URL の値をアノテーションとして作成することもできます。詳細については、Google Cloud Deploy でのラベルとアノテーションの使用をご覧ください。