デプロイ プレビューの構成


このチュートリアルでは、Cloud Run のリビジョン URL を使用して、Cloud Build トリガーを介した GitHub の pull リクエストのプレビューを実装する方法について説明します。プレビューにより、サービスのライブ バージョンまたは「本番環境」バージョンを変更することなく、潜在的な変更をサービスにデプロイできます。オープン pull リクエストの 0% のトラフィック リビジョンをデプロイすると、変更をプレビューできるようになり、マージする前に本番環境に近い環境で意図したとおりに、その変更が機能することを確認できます。

このチュートリアルは、公開および限定公開 GitHub リポジトリの両方で機能します。難読化されている場合、プレビュー自体は公開 URL になります。

目標

  • Cloud Run サービスを作成する。
  • GitHub にソース管理ベースの継続的インテグレーションを実装する。
  • Secret Manager を使用してシークレットへのアクセス権を作成し、管理する。
  • カスタムのクラウド ビルダーをデプロイする。
  • GitHub の pull リクエスト時にビルドを開始する Cloud Build トリガーを作成する。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud Run, Cloud Build, and Secret Manager API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Cloud Run, Cloud Build, and Secret Manager API を有効にします。

    API を有効にする

必要なロール

チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

コードサンプルを取得する

このチュートリアルでの利便性を考慮し、テンプレートに基づいて Hello World アプリケーションのコピーを含む新しい GitHub リポジトリを作成します。次に、Cloud Build のカスタム構成を持つこのリポジトリに新しいファイルを追加します。

  1. GitHub にログインし、テンプレート リポジトリに移動します。
  2. [Use this template] をクリックし、このテンプレートを使用して新しいリポジトリを作成します。
    1. リポジトリに helloworld-python という名前を付けます。
    2. リポジトリに「Public」または「Private」を選択します。
    3. [Create repository from template] をクリックします。
  3. リポジトリで新しい Cloud Build 構成ファイルを作成します(詳細な手順)。

    1. リポジトリ ページで、[Add file] > [Create new file] の順にクリックします。
    2. 新しいファイルに cloudbuild.yaml という名前を付けます。
    3. 以下のコードを cloudbuild.yaml にコピーします。

      steps:
        - id: "build image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "build",
              "-t",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
              ".",
            ]
      
        - id: "push image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "push",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        - id: "deploy prod service"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "deploy",
              "${_SERVICE_NAME}",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
              "--allow-unauthenticated",
              "--image",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        # Force the new revision to serve 100% of traffic.
        - id: "ensure prod service live"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "services",
              "update-traffic",
              "${_SERVICE_NAME}",
              "--to-latest",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
            ]
      
      substitutions:
        _SERVICE_NAME: myservice
        _REGION: us-central1
      
      options:
        logging: CLOUD_LOGGING_ONLY
    4. デフォルトの [Commit directly into the main branch] を選択したままにします。

    5. [Commit new file] をクリックします。

ビルドトリガーを使用してサービスをデプロイする

このチュートリアルでは、ビルドトリガーを設定して、リポジトリのメインブランチを更新するたびにビルドを自動的に開始する方法を説明します。また、変更をデプロイするたびに Cloud Build を呼び出して、サービスを手動でデプロイすることもできます。

