Conectar-se a um host do GitLab Enterprise Edition

Nesta página, explicamos como se conectar ao host do GitLab Enterprise Edition ao Cloud Build.

Antes de começar

  • Ative as APIs Cloud Build and Secret Manager.

    Ative as APIs

Requisitos de host

  • Se você não instalou uma instância do GitLab Enterprise Edition Server, consulte o guia de instalação do GitLab Enterprise Edition (em inglês) para instruções.

    Ao seguir as instruções para instalar uma instância do GitLab Enterprise Edition Server, observe o seguinte:

    • Você precisa configurar o host para lidar com o protocolo HTTPS. Os hosts configurados com o protocolo HTTP não são compatíveis.

    • É necessário configurar o host com o mesmo URL usado para acessá-lo no Google Cloud. Para saber mais, consulte a documentação do GitLab sobre como configurar o URL externo.

Permissões do IAM obrigatórias

Para conectar o host do GitLab Enterprise Edition, conceda o papel de Administrador de conexão do Cloud Build (roles/cloudbuild.connectionAdmin) à sua conta de usuário.

Para adicionar os papéis necessários à sua conta de usuário, consulte Como configurar o acesso aos recursos do Cloud Build. Para saber mais sobre os papéis do IAM associados ao Cloud Build, consulte Papéis e permissões do IAM.

Se a instância do GitLab Enterprise Edition estiver hospedada em uma rede privada, consulte Criar repositórios do GitLab Enterprise Edition em uma rede privada para saber mais sobre os outros papéis do IAM necessários antes da conexão do host.

Como se conectar a um host do GitLab Enterprise Edition

Antes de criar uma conexão de host para sua instância do GitLab Enterprise Edition, é necessário criar tokens de acesso pessoal no GitLab Enterprise Edition seguindo as etapas a seguir:

  1. Faça login na sua instância do GitLab Enterprise Edition.

  2. Na página do GitLab Enterprise Edition da sua instância, clique no seu avatar no canto superior direito.

  3. Clique em Editar perfil.

  4. Na barra lateral esquerda, selecione Tokens de acesso.

    A página Tokens de acesso pessoal será exibida.

  5. Crie um token de acesso com o escopo api a ser usado para conectar e desconectar repositórios.

  6. Crie um token de acesso com o escopo read_api para garantir que os repositórios do Cloud Build possam acessar o código-fonte nos repositórios.

Console

Para conectar seu host do GitLab Enterprise Edition ao Cloud Build, siga estas etapas:

  1. Abra a página Repositórios no console do Google Cloud.

    Abrir a página Repositórios

    Você verá a página Repositórios.

  2. Na parte de cima da página, selecione a guia 2a geração.

  3. No seletor de projetos, na barra superior, selecione seu projeto do Google Cloud.

  4. Clique em Criar conexão de host para conectar um novo host ao Cloud Build.

  5. No painel à esquerda, selecione o GitLab como seu provedor de origem.

  6. Na seção Configurar conexão, insira as seguintes informações:

    1. Região: selecione uma região para sua conexão.

    2. Name (Nome): digite um nome para a conexão.

  7. Na seção Detalhes do host, selecione ou insira as seguintes informações:

    1. Provedor do GitLab: selecione GitLab Enterprise Edition autogerenciado como seu provedor.

    2. URL do host: insira o URL do host da sua conexão. Por exemplo, https://my-gle-server.net.

    3. Certificado de CA: clique em "Procurar" para fazer upload do certificado autoassinado.

    4. Em Tipo de conexão, selecione uma das seguintes opções:

      1. Internet pública: selecione essa opção caso sua instância seja acessível pela Internet pública.

      2. Acesso à rede privada: selecione essa opção caso sua instância esteja hospedada em uma rede privada.

      3. Em Serviço do Diretório de serviços, selecione o local do seu serviço:

        • No projeto your-project
        • Em outro projeto
        • Inserir manualmente
        1. Se você selecionar Em outro projeto ou Inserir manualmente, insira as seguintes informações:

          • Project: digite ou selecione o ID do projeto do Google Cloud no menu suspenso.

          • Region: esse campo pré-seleciona a região da sua conexão. A região especificada para seu serviço precisa corresponder à região associada à sua conexão.

        2. Namespace: selecione o namespace do seu serviço.

        3. Serviço: selecione o nome do serviço no seu namespace.

  8. Na seção Personal access tokens, insira as seguintes informações:

    1. Token de acesso à API: digite o token com o acesso ao escopo api. Esse token é usado para conectar e desconectar repositórios.

    2. Ler o token de acesso à API: insira o token com o acesso ao escopo read_api. Os gatilhos do Cloud Build usam esse token para acessar o código-fonte nos repositórios.

  9. Clique em Conectar.

    Depois de clicar no botão Conectar, seus tokens de acesso pessoal serão armazenados com segurança no Secret Manager. Após a conexão do host, o Cloud Build também cria um secret do webhook em seu nome. É possível visualizar e gerenciar secrets na página do Secret Manager. É possível visualizar e gerenciar os secrets na página do Secret Manager.

