GitLab Enterprise Edition ホストへの接続

このページでは、GitLab Enterprise Edition ホストを Cloud Build に接続する方法について説明します。

準備

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

    API を有効にする

ホストの要件

  • GitLab Enterprise Edition Server インスタンスをまだインストールしていない場合、手順については、GitLab Enterprise Edition のインストール ガイドをご覧ください。

    GitLab Enterprise Edition Server インスタンスをインストールする手順を実行する場合は、次の点に注意してください。

    • HTTPS プロトコルを処理するようにホストを構成する必要がありますHTTP プロトコルで構成されたホストはサポートされていません。

    • Google Cloud からホストにアクセスするために使用される URL を使用して、ホストを構成する必要があります。詳細については、GitLab ドキュメントで外部 URL の構成をご覧ください。

必要な IAM 権限

GitLab Enterprise Edition ホストに接続するには、Cloud Build 接続管理者(roles/cloudbuild.connectionAdmin)のロールをユーザー アカウントに付与します。

必要なロールをユーザー アカウントに追加するには、Cloud Build リソースへのアクセス権を構成するをご覧ください。Cloud Build に関係する IAM ロールの詳細については、IAM ロールと権限をご覧ください。

GitLab Enterprise Edition インスタンスがプライベート ネットワークでホストされている場合は、プライベート ネットワークで GitLab Enterprise Edition からリポジトリをビルドするを参照して、ホストに接続する前に必要な追加の IAM ロールについてご確認ください。

GitLab Enterprise Edition ホストへの接続

GitLab Enterprise Edition インスタンスのホスト接続を作成する前に、次の手順を実行して、GitLab Enterprise Edition で個人用アクセス トークンを作成する必要があります。

  1. GitLab Enterprise Edition インスタンスにログインします。

  2. インスタンスの GitLab Enterprise Edition ページで、右上隅のアバターをクリックします。

  3. [プロフィールを編集] をクリックします。

  4. 左側のサイドバーで [アクセス トークン] を選択します。

    [個人用アクセス トークン] ページが表示されます。

  5. スコープが api のアクセス スコープを作成して、リポジトリの接続と切断に使用します。

  6. スコープが read_api のアクセス トークンを作成して、Cloud Build リポジトリがリポジトリ内のソースコードにアクセスできるようにします。

コンソール

GitLab Enterprise Edition ホストを Cloud Build に接続するには:

  1. Google Cloud コンソールで [リポジトリ] ページを開きます。

    [リポジトリ] ページを開く

    [リポジトリ] ページが表示されます。

  2. ページ上部の [第 2 世代] タブを選択します。

  3. 上部のバーにあるプロジェクト セレクタで、Google Cloud プロジェクトを選択します。

  4. [ホスト接続を作成] をクリックして、新しいホストを Cloud Build に接続します。

  5. 左側のパネルで、ソース プロバイダとして [GitLab] を選択します。

  6. [接続の構成] セクションで、次の情報を入力します。

    1. [リージョン]: 接続のリージョンを選択します。

    2. [名前]: 接続の名前を入力します。

  7. [ホストの詳細] セクションで、次の情報を選択または入力します。

    1. GitLab プロバイダ: プロバイダとして [セルフマネージド GitLab Enterprise Edition] を選択します。

    2. ホスト URL: 接続のホスト URL を入力します。例: https://my-gle-server.net

    3. CA 証明書: [参照] をクリックして、自己署名証明書をアップロードします。

    4. [接続タイプ] で、次のいずれかのオプションを選択します。

      1. 公共のインターネット: インスタンスに公共のインターネット経由でアクセスできる場合は、このオプションを選択します。

      2. プライベート ネットワーク アクセス: インスタンスがプライベート ネットワークにホストされている場合は、このオプションを選択します。

      3. [Service Directory サービス] で、サービスのロケーションを選択します。

        • プロジェクト your-project
        • 別のプロジェクト内
        • 手動で入力
        1. [別のプロジェクト内] か [手動で入力] を選択した場合は、次の情報を入力します。

          • プロジェクト: プルダウン メニューから Google Cloud プロジェクト ID を入力または選択します。

          • リージョン: このフィールドは、接続のリージョンを事前に選択します。サービス用に指定されるリージョンは、接続に関連付けられたリージョンと一致する必要があります。

        2. 名前空間: サービスの名前空間を選択します。

        3. サービス: 名前空間内のサービス名を選択します。

  8. [個人用アクセス トークン] セクションで、次の情報を入力します。

    1. API アクセス トークン: スコープ アクセスが api のトークンを入力します。このトークンは、リポジトリの接続と切断に使用されます。

    2. Read API アクセス トークン: スコープ アクセスが read_api のトークンを入力します。Cloud Build トリガーは、このトークンを使用してリポジトリ内のソースコードにアクセスします。

  9. [Connect] をクリックします。

    [接続] ボタンをクリックすると、個人用アクセス トークンが Secret Manager に安全に保存されます。ホスト接続後、Cloud Build はユーザーに代わって Webhook シークレットも作成します。[Secret Manager] ページでシークレットを表示、管理できます。シークレットは、Secret Manager ページで確認および管理できます。

