Bitbucket Cloud からリポジトリをビルドする

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

このページでは、Webhook トリガーを使用して Bitbucket Cloud でビルドする方法について説明します。

始める前に

  • Cloud Build and Secret Manager API を有効にします。

    API を有効にする

  • このページで gcloud コマンドを使用するには、Google Cloud CLI をインストールします。

設定

Bitbucket Cloud でビルドする Webhook トリガーを作成する前に、Bitbucket Cloud への接続を認証するために SSH 認証鍵を作成する必要があります。関連付けられたリポジトリが存在しない状態でトリガーを作成し、Bitbucket Cloud などの外部ソースコード管理システムでコードにアクセスする場合は、インライン ビルド構成で SSH 認証鍵を取得する必要があります。

このセクションでは、Webhook トリガーを作成する前に SSH 認証鍵を作成して保存する方法について説明します。

SSH 認証鍵を作成する

Bitbucket Cloud でコードにアクセスするには、インライン ビルド構成で SSH 認証鍵を取得する必要があります。

SSH 認証鍵を作成するには:

  1. ターミナル ウィンドウを開きます。

  2. working-dir という名前で新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir working-dir
    cd working-dir
    
  3. 新しい Bitbucket Cloud SSH 認証鍵を作成します。bitbucket.org は Bitbucket Cloud リポジトリの URL です。

    ssh-keygen -t rsa -b 4096 -N '' -C bitbucket.org -f id_bitbucket
    

    このコマンドは、working-dir/id_bitbucket で新しい SSH 認証鍵をパスフレーズなしで作成します。SSH 認証鍵がパスフレーズで保護されている場合、Cloud Build はその鍵を使用できません。

Bitbucket Cloud に公開 SSH アクセスキーを追加する

Bitbucket Cloud で管理されているリポジトリで他のシステムが行うオペレーションを保護するために、公開 SSH アクセスキーを Bitbucket Cloud に追加して、キーに読み取り権限を付与する必要があります。キーを追加する方法については、アクセスキーの追加をご覧ください。

Secret Manager での認証情報の作成と保存

SSH 認証鍵を作成すると、ローカル環境内に id_bitbucket ファイルが作成されます。このファイルには認証に関連する機密情報が含まれているため、ファイルを使用してビルドを呼び出す前に Secret Manager に保存する必要があります。

Webhook トリガーを作成するときに使用する Secret のほかに、Secret Manager で Secret を作成して、Cloud Build への受信 Webhook イベントを検証して許可する必要もあります。

Secret Manager で認証情報を作成して保存するには:

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

    [Secret Manager] ページに移動

  2. [シークレット マネージャー] ページで、[シークレットを作成] をクリックします。

  3. [Secret の作成] ページの [名前] に、Secret の名前を入力します。

  4. [Secret の値] で、Secret の名前を入力するか、ファイルをアップロードします。

    SSH 認証鍵ファイルをアップロードするには、[アップロード] をクリックして working-dir/id_bitbucket ファイルを含めます。

  5. [リージョン] セクションは変更しません。

  6. [Secret の作成] ボタンをクリックして、Secret を作成します。

