Bitbucket Server からのリポジトリのビルド

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

始める前に

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

    API を有効にする

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

設定

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

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

SSH 認証鍵を作成する

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

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

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

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

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

    ssh-keygen -t rsa -b 4096 -N '' -C BITBUCKET_SERVER_HOST/REPOSITORY -f id_bitbucket
    

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

Bitbucket Server で SSH アクセスを有効にする

サーバーのユーザーが自分の SSH 認証鍵を追加し、その SSH 認証鍵を使用してパソコンと Bitbucket Server インスタンス間で Git オペレーションを保護するために、Bitbucket Server で SSH アクセスを有効にする必要があります。Bitbucket Server で SSH を使用する方法については、Bitbucket Server での Git リポジトリへの SSH アクセスの有効化をご覧ください。

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

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

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

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

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

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

  1. Cloud Console の [シークレット マネージャー] ページに移動します。

    シークレット マネージャー ページに移動

  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 トリガーの作成

Console

Google Cloud Console を使用して Bitbucket Server からビルドする Webhook トリガーを作成するには、以下を行います。

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

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

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

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

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

    • 名前: トリガーの名前。
    • 説明(省略可): トリガーの説明。
    • イベント: [Webhook イベント] を選択して、受信 Webhook イベントにレスポンスしてビルドを開始するトリガーを設定します。
    • Webhook URL: Webhook URL を使用して、受信 Webhook イベントを認証します。

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

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

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

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

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

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

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

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

        既存のシークレットを使用する場合は、Secret Manager のシークレット アクセサーのロールを Cloud Build サービス アカウント ${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 イベントを呼び出すことができます。

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

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

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

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

      次の例では、インライン ビルド構成により、SSH 認証鍵を使用して Bitbucket Server への接続を認証し、指定されたリポジトリにアクセスします。その後、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 -p BITBUCKET_PORT BITBUCKET_HOST > /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'
          - 'ssh://BITBUCKET_HOST:BITBUCKET_PORT/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_HOST は Bitbucket リポジトリのホスト名です。
      • BITBUCKET_PORT は Bitbucket リポジトリの SSH ポート(通常は 7999)です。
      • BITBUCKET_REPO は、Bitbucket リポジトリへのパスです。
      • PATH_TO_SECRET_VERSION は、Secret Manager に保存されている Secret のバージョンへのパスです。これは、SSH 認証鍵を含む Secret です。例: projects/project-id/secrets/secret-name/versions/1
      • SSHKEY は、環境の名前です(この場合は、シークレットへのパスを保存するために使用)。
    • 置換(省略可): このフィールドを使用して、トリガー固有の置換変数を定義できます。

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

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

      変数の名前 変数の値
      _BRANCH $(body.changes[0].refId)
      _TO_SHA $(body.changes[0].toHash)

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

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

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

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

      • _BRANCH == refs/heads/main

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

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

gcloud

Bitbucket Server からビルドする Webhook トリガーを作成するには、gcloud alpha コマンドを実行します。下の例では、置換変数(_BRANCH)で定義された指定ペイロードに基づいて、refs/heads/main に一致するブランチを持つビルドに応答するようにトリガーが構成されています。

     gcloud alpha builds triggers create webhook \
       --name=TRIGGER_NAME \
       --repo=PATH_TO_REPO \
       --secret=PATH_TO_SECRET \
       --subtitutions=\
         _BRANCH='$(body.changes[0].refId)', TO_SHA='$(body.changes[0].refId)'
       --filter='_BRANCH == refs/heads/main'
       --inline-config=PATH_TO_INLINE_BUILD_CONFIG
       --branch=BRANCH_NAME

ここで

  • TRIGGER_NAME はトリガーの名前です。
  • PATH_TO_REPO は、ビルドを呼び出すリポジトリへのパスです。例: https://www.github.com/owner/repo
  • PATH_TO_SECRET は、Secret Manager に保存されているシークレットへのパスです。例: projects/my-project/secrets/my-secret/versions/2
  • PATH_TO_INLINE_BUILD_CONFIG は、インライン ビルド構成へのパスです。

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

Bitbucket Server に Webhook を作成する

Bitbucket Server が Cloud Build にリクエストを行うには、Webhook の作成の手順に沿って、Bitbucket Server に Webhook を作成する必要があります。

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

次のステップ