Nesta página, explicamos como conectar o host do GitLab Enterprise Edition ao Cloud Build.
Antes de começar
Ative as APIs Cloud Build e Secret Manager, se alguma delas ainda não estiver ativada.
Funções necessárias para ativar APIs
Para ativar APIs, você precisa da permissão
serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.
Requisitos do host
Se você não instalou uma instância do GitLab Enterprise Edition Server, consulte o guia de instalação do GitLab Enterprise Edition para instruções.
Ao seguir as instruções para instalar uma instância do GitLab Enterprise Edition Server, observe o seguinte:
Você precisa configurar seu host para processar o protocolo
HTTPS. Hosts configurados com o protocoloHTTPnão são compatíveis.Você precisa configurar seu host com o mesmo URL usado para acessar seu host em 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 seu 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 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 particular, consulte Criar repositórios do GitLab Enterprise Edition em uma rede particular para saber mais sobre os papéis adicionais do IAM necessários antes da conexão do host.
Conectar-se 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 estas etapas:
Faça login na sua instância do GitLab Enterprise Edition.
Na página do GitLab Enterprise Edition da sua instância, clique no seu avatar no canto superior direito.
Clique em Editar perfil.
Na barra lateral à esquerda, selecione Tokens de acesso.
A página Tokens de acesso pessoal vai aparecer.
Crie um token de acesso com o escopo
apipara usar na conexão e desconexão de repositórios.Crie um token de acesso com o escopo
read_apipara garantir que os repositórios do Cloud Build possam acessar o código-fonte em repositórios.
Console
Para conectar seu host do GitLab Enterprise Edition ao Cloud Build:
Abra a página Repositórios no console do Google Cloud .
A página Repositórios é exibida.
Na parte de cima da página, selecione a guia 2ª geração.
No seletor de projetos na barra superior, selecione seu projeto Google Cloud .
Clique em Criar conexão de host para conectar um novo host ao Cloud Build.
No painel à esquerda, selecione GitLab como seu provedor de origem.
Na seção Configurar conexão, insira as seguintes informações:
Região: selecione uma região para sua conexão.
Nome: insira um nome para sua conexão.
Na seção Detalhes do host, selecione ou insira as seguintes informações:
Host do GitLab: selecione GitLab Enterprise Edition autogerenciado.
URL do host: insira o URL do host para sua conexão. Por exemplo,
https://my-gle-server.net.
Opcional: se você quiser gerenciar as chaves de criptografia usadas para criptografar os tokens de acesso dos seus repositórios do GitLab Enterprise Edition, acesse a seção Criptografia e escolha uma chave do Cloud Key Management Service. Para mais informações, consulte Ativar chaves de criptografia gerenciadas pelo cliente para o Secret Manager.
Na seção Rede, em Tipo de conexão, selecione uma das seguintes opções:
Internet pública: selecione essa opção se a instância puder ser acessada usando a Internet pública.
Rede particular: selecione essa opção se a instância estiver hospedada em uma rede particular. Em seguida, configure o seguinte:
Certificado da CA: clique em "Procurar" para fazer upload do seu certificado autoassinado.
Em Serviço do Service Directory, selecione o local do seu serviço:
- No projeto CURRENT_PROJECT
- Em outro projeto
- Inserir manualmente
Digite as seguintes informações:
Projeto: se você selecionou Em outro projeto ou Inserir manualmente, insira ou selecione o ID do projeto Google Cloud no menu suspenso.
Região: 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.
Namespace: selecione o namespace do seu serviço.
Serviço: selecione o nome do serviço no namespace.
Na seção Tokens de acesso pessoal, insira as seguintes informações:
Token de acesso à API: insira o token com o acesso ao escopo
api. Esse token é usado para conectar e desconectar repositórios.Ler 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 em repositórios.
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 de host, o Cloud Build também cria um segredo de webhook em seu nome. Você pode acessar e gerenciar secrets na página do Secret Manager. Você pode acessar e gerenciar seus secrets na página Secret Manager.
gcloud
Antes de conectar seu host do GitLab Enterprise Edition ao Cloud Build, siga estas etapas para armazenar suas credenciais:
Crie um secret de 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=-Se você armazenar seus segredos em um projeto Google Cloud diferente daquele que planeja usar para criar uma conexão de host, insira o comando a seguir 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 Google Cloud .
Agora você pode conectar seu host do GitLab Enterprise Edition ao Cloud Build.
Siga estas etapas:
Insira o comando a seguir 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_VERSIONEm que:
- CONNECTION_NAME é o nome da sua conexão no Cloud Build.
- HOST_URI é o URI da sua instância do GitLab Enterprise Edition. Por exemplo,
https://my-gle-server.net. - PROJECT_ID é o ID do projeto Google Cloud .
- REGION é a região da sua conexão.
- API_TOKEN é o nome do seu token com o escopo
api. - READ_TOKEN é o nome do seu token com o escopo
read_api. - SECRET_VERSION é a versão do seu secret.
- WEBHOOK_SECRET é o secret do webhook.
Você criou uma conexão do GitLab Enterprise Edition.
Terraform
É possível conectar seu host do GitLab Enterprise Edition ao Cloud Build usando o Terraform. Saiba mais sobre o Terraform no Google Cloud.
No exemplo a seguir, o snippet de código faz o seguinte:
- Configura o provedor do Terraform para recursos do Google Cloud.
- Cria um secret para armazenar seu token de acesso pessoal do GitLab Enterprise Edition.
- Concede as permissões necessárias ao agente de serviço do Cloud Build 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 Cloud Build service agent resource "google_secret_manager_secret" "api-pat-secret" { project = "PROJECT_ID" secret_id = "GITLAB_PAT_API" replication { auto {} } } 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 { auto {} } } resource "google_secret_manager_secret_version" "read-pat-secret-version" { secret = google_secret_manager_secret.read-pat-secret.id secret_data = "GITLAB_API_TOKEN" } resource "google_secret_manager_secret" "webhook-secret-secret" { project = "PROJECT_ID" secret_id = "WEBHOOK_SECRET" replication { auto {} } } 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.api-pat-secret.project secret_id = google_secret_manager_secret.api-pat-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.read-pat-secret.project secret_id = google_secret_manager_secret.read-pat-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 { host_uri = "URI" authorizer_credential { user_token_secret_version = google_secret_manager_secret_version.api-pat-secret-version.id } read_authorizer_credential { user_token_secret_version = google_secret_manager_secret_version.read-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 ] }
Substitua:
PROJECT_ID: o ID do projeto Google Cloud .GITLAB_PAT_API: seu token de acesso pessoal com acessoapi.GITLAB_API_TOKEN: seu token de acesso pessoal.GITLAB_PAT_READ: seu token de acesso pessoal com acessoread_api.WEBHOOK_SECRET: o nome do secret que contém o valor do secret do webhook.WEBHOOK_SECRET_VALUE: o valor do seu webhook secret.PROJECT_NUMBER: o número do projeto do Google Cloud . Encontre o número do projeto na página Boas-vindas do console do Google Cloud ou executando o seguinte comando:gcloud projects describe PROJECT_ID --format='value(projectNumber)'REGION: a região da sua conexão.CONNECTION_NAME: um nome para sua conexão de host do GitLab Enterprise Edition no Cloud Build.URI: o URI da sua conexão, por exemplo,https://my-gitlab-enterprise-server.net.
Você criou uma conexão do GitLab Enterprise Edition.
Girar tokens de acesso antigos ou expirados do GitLab Enterprise Edition
Faça a rotação dos tokens de acesso para que a conexão de host do Cloud Build mantenha a conexão com seu repositório do GitLab Enterprise Edition. Se o token de acesso do GitLab Enterprise Edition expirar, a conexão do host do Cloud Build será desconectada do repositório do GitLab Enterprise Edition. Quando isso acontece, não é possível desativar a conexão nem vincular um repositório até girar o token expirado. Além disso, você vai encontrar erros nas seguintes circunstâncias:
A página Detalhes da conexão da sua conexão mostra uma mensagem de erro indicando
Connection is disconnected due to an invalid or expired access token.Se você tentar vincular um repositório a uma conexão com um token expirado, a mensagem Token de acesso inválido vai aparecer. Ao clicar em Ver conexão, você acessa a página Detalhes da conexão da conexão com o token expirado.
O Cloud Build permite girar tokens de acesso inserindo novos valores de token e salvando-os no Secret Manager na versão mais recente do secret para esses tokens. Para fazer a rotação dos tokens de acesso, faça o seguinte:
Gire cada token de acesso no GitLab Enterprise Edition:
Acesse o repositório do GitLab Enterprise Edition conectado à sua conexão de host do Cloud Build.
Siga as instruções na documentação do GitLab para fazer a rotação de um token de acesso. Quando você faz a rotação de um token, o GitLab Enterprise Edition cria um novo token com novas credenciais e invalida a versão anterior desse token. Seu token rotacionado tem as mesmas permissões e escopo do token original.
Copie os IDs dos tokens rotacionados.
Atualize seu token de acesso no Cloud Build:
Acesse a página Detalhes da conexão da sua conexão.
Selecione Atualizar tokens de acesso.
No menu Rotação de token, insira os novos tokens nos campos Token de acesso à API e Token de acesso de leitura.
(Opcional): se você quiser que sua conexão sempre use a versão mais recente do secret para seus tokens, selecione Atualizar conexão para sempre usar a versão mais recente. Deixar essa opção desmarcada pode ser útil se sua conexão usar um número de versão secreto específico.
Selecione Atualizar para salvar as mudanças.
O Cloud Build salva os novos tokens de acesso como a versão mais recente do seu secret no Secret Manager.
A seguir
- Saiba como conectar um repositório do GitLab Enterprise Edition.
- Saiba como criar e implantar suas cargas de trabalho no Google Cloud usando componentes de CI/CD gerenciados pelo Google no seu pipeline do GitLab. Consulte GitLab no Google Cloud.