Secret を作成すると、Google Cloud Console で Secret Manager のシークレット アクセサーのロールが Cloud Build サービス アカウント ${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com に自動的に付与されます。このロールがサービス アカウントに表示されていない場合は、サービス アカウントに Secret Manager のロールを付与するで説明されている手順を実行してください。

これで SSH 認証鍵が保存されました。次のコマンドを実行して、環境から SSH 認証鍵を削除することもできます。

rm id_bitbucket*

これで、Webhook トリガーを作成する準備ができました。

Webhook トリガーの作成

コンソール

Google Cloud Console を使用して Bitbucket Cloud からビルドを呼び出す Webhook トリガーを作成するには、次のとおり操作します。

  1. [トリガー] ページを開く

    [ビルドトリガー] ページを開く

  2. ページ上部でプロジェクトを選択し、[開く] をクリックします。

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

  4. 次のトリガー設定を入力します。

    • 名前: トリガーの名前。
    • リージョン: トリガーのリージョンを選択します。

      • リージョンとしてグローバルを選択した場合、Cloud Build はビルドを実行するためにデフォルトのプールを使用します。
      • 非グローバル リージョンを選択して、トリガーに関連付けられたビルド構成ファイルでプライベート プールを指定すると、Cloud Build はプライベート プールを使用してビルドを実行します。この場合、トリガーで指定するリージョンは、プライベート プールを作成したリージョンと一致する必要があります。
      • 非グローバル リージョンを選択し、トリガーに関連付けられたビルド構成ファイルでプライベート プールが指定されていない場合、Cloud Build はデフォルトのプールを使用してトリガーと同じリージョンでビルドを実行します。
    • 説明(省略可): トリガーの説明。

    • イベント: [Webhook イベント] を選択して、受信 Webhook イベントにレスポンスしてビルドを開始するトリガーを設定します。

    • Webhook URL: Webhook URL を使用して、受信 Webhook イベントを認証します。

      • シークレット: 受信 Webhook イベントを認証するためのシークレットが必要になります。新しいシークレットを作成することも、既存のシークレットを使用することもできます。 このシークレットは SSH 認証鍵に関連付けられたシークレットとは別のものです。

        新しいシークレットを作成するには:

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

          [Webhook シークレットの作成] ポップアップ ボックスが表示されます。

        3. [シークレット名] フィールドにシークレットの名前を入力します。

        4. [シークレットを作成] をクリックしてシークレットを保存します。クリックすると、シークレットが自動的に作成され Secret Manager に保存されます。

        既存の Secret を使用するには:

        1. [既存のものを使用] を選択します。
        2. [シークレット] フィールドで、使用するシークレットの名前をプルダウン メニューから選択するか、指示に従ってリソース ID でシークレットを追加します。
        3. [シークレットのバージョン] フィールドで、プルダウン メニューからシークレットのバージョンを選択します。

        既存のシークレットを使用する場合は、Secret Manager のシークレット アクセサーのロールを Cloud Build サービス アカウント service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com に手動で付与する必要があります。詳しくは、サービス アカウントに Secret Manager のロールを付与するをご覧ください。

      シークレットを作成または選択すると、Webhook URL のプレビューが表示されます。URL には、Cloud Build によって生成された API キーとシークレットが含まれます。Cloud Build で API キーを取得できない場合は、手動で API キーを URL に追加するか、API キーの取得方法(API キーがない場合)をご覧ください。

      この URL を使用して POST メソッドで HTTP リクエストを行うことで、Webhook イベントを呼び出すことができます。

      リージョンとしてグローバルを選択した場合、Webhook イベントを呼び出すには、次のコマンドを使用します。

      curl -X POST -H "application/json" "https://cloudbuild.googleapis.com/v1/projects/${PROJECT_ID}/triggers/${TRIGGER_NAME}:webhook?key=${API_KEY}&secret=${SECRET_VALUE}" -d "{}"
      

      us-central1 などの非グローバルなリージョンを選択する場合は、次のコマンドを使用して Webhook イベントを呼び出します。

      curl -X POST -H "application/json" "https://cloudbuild.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/triggers/${TRIGGER_NAME}:webhook?key=${API_KEY}&secret=${SECRET_VALUE}&trigger=${TRIGGER_NAME}&projectId=${PROJECT_ID}" -d "{}"
      

      Bitbucket Cloud で Webhook を作成する際に URL を使用する方法については、Bitbucket Cloud で Webhook を作成するをご覧ください。

    • ソース(省略可): Webhook トリガーの実行時にビルドするリポジトリ。この項目は空白のままにしておきます。この例では、ビルド構成はインライン ビルド構成であるため、ソースは必要ありません。

    • ビルド構成: Google Cloud Console でインライン ビルド構成を作成します。

      次の例では、インライン ビルド構成により、SSH 認証鍵を使用して Bitbucket Cloud への接続を認証し、指定されたリポジトリにアクセスします。その後、Webhook を呼び出した commit をチェックアウトします。

      steps:
      # first, setup SSH:
      # 1- save the SSH key from Secret Manager to a file
      # 2- add the host key to the known_hosts file
      - name: gcr.io/cloud-builders/git
        args:
          - '-c'
          - |
            echo "$$SSHKEY" > /root/.ssh/id_rsa
            chmod 400 /root/.ssh/id_rsa
            ssh-keyscan bitbucket.org > /root/.ssh/known_hosts
        entrypoint: bash
        secretEnv:
          - SSHKEY
        volumes:
          - name: ssh
            path: /root/.ssh
      # second, clone the repository
      - name: gcr.io/cloud-builders/git
        args:
          - clone
          - '-n'
          - 'git@bitbucket.org/BITBUCKET_REPO'
          - .
        volumes:
          - name: ssh
            path: /root/.ssh
      # third, checkout the specific commit that invoked this build
      - name: gcr.io/cloud-builders/git
        args:
          - checkout
          - $_TO_SHA
      availableSecrets:
        secretManager:
        - versionName: PATH_TO_SECRET_VERSION
          env: SSHKEY
      

      ここで

      • BITBUCKET_REPO は、Bitbucket リポジトリへのパスです。
      • PATH_TO_SECRET_VERSION は、Secret Manager に保存されている Secret のバージョンへのパスです。これは、SSH 認証鍵を含む Secret です。例: projects/project-id/secrets/secret-name/versions/1
      • SSHKEY は、この場合 Secret のパスを格納するために使用される環境変数の名前です。
    • 置換(省略可): このフィールドを使用して、トリガー固有の置換変数を定義できます。

      この例では、commit ID に関連付けられた特定のブランチ名を監視し、ビルド定義でそのブランチ名に切り替える必要があるとします。このデータを取得するには、ペイロード バインディングを使用して置換変数を作成し、ブランチ名を保存します。

      以下の変数と値を指定します。

      変数の名前 変数の値
      _BRANCH $(body.push.changes[0].new.name)
      _TO_SHA $(body.push.changes[0].new.target.hash)

      Bitbucket Cloud イベントに関連付けられたペイロードを表示するには、イベント ペイロードをご覧ください。

    • フィルタ(省略可): 置換変数に基づいてビルドを実行するかどうかを決定するルールをトリガー内に作成できます。

      ブランチ名が main と一致する場合にトリガーでビルドを実行することを必要とするため、「==」演算子を使用して完全一致を確認できます。「一致」キーワードを使用して正規表現一致の対象にすることもできます。

      フィルタとして以下を指定します。

      • _BRANCH == refs/heads/main

      Webhook トリガーに適用できるフィルタリングの構文の例については、CEL を使用したビルドイベントのフィルタリングをご覧ください。

  5. [作成] をクリックしてビルドトリガーを作成します。

gcloud

Bitbucket Cloud からビルドを呼び出す Webhook トリガーを作成するには、以下を行います。

     gcloud alpha builds triggers create webhook \
       --name=TRIGGER_NAME \
       --secret=PATH_TO_SECRET \
       --substitutions='' \
       --filter='' \
       --inline-config=PATH_TO_INLINE_BUILD_CONFIG \ # or --repo=PATH_TO_REPO
       --branch=BRANCH_NAME #  or --tag=TAG_NAME

ここで

  • TRIGGER_NAME はトリガーの名前です。
  • PATH_TO_SECRET は、Secret Manager に保存されているシークレットへのパスです。例: projects/my-project/secrets/my-secret/versions/2
  • PATH_TO_INLINE_BUILD_CONFIG は、インライン ビルド構成へのパスです。ビルド構成は、作成しているトリガーにインラインで保存されますが、ここにある構成パスはローカル ファイルから pull されます。
  • PATH_TO_REPO は、ビルドを呼び出すリポジトリへのパスです。例: https://bitbucket.org/username/repo-slugリポジトリ URL は、Cloud Build 接続リポジトリでなければなりません。

  • BRANCH_NAME は、ブランチでビルドのトリガーを設定する場合、ブランチの名前です。

  • TAG_NAME は、タグでビルドのトリガーを設定する場合、タグの名前です。

Bitbucket Cloud での Webhook の作成

Bitbucket Cloud が Cloud Build にリクエストを行うように設定するには、Webhook の作成とトリガーで概説している手順に沿って、Bitbucket Cloud 内に Webhook を作成する必要があります。

これで、リポジトリの更新が Webhook で指定したトリガー イベントと一致するたびに、Cloud Build Webhook トリガーによって自動的にビルドが呼び出されるようになりました。

次のステップ