これで GitLab Enterprise Edition 接続が正常に作成されました。

gcloud

GitLab Enterprise Edition ホストを Cloud Build に接続する前に、次の手順を行って認証情報を保存します。

  1. Secret Manager にトークンを保存します

  2. 次のコマンドを実行して、Secret Manager で Webhook シークレットを作成します。

     cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create my-gle-webhook-secret --data-file=-
    
  3. ホスト接続の作成に使用するように計画するプロジェクトとは異なる Google Cloud プロジェクトにシークレットを保存する場合は、次のコマンドを入力して、プロジェクトが Cloud Build サービス エージェントにアクセスできるようにします。

    PN=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:CLOUD_BUILD_SERVICE_AGENT \
      --role="roles/secretmanager.admin"
    

    ここで

    • PROJECT_ID はユーザーの Google Cloud プロジェクト ID です。
    • CLOUD_BUILD_SERVICE_AGENT は Cloud Build サービス アカウントです。

これで GitLab Enterprise Edition ホストを Cloud Build に接続できるようになりました。

次の手順を行います。

  1. 次のコマンドを入力して、GitLab Enterprise Edition の接続を作成します。

    gcloud builds connections create gitlab CONNECTION_NAME \
      --host-uri=HOST_URI \
      --project=PROJECT_ID \
      --region=REGION \
      --authorizer-token-secret-version=projects/PROJECT_ID/secrets/API_TOKEN/versions/SECRET_VERSION \
      --read-authorizer-token-secret-version=projects/PROJECT_ID/secrets/READ_TOKEN/versions/SECRET_VERSION \
      --webhook-secret-secret-version=projects/PROJECT_ID/secrets/WEBHOOK_SECRET/versions/SECRET_VERSION
    

    ここで

    • CONNECTION_NAME は接続の名前です。
    • HOST_URI は GitLab Enterprise Edition インスタンスの URI です。例: https://my-gle-server.net
    • PROJECT_ID はユーザーの Google Cloud プロジェクト ID です。
    • REGION は、接続のリージョンです。
    • API_TOKEN は、スコープが api のトークンの名前です。
    • READ_TOKEN は、スコープが read_api のトークンの名前です。
    • SECRET_VERSION は、シークレットのバージョンです。
    • WEBHOOK_SECRET は Webhook シークレットです。

これで GitLab Enterprise Edition 接続が正常に作成されました。

Terraform

Terraform を使用して GitLab Enterprise Edition ホストを Cloud Build に接続できます。