このチュートリアルでは、cloudbuild.yaml ファイルを使用して myservice というサンプル サービスをデプロイします。

  1. Cloud Run 管理者ロールとサービス アカウント ユーザー ロールを Cloud Build サービス アカウントに付与します(詳細な手順)。

    1. Google Cloud コンソールで、Cloud Build のアカウント設定ページに移動します。

      Cloud Build のアカウント設定ページに移動

    2. Cloud Run 管理者ロールを有効にします。

    3. 確認ダイアログで [すべてのサービス アカウントにアクセス権を付与] をクリックします。

  2. GitHub アカウントを Cloud Build に接続します(詳細な手順)。

    1. Google Cloud コンソールで、[Cloud Build トリガー] ページに移動します。

      [Cloud Build トリガー] ページに移動

    2. [リポジトリを接続] をクリックします。

    3. ソースとして [GitHub(Cloud Build GitHub アプリ)] を選択し、認証と認可のダイアログを 1 つずつ確定します。

    4. GITHUB_USER_NAME/helloworld-python リポジトリを選択します。

    5. [リポジトリを接続] をクリックします。

    6. [トリガーの作成(オプション)] で、[トリガーを作成する] をクリックします。

  3. Cloud Build トリガーを作成します(詳細な手順)。

    1. [Cloud Build トリガー] ページで、[トリガーを作成] をクリックします。
    2. 次の詳細情報を入力します。
      • 名前: prod-deploy
      • イベント: ブランチへの push
      • ソース リポジトリ: GITHUB_USER_NAME/helloworld-python
      • ソースブランチ: ^main$
      • ビルド構成: Cloud Build 構成ファイル(yaml または json)
      • Cloud Build 構成ファイルの場所: cloudbuild.yaml
    3. [作成] をクリックします。
  4. 新しいトリガーを手動で実行します。

    1. 新しいトリガーのリストで、[実行] をクリックします。
    2. ポップアップでブランチ名(main)を確認し、[トリガーを実行] をクリックします。
    3. [Cloud Build 履歴] に移動してビルドの進行状況を確認します。
    4. ビルドが完了するまで待ちます。
  5. デプロイが成功したことを確認します。

    1. Google Cloud コンソールで [Cloud Run] ページに移動します。

      [Cloud Run] ページに移動

    2. デプロイに成功したことを示す緑色のチェックマークがサービスに付されていることを確認します。

    3. [リビジョン] タブをクリックして、サービスにトラフィックの 100% を処理し、「myservice-00001-」で始まる 1 つのリビジョンがあることを確認します。

    4. サービスの URL をクリックして、サービスで「Hello World!」と表示されることを確認します。

    サービス URL がハイライト表示された、1 つのリビジョンを含む Cloud Run コンソールのスクリーンショット。
    「Hello World!」を表示する、デプロイされた Cloud Run サービスのスクリーンショット。

トークンと構成を作成する

前のセクションで作成した prod-deploy トリガーは、メインブランチへの push 時にサービスをデプロイします。ここでは、リポジトリで pull リクエストが作成または更新されるたびに実行される 2 つ目のトリガーを作成します。

新しいトリガーを設定すると、プレビューがデプロイされますが、pull リクエストにはプレビューにリンクするための情報は含まれていません。この機能を設定するには、次の追加の構成手順を行う必要があります。

  • GitHub トークンを作成します。
  • このトークンを Secret Manager に保存します。
  • Cloud Build で 1 つのステップとして使用するカスタム イメージを作成します。

GitHub トークンを作成して保存する

  1. pull リクエストへの書き戻しを許可するため、GitHub トークンを作成します(詳細な手順)。
    1. GitHub 個人アクセス トークンの設定ページに移動します。
    2. [Generate new token] をクリックします。
    3. 次の詳細情報を入力します。
      • : preview-deploy
      • 有効期限: 30 日間
      • スコープ:
        • 公開リポジトリの場合: repo:status(commit ステータスにアクセス)
        • 限定公開リポジトリの場合: repo(限定公開リポジトリのフル コントロール)
    4. [Generate token] をクリックします。
    5. 生成されたトークンの値をコピーします。
  2. Secret Manager に GitHub トークンを保存します。

    1. Google Cloud コンソールで、[Secret Manager] ページに移動します。

      [Secret Manager] ページに移動

    2. [シークレットの作成] をクリックします。

    3. 次の詳細情報を入力します。

      1. 名前: github_token
      2. シークレット値: GitHub からコピーしたトークン値を貼り付けます。
    4. [シークレットの作成] をクリックします。

  3. Cloud Build にこのシークレットへのアクセスを許可します。

    1. 新しいブラウザタブで、Google Cloud コンソールから Cloud Build の設定ページに移動します。

      Cloud Build の設定ページに移動

    2. 「サービス アカウントのメールアドレス」の値をコピーします。

      • メールアドレス: PROJECT_NUM@cloudbuild.gserviceaccount.com
    3. Secret Manager に戻り、[権限] タブをクリックして、[追加] をクリックします。

      • 新しいプリンシパル: PROJECT_NUM@cloudbuild.gserviceaccount.com
      • ロール: Secret Manager のシークレット アクセサー
    4. [保存] をクリックします。

GitHub では、個人アクセス トークンに有効期限を設定することを推奨しています。有効期限が設定されている場合は、リマインダー メールが送信されます。引き続きデプロイ プレビューを使用する場合は、トークンを再生成するときに github_token の新しいバージョンを作成します。次のステップのビルダーでは、トークンの最新バージョンが取得されるため、プレビューは引き続き機能します。

Cloud Build の新しいイメージを作成する

