连接到 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 访问主机的同一网址来配置主机。如需了解详情,请参阅有关配置外部网址的 GitLab 文档。

必需的 IAM 权限

如需连接您的 GitLab Enterprise Edition 主机,请向您的用户帐号授予 Cloud Build Connection Admin (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. 在左侧边栏中,选择访问令牌

    您将看到 Personal Access Tokens(个人访问令牌)页面。

  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. 主机网址:输入连接的主机网址。例如 https://my-gle-server.net

    3. CA 证书:点击“浏览”以上传您的自签名证书。

    4. 连接类型下,选择以下选项之一:

      1. 公共互联网:如果实例可通过公共互联网访问,请选择此选项。

      2. 专用网络访问:如果实例托管在专用网络中,请选择此选项。

      3. Service Directory 服务下,选择服务的位置:

        • 在项目 your-project
        • 在其他项目中
        • 手动输入
        1. 如果您选择在其他项目中手动输入,请输入以下信息:

          • 项目:从下拉菜单中选择您的 Google Cloud 项目 ID。

          • 区域:此字段会预先选择您的连接所在的区域。为您的服务指定的区域必须与您的连接关联的区域一致。

        2. 命名空间:选择服务的命名空间。

        3. Service:选择命名空间中的服务名称。

  8. 个人访问令牌部分中,输入以下信息:

    1. API 访问令牌:输入具有 api 范围访问权限的令牌。此令牌用于与代码库建立连接和断开连接。

    2. 读取 API 访问令牌:输入具有 read_api 范围访问权限的令牌。Cloud Build 触发器使用此令牌访问代码库中的源代码。

  9. 点击连接

    点击连接按钮后,您的个人访问令牌安全地存储在 Secret Manager 中。主机连接之后,Cloud Build 还会代表您创建网络钩子密钥。您可以在 Secret Manager 页面上查看和管理 Secret。您可以在 Secret Manager 页面上查看和管理您的 Secret。

您现在已成功创建 GitLab Enterprise Edition 连接。

gcloud

在将 GitLab Enterprise Edition 主机连接到 Cloud Build 之前,请完成以下步骤以存储您的凭据:

  1. 将令牌存储在 Secret Manager 中

  2. 运行以下命令,在 Secret Manager 中创建 webhook Secret

     cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create my-gle-webhook-secret --data-file=-
    
  3. 如果将密钥存储在您计划用于创建主机连接的 Google Cloud 项目以外的 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 是您的网络钩子密钥。

您现在已成功创建 GitLab Enterprise Edition 连接。

Terraform

您可以使用 Terraform 将 GitLab Enterprise Edition 主机连接到 Cloud Build。

在以下示例中,代码段将执行以下操作:

  • 配置 Terraform Google 提供方
  • 创建一个密钥来存储您的 GitLab Enterprise Edition 个人访问令牌
  • 向 Cloud Build Service Agent 授予访问密钥的必要权限
  • 创建 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 是包含您的网络钩子密钥值的 Secret 名称。
  • WEBHOOK_SECRET_VALUE 是网络钩子密钥的值。
  • REGION 是您的连接所在的区域
  • CONNECTION_NAME 是 GitLab Enterprise Edition 连接的名称。
  • URI 是您的连接的 URI。例如 https://my-gitlab-enterprise-server.net。您现在已成功创建 GitLab Enterprise Edition 连接。

后续步骤