次の例では、コード スニペットによって次のことが行われます。

  • Terraform の Google プロバイダを構成する
  • GitLab Enterprise Edition の個人用アクセス トークンを保存するシークレットを作成する
  • Cloud Build サービス エージェントにシークレットへのアクセスに必要な権限を付与します。
  • GitLab Enterprise Edition 接続を作成する

    // Configure the Terraform Google provider
    terraform {
      required_providers {
        google = {}
      }
    }
    
    // Create secrets and grant permissions to the service sgent
    resource "google_secret_manager_secret" "api-pat-secret" {
        project = "PROJECT_ID"
        secret_id = "GITLAB_PAT_API"
    
        replication {
            automatic = true
         }
     }
    
     resource "google_secret_manager_secret_version" "api-pat-secret-version" {
         secret = google_secret_manager_secret.api-pat-secret.id
         secret_data = "GITLAB_API_TOKEN"
     }
    
     resource "google_secret_manager_secret" "read-pat-secret" {
         project = "PROJECT_ID"
         secret_id = "GITLAB_PAT_READ"
    
         replication {
             automatic = true
         }
    }
    
    resource "google_secret_manager_secret_version" "read-pat-secret-version" {
        secret = google_secret_manager_secret.pat-secret.id
        secret_data = "GITLAB_API_TOKEN"
    }
    
    resource "google_secret_manager_secret" "webhook-secret-secret" {
        project = "PROJECT_ID"
        secret_id = "WEBHOOK_SECRET"
    
        replication {
            automatic = true
        }
    }
    
    resource "google_secret_manager_secret_version" "webhook-secret-secret-version" {
        secret = google_secret_manager_secret.webhook-secret-secret.id
        secret_data = "WEBHOOK_SECRET_VALUE"
    }
    
    data "google_iam_policy" "serviceagent-secretAccessor" {
        binding {
            role = "roles/secretmanager.secretAccessor"
            members = ["serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"]
        }
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-pak" {
      project = google_secret_manager_secret.private-key-secret.project
      secret_id = google_secret_manager_secret.private-key-secret.secret_id
      policy_data = data.google_iam_policy.serviceagent-secretAccessor.policy_data
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-rpak" {
      project = google_secret_manager_secret.webhook-secret-secret.project
      secret_id = google_secret_manager_secret.webhook-secret-secret.secret_id
      policy_data = data.google_iam_policy.serviceagent-secretAccessor.policy_data
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-whs" {
      project = google_secret_manager_secret.webhook-secret-secret.project
      secret_id = google_secret_manager_secret.webhook-secret-secret.secret_id
      policy_data = data.google_iam_policy.serviceagent-secretAccessor.policy_data
    }
    
    // Create the connection and add the repository resource
    resource "google_cloudbuildv2_connection" "my-connection" {
        project = "PROJECT_ID"
        location = "REGION"
        name = "CONNECTION_NAME"
    
        gitlab_config {
            authorizer_credential {
                user_token_secret_version = google_secret_manager_secret_version.pat-secret-version.id
            }
            read_authorizer_credential {
                 user_token_secret_version = google_secret_manager_secret_version.pat-secret-version.id
            }
            webhook_secret_secret_version = google_secret_manager_secret_version.webhook-secret-secret-version.id
        }
    
        depends_on = [
            google_secret_manager_secret_iam_policy.policy-pak,
            google_secret_manager_secret_iam_policy.policy-rpak,
            google_secret_manager_secret_iam_policy.policy-whs
        ]
    }
    

ここで

  • PROJECT_ID はユーザーの Google Cloud プロジェクト ID です。
  • GITLAB_PAT_API は、api アクセス権を持つ個人用アクセス トークンです。
  • GITLAB_API_TOKEN は、個人用のアクセス トークンです。
  • GITLAB_PAT_READ は、read_api アクセス権を持つ個人用アクセス トークンです。
  • WEBHOOK_SECRET は、Webhook シークレット値を含むシークレット名です。
  • WEBHOOK_SECRET_VALUE は Webhook シークレットの値です。
  • REGION は、接続のリージョンです。
  • CONNECTION_NAME は、GitLab Enterprise Edition の接続の名前です。
  • URI は、接続の URI です。例: https://my-gitlab-enterprise-server.netこれで GitLab Enterprise Edition 接続が正常に作成されました。

次のステップ