「Deployment Preview」通知を pull リクエストに書き込むスクリプトは、Python ドキュメント サンプル内にあります。このスクリプトをソースコードに追加する代わりに、必要に応じて、このスクリプトをプロジェクト内のコンテナにビルドし、そのコンテナを Cloud Build 構成のステップとして実行できます。

Cloud Shell を使用するか、git と Google Cloud CLI をインストールして構成している場合はローカルマシンを使用して、以下の手順を行うことができます。以下の手順では両方の方法を示します。

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. プロジェクトを使用するように Google Cloud CLI を構成します。PROJECT_ID はプロジェクト ID に置き換えます。
    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    Cloud Shell を使用している場合、Google Cloud API 呼び出しを行うために Google Cloud CLI を認可しなければならない場合があります。[承認] をクリックして、このアクションの続行を許可します。
  3. 新しいコンテナ イメージを作成します。
    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/
    gcloud builds submit --tag gcr.io/$PROJECT_ID/deployment-previews run/deployment-previews
    
  4. コンテナが作成されたことを確認します。
    gcloud container images list
    
  5. クローンが作成されたリポジトリを削除します。
    cd ..
    rm -rf python-docs-samples
    

新しい Cloud Build 構成を追加する

リポジトリには、メインブランチで使用される cloudbuild.yaml ファイルがすでに存在します。この新しいトリガーに対して新しい構成を作成します。

  1. GitHub リポジトリ ページで、[Add file] > [Create new file] の順にクリックします。

    1. 新しいファイルに cloudbuild-preview.yaml という名前を付けます。
    2. 以下のコードをコピーして、新しいファイルに貼り付けます。
    steps:
      - id: "build image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "build",
            "-t",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            ".",
          ]
    
      - id: "push image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "push",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
          ]
    
      - id: "deploy revision with tag"
        name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
        entrypoint: "gcloud"
        args:
          [
            "run",
            "deploy",
            "${_SERVICE_NAME}",
            "--platform",
            "managed",
            "--region",
            "${_REGION}",
            "--image",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            "--tag",
            "pr-${_PR_NUMBER}",
            "--no-traffic",
          ]
    
      - id: "link revision on pull request"
        name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
        secretEnv: ["GITHUB_TOKEN"]
        args:
          [
            "set",
            "--project-id",
            "${PROJECT_ID}",
            "--region",
            "${_REGION}",
            "--service",
            "${_SERVICE_NAME}",
            "--pull-request",
            "${_PR_NUMBER}",
            "--repo-name",
            "${REPO_FULL_NAME}",
            "--commit-sha",
            "${SHORT_SHA}",
          ]
    
    substitutions:
      _SERVICE_NAME: myservice
      _REGION: us-central1
    
    options:
      dynamicSubstitutions: true
      logging: CLOUD_LOGGING_ONLY
    
    availableSecrets:
      secretManager:
        - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
          env: "GITHUB_TOKEN"
  2. リポジトリのメインブランチに変更を commit します。

セカンダリ トリガーを作成する

これで準備がすべて整ったため、新しいトリガーを作成します。

  1. 新しい Cloud Build トリガーを作成します(詳細な手順)。

    1. Google Cloud コンソールで、[Cloud Build トリガー] ページに移動します。

      [Cloud Build トリガー] ページに移動

    2. [トリガーを作成] をクリックします。

    3. 次の詳細情報を入力します。

      • 名前: preview-deploy
      • イベント: pull リクエスト
      • ソース リポジトリ: GITHUB_USER_NAME/helloworld-python
      • ベースブランチ: ^main$
      • コメント制御: 必須(オーナーと共同編集者を除く)
        • リポジトリのオーナーの場合、プレビューは作成した pull リクエストに自動的にビルドされます。
        • 誰でも変更をプレビューできるようにする場合は、「必須ではない」を選択した場合のセキュリティへの影響を詳しくご覧ください。
      • 構成: Cloud Build 構成ファイル
      • Cloud Build 構成ファイルの場所: cloudbuild-preview.yaml
    4. [作成] をクリックします。

成功を確認する