Você criou uma conexão do GitLab Enterprise Edition.

gcloud

Antes de conectar seu host do GitLab Enterprise Edition ao Cloud Build, siga as etapas a seguir para armazenar suas credenciais:

  1. Armazene o token no Secret Manager.

  2. Crie um secret do webhook no Secret Manager executando o seguinte comando:

     cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create my-gle-webhook-secret --data-file=-
    
  3. Se você armazenar os secrets em um projeto do Google Cloud diferente daquele que você planeja usar para criar uma conexão de host, digite o seguinte comando para conceder ao seu projeto acesso ao agente de serviço do 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"
    

    Em que:

    • PROJECT_ID é o ID do projeto no Google Cloud.
    • CLOUD_BUILD_SERVICE_AGENT é sua conta de serviço do Cloud Build.

Agora conecte seu host do GitLab Enterprise Edition ao Cloud Build.

Siga estas etapas:

  1. Digite o seguinte comando para criar uma conexão do 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
    

    Em que:

    • CONNECTION_NAME é o nome da conexão.
    • HOST_URI é o URI da instância do GitLab Enterprise Edition. Por exemplo, https://my-gle-server.net.
    • PROJECT_ID é o ID do projeto no Google Cloud.
    • REGION é a região da conexão.
    • API_TOKEN é o nome do token com escopo api.
    • READ_TOKEN é o nome do token com escopo read_api.
    • SECRET_VERSION é a versão do secret.
    • WEBHOOK_SECRET é o secret do webhook.

Você criou uma conexão do GitLab Enterprise Edition.

Terraform

Conecte seu host do GitLab Enterprise Edition ao Cloud Build usando o Terraform.

No exemplo abaixo, o snippet de código faz o seguinte:

  • Configura o provedor Terraform do Google
  • Cria um secret para armazenar seu token de acesso pessoal do GitLab Enterprise Edition
  • Concede ao agente de serviço do Cloud Build as permissões necessárias para acessar secrets
  • Cria uma conexão do 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
        ]
    }
    

Em que:

  • PROJECT_ID é o ID do projeto no Google Cloud.
  • GITLAB_PAT_API é seu token de acesso pessoal com acesso api.
  • GITLAB_API_TOKEN é seu token de acesso pessoal.
  • GITLAB_PAT_READ é seu token de acesso pessoal com acesso read_api.
  • WEBHOOK_SECRET é o nome do secret que contém o valor do secret do webhook.
  • WEBHOOK_SECRET_VALUE é o valor do secret do webhook.
  • REGION é a região da conexão.
  • CONNECTION_NAME é o nome da sua conexão do GitLab Enterprise Edition.
  • URI é o URI da conexão. Por exemplo, https://my-gitlab-enterprise-server.net. Você criou uma conexão do GitLab Enterprise Edition.

A seguir