Cloud Deploy と CI システムの統合

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

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

始める前に

このページの手順は、すでに次の条件を満たしていることを前提としています。

CI パイプラインから Cloud Deploy を呼び出す

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

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

ここで...

  • RELEASE_NAME

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

    '$DATE' または '$TIME' のいずれか、または両方を指定して、動的リリース名を指定できます。たとえば、このコマンドを午後 3 時 7 分(UTC)に呼び出すと、'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 を渡す場合は、この値は必要ありません。

    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 を示し、最終的に Cloud Deploy リリースを作成します。

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

この例では、ソース リポジトリの commit ハッシュと同じ Docker タグにイメージを push します。次に、Docker タグと同じ commit ハッシュが、リリース コマンドの引数から参照されます。

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 ファイルは、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"
    ]

GitHub Actions を Cloud Deploy に接続する

継続的インテグレーションやその他のソフトウェア デリバリー関連のアクティビティに GitHub Actions を使用している場合は、create-cloud-deploy-release GitHub Action を使用して Cloud Deploy に接続して継続的デリバリーを実現できます。

GitLab を Cloud Deploy に接続する

継続的インテグレーションに GitLab を使用している場合は、GitLab Cloud Deploy コンポーネント create-cloud-deploy-release を使用して Cloud Deploy リリースを作成できます。

Google Cloud で GitLab を使用するには、エンドツーエンドのチュートリアルも試すことができます。

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

--annotations= フラグを使用すると、このコマンドで作成するリリースに任意の Key-Value ペアを 1 つ以上適用できます。このフラグを 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

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