新しい pull リクエストが作成されたときに、この新しいトリガーが実行されるので、テストを行うために新しい pull リクエストを作成する必要があります。

  1. リポジトリに移動し、新しいブランチapp.py を視覚的に変更します。
    1. app.py に移動し、鉛筆アイコン()をクリックします。
      ウェブサイト上でファイルを編集するための GitHub インターフェースのスクリーンショット。
    2. 変更を加えます。たとえば、「Hello」を「Greetings」に変更します。
    3. [Create a new branch for this commit and start a pull request] を選択し、[Propose change] をクリックします。
  2. このブランチで新しい pull リクエストを作成します。

    トリガーが正しく構成されている場合は、pull リクエストを作成すると直ちに新しいチェックが表示されます。

    保留のチェックが表示されている GitHub インターフェースのスクリーンショット。
  3. チェックの名前はトリガーの名前とプロジェクト ID です。[Details] > [View more details on Google Cloud Build] をクリックしてビルドの進行状況を確認します。

    トリガーが失敗してビルドを再送信する必要がある場合、または pull リクエストに別の変更を加える場合は、同じブランチに変更を commit する必要があります。pull リクエストに新しい commit が行われるたびに、新しいビルドがトリガーされます。

  4. トリガーが完了すると、pull リクエストに対して「Deployment Preview」という名前の新しいステータス チェックが表示されます。表示されるアイコンは、使用しているトークンがアカウントに所有されているため、アバターです。

    完了のチェックが表示されている GitHub インターフェースのスクリーンショット。
  5. [詳細] をクリックして、プレビューに移動します。表示されている URL は元のサービス URL と同じですが、「pr-1---」の接頭辞が付加されています。

    「Greetings World!」と表示される Cloud Run サービスがデプロイされたプレビューのスクリーンショット

    元のサービス URL に移動すると、元のコンテンツが次のように表示されます。

    引き続き「Hello World!」と表示されている、最初にデプロイされた Cloud Run サービスのスクリーンショット。
  6. サービスのリビジョン リストを表示して、Cloud Run のサービス状態を確認します。現在は元のサービスとプレビューという 2 つのリビジョンがトラフィックを処理しています。

    2 つのアクティブ リビジョンがある Cloud Run コンソールのスクリーンショット。
  7. ブランチに新しい commit を追加して、pull リクエストに引き続き変更を加えます。commit するたびに、preview-deploy トリガーが実行され、サービスの新しいリビジョンが作成されて、同じ URL でそのリビジョンが利用可能になります。

    3 つのリビジョンがある Cloud Run コンソールのスクリーンショット。
  8. 変更のマージの準備が完了したら、[Merge Pull Request] をクリックします。元の prod-deploy トリガーが実行され、pull リクエストからの変更は元の URL に反映されます。

    「Greetings World!」を表示する、新しくデプロイされた Cloud Run サービスのスクリーンショット。

    新しいリビジョンは、メインの URL でトラフィックの 100% を処理しますが、pull リクエストのプレビュー URL は、その pull リクエストに対する最新の commit に引き続き添付されるため、リンクは引き続き機能します。

    4 つのリビジョンがある Cloud Run コンソールのスクリーンショット

制限事項

作成できるリビジョン URL の数には上限があります。リポジトリの pull リクエストが 1,000 件を超えると思われる場合は、cloudbuild-cleanup.yaml に示すように、タグをクリーンアップするプロセスを検討してください。

コードについて

cloudbuild.yaml

このコードは、Cloud Build が提供するサンプル cloudbuild.yaml に基づいていますが、重要な更新(update-traffic を実行する 4 つ目のステップ)があります。

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  logging: CLOUD_LOGGING_ONLY

cloudbuild.yaml の構成では、トラフィック分割が変更されます。--to-latest パラメータは、Cloud Run ページの [このリビジョンをすぐに利用する] チェックボックスと同じ機能を提供します。これにより、このサービスのリビジョンがすぐに 100% のトラフィックを処理します。

cloudbuild-preview.yaml

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
      ]

  - id: "deploy revision with tag"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        "--tag",
        "pr-${_PR_NUMBER}",
        "--no-traffic",
      ]

  - id: "link revision on pull request"
    name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "set",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--pull-request",
        "${_PR_NUMBER}",
        "--repo-name",
        "${REPO_FULL_NAME}",
        "--commit-sha",
        "${SHORT_SHA}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

このコードは cloudbuild.yaml に似ていますが、追加の手順を使用します。

  1. サービス イメージのビルドと push 後に、cloudbuild-preview.yaml--no-traffic フラグを使用してサービスをデプロイします。つまり、これが最新のリビジョンですが、トラフィックの処理には使用されていません。

  2. cloudbuild-preview.yaml は、pull リクエスト番号に基づいてカスタムタグを追加します。この場合、先頭に「pr-」が付き、pull リクエストの数で終わる文字列です。

    この時点で、リビジョン URL は機能しますが、GitHub 自体では Cloud Build ログが表示されず、ログへのリンクのみが表示されるため、pull リクエストを送信したユーザーは、この URL を確認することはできません。十分な権限を持つ Cloud Build プロジェクトの認証済みユーザーのみがログを確認できます。

  3. cloudbuild-preview.yaml は、Cloud Build に用意された組み込みの置換パラメータを使用して check_status.py スクリプトを実行します。pull リクエスト番号、リポジトリ名、commit SHA など、GitHub リポジトリで作業する際にいくつかのパラメータを使用できます。

このトリガーを再実行するには、GitHub で別の commit を送信してください。このトリガーは、コンソールの Cloud Build ページから再実行できません。

cloudbuild-cleanup.yaml


steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

  # Cleanup tags against closed pull requests
  - id: "clean up old tag"
    name: "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "cleanup",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--repo-name",
        "${REPO_FULL_NAME}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

このコードは、cloudbuild.yaml に代わるもので、クリーンアップ機能が追加されています。初期手順でデプロイが実行され、機能が次のように拡張されます。

  1. Discovery API と GitHub API を使用して、クローズ pull リクエスト用のサービスのタグを特定します。少なくとも、マージされた pull リクエストが存在するため、このトリガーが実行されます。

  2. 特定されたタグを削除します。

check_status.py

def set(
    dry_run: str,
    project_id: str,
    region: str,
    service: str,
    repo_name: str,
    commit_sha: str,
    pull_request: str,
) -> None:
    """Set a status on a GitHub commit to a specific revision URL"""
    service_obj = get_service(project_id, region, service)
    revision_url = get_revision_url(service_obj, tag=make_tag(pull_request))

    ghtoken = os.environ.get("GITHUB_TOKEN", None)

    if not ghtoken:
        raise ValueError("GITHUB_TOKEN not defined.")

    try:
        repo = github.Github(ghtoken).get_repo(repo_name)
    except GithubException as e:
        error(
            e.data["message"],
            context=f"finding repo {repo_name}. Is it a private repo, and does your token have the correct permissions?",
        )

    try:
        commit = repo.get_commit(sha=commit_sha)
    except GithubException as e:
        error(e.data["message"], context=f"finding commit {commit_sha}")

    # ...

    commit.create_status(
        state="success",
        target_url=revision_url,
        context=f"Deployment Preview for {service}",
        description="Your preview is now available.",
    )
    click.secho("Success: ", fg="green", bold=True, nl=False)
    click.echo(
        f"Status created on {repo_name}, commit {commit.sha[:7]}, "
        f"linking to {revision_url} on service {service_obj['metadata']['name']}"
    )

check_status.py スクリプトは、Cloud Run サービス、GitHub リポジトリおよび commit に関する提供された情報を取得し、次のオペレーションを行います。

  • Google API Python クライアントを使用して、サービス名、タグ、リビジョン URL を取得します。
  • Secret Manager が提供する環境変数から GitHub トークンを取得します。
  • Python 用 GitHub Client API を使用して、特定の commit にステータスを作成し、取得したリビジョン URL にリンクします。

クリーンアップ

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。さらに、このチュートリアル用に作成した GitHub の構成も削除する必要があります。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

チュートリアル リソースを削除する

  1. このチュートリアルでデプロイした Cloud Run サービスを削除します。

    1. Cloud Run コンソールに移動します。
    2. [myservice] リストを選択し、[Delete] をクリックします。
    3. 確認ダイアログで [Delete] をクリックします。
  2. このチュートリアルで作成した他の Google Cloud リソースを削除します。

チュートリアル構成を削除する

GitHub の構成をクリーンアップするには、Google Cloud Build アプリケーションを GitHub から削除する必要があります。

  1. GitHub アプリケーションの設定に移動します。
  2. [Google Cloud Build] のリストで、[Configure] をクリックします。
  3. [Danger Zone] セクションで、[アンインストール] をクリックします。
  4. 確認ダイアログで [Okay] をクリックします。

作成した GitHub トークンも削除する必要があります。

  1. GitHub の個人アクセス トークン ページに移動します。
  2. [preview-deploy] リストで、[Delete] をクリックします。
  3. 確認ダイアログで [I understand, delete this token] をクリックします。

GitHub リポジトリも削除する必要があります。

  1. 作成した GitHub リポジトリに移動し、[設定] タブをクリックします。
  2. [Danger Zone] セクションで、[このリポジトリを削除] をクリックします。
  3. 確認ダイアログでリポジトリの完全な名前を入力し、[I understand the consequences, delete this repository] をクリックします。

次のステップ