Conéctate a un host de GitHub Enterprise

En esta página, se explica cómo conectar un host de GitHub Enterprise a Cloud Build.

Antes de comenzar

  • Habilita las API de Cloud Build and Secret Manager.

    Habilita las API

Permisos de IAM obligatorios

Para conectar el host de GitHub Enterprise, otorga la función de administrador de conexiones de Cloud Build (roles/cloudbuild.connectionAdmin) a tu cuenta de usuario.

Para agregar los roles necesarios a tu cuenta de usuario, consulta Configura el acceso a los recursos de Cloud Build. Para obtener más información sobre las funciones de IAM asociadas con Cloud Build, consulta Funciones y permisos de IAM.

Para crear conexiones mediante los pasos de instalación de gcloud, otorga la función de administrador de Secret Manager (roles/secretmanager.admin) al agente de servicio de Cloud Build mediante la ejecución del siguiente comando en tu proyecto de Google Cloud:

      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"

Si tu instancia de GitHub Enterprise está alojada en una red privada, consulta Compila repositorios desde GitHub Enterprise en una red privada para obtener información sobre los roles de IAM adicionales que se requieren antes de la conexión del host.

Conéctate a un host de GitHub Enterprise

Consola

Para conectar tu host de GitHub Enterprise a Cloud Build, haz lo siguiente:

  1. Abre la página Repositorios en la consola de Google Cloud.

    Abrir la página repositorios

    Verás la página Repositorios.

  2. En el selector de proyectos de la barra superior, selecciona tu proyecto de Google Cloud.

  3. En la parte superior de la página, selecciona la pestaña 2a gen..

  4. Haz clic en Crear conexión de host para conectar un host nuevo a Cloud Build.

  5. En el panel izquierdo, selecciona GitHub Enterprise como tu proveedor de origen.

  6. En la sección Configurar conexión, ingresa la siguiente información:

    1. Región: Selecciona una región para tu conexión.

    2. Nombre: Ingresa un nombre para la conexión.

  7. En la sección Detalles del host, ingresa la siguiente información:

    1. URL del host: Ingresa la URL del host para tu conexión. Por ejemplo, github.example.com

    2. Certificado de CA: Haz clic en Explorar para subir tu certificado autofirmado.

    3. En Tipo de conexión, selecciona una de las siguientes opciones:

      1. Internet pública: Selecciona esta opción si se puede acceder a tu instancia a través de la Internet pública.

      2. Acceso a red privada: Selecciona esta opción si la instancia está alojada en una red privada.

      3. En Servicio del Directorio de servicios, selecciona la ubicación de tu servicio:

        • En el proyecto your-project
        • En otro proyecto
        • Ingresa los datos manualmente
        1. Si seleccionas En otro proyecto o Ingresar manualmente, ingresa la siguiente información:

          • Proyecto: Ingresa o selecciona el ID del proyecto de Google Cloud en el menú desplegable.

          • Región: Este campo selecciona de forma previa la región de tu conexión. La región especificada para el servicio debe coincidir con la región asociada a la conexión.

        2. Espacio de nombres: Selecciona el espacio de nombres de tu servicio.

        3. Service (Servicio): selecciona el nombre del servicio en tu espacio de nombres.

  8. Haz clic en Conectar.

    Después de hacer clic en el botón Conectar, se te pedirá que crees una app de GitHub en tu host de GitHub Enterprise y que la instales en una organización o cuenta de usuario. Se creará un token de autenticación de tu host de GitHub Enterprise y se almacenará en este proyecto como un secreto de Secret Manager. Puedes revocar el acceso si desinstalas o borras la app de GitHub de tu host en cualquier momento.

    Cloud Build almacena los datos de autenticación de la app de GitHub creada como secretos en Secret Manager en tu proyecto. Estos datos incluyen tu clave privada y el secreto de webhook. La clave privada se usa como método de autenticación para acceder a la API de Enterprise Server. El secreto de webhook se usa para validar los eventos enviados desde el servidor a Cloud Build. La cuenta del agente de servicio de Cloud Build (service-{projectNumber}@gcp-sa-cloudbuild.iam.gserviceaccount.com) se usa para acceder a tu secreto. Para ver tu secreto, consulta Enumera los secretos y consulta los detalles de los secretos.

    Después de autorizar la app de GitHub de Cloud Build, se te redireccionará a la página Repositorios de Cloud Build.

Creaste correctamente una conexión de GitHub Enterprise.

gcloud

Para conectar tu host de GitHub Enterprise a Cloud Build mediante los comandos de gcloud, completa los siguientes pasos:

  1. Ingresa el siguiente comando para crear una conexión de GitHub Enterprise:

    gcloud builds connections create github-enterprise CONNECTION_NAME \
      --host-uri=HOST_URI --region=REGION
    

    Donde:

    • CONNECTION_NAME es el nombre de tu conexión.
    • HOST_URI es el URI de tu instancia de GitHub Enterprise. Por ejemplo, https://mmy-ghe-server.net
    • REGION es la región de tu conexión.

    Si tu instancia de GitHub Enterprise está en una red privada, especifica el recurso del Directorio de servicios. También puedes especificar tu certificado de CA.

    --service-directory-service=projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE_NAME \
    --ssl-ca-file=SSL_CA_FILEPATH
    

    Donde:

    • PROJECT_ID es tu ID del proyecto de Google Cloud.
    • REGION es la región de tu conexión.
    • NAMESPACE es el espacio de nombres para tu servicio.
    • SERVICE_NAME es el nombre del servicio en tu espacio de nombres.
    • SSL_CA_FILEPATH es la ruta de acceso al archivo de tu certificado de CA.

    Después de ejecutar el comando gcloud builds connections..., recibirás un vínculo para instalar la app de GitHub de Cloud Build.

  2. Sigue el vínculo que se mostró en el paso anterior para crear e instalar la app de GitHub de Cloud Build en el servidor de tu empresa.

  3. Ingresa el siguiente comando para verificar tu conexión:

    gcloud builds connections describe CONNECTION_NAME --region=REGION
    

    Donde:

    • CONNECTION_NAME es el nombre de tu conexión.
    • REGION es la región de tu conexión.

    Si el campo installationState está configurado como COMPLETE, significa que instalaste correctamente la conexión. De lo contrario, el campo installationState proporciona un vínculo para los pasos adicionales obligatorios.

Creaste correctamente una conexión de GitHub Enterprise.

Conéctate a un host de GitHub Enterprise de manera programática

Para conectar tu host de GitHub Enterprise a Cloud Build de manera programática, debes instalar la app de GitHub mediante los siguientes pasos:

  1. Registra una app de GitHub nueva. Por ejemplo, puedes registrar una app de GitHub nueva en https://my-ghe-server.net/settings/apps/new.

  2. Completa los campos de la página:

    1. Nombre de la app de GitHub: Ingresa un nombre para tu app.
    2. URL de la página principal: Ingresa una URL para el servidor de GitHub Enterprise.
    3. Desmarca la casilla Vence los tokens de autorización del usuario.
    4. En la sección Webhook, completa los siguientes pasos:
      • Active: Marque la casilla para activar su cuenta de WeBook.
      • URL de webhook: Ingresa tu URL de webhook. Por ejemplo, https://cloudbuild.googleapis.com/v2/projects/{PROJECT_NUMBER}/locations/{REGION}/connections:processWebhook La región en la URL de webhook debe coincidir con la región de tu conexión.
      • Secreto de webhook: Ingresa una string generada de forma aleatoria y anótala.
    5. En la sección Permisos, especifica los siguientes permisos:
      • Permisos del repositorio:
        • Verificaciones: Lectura y escritura
        • Contenidos: Lectura y escritura
        • Problemas: Solo lectura
        • Metadatos (solo lectura)
        • Estados de confirmación: Solo lectura
        • Solicitudes de extracción: Solo lectura
    6. En la sección Suscríbete a eventos, marca las siguientes casillas:
      • Verificar ejecución
      • Revisar paquete
      • Confirmar comentario
      • Comentario del problema
      • Solicitud de extracción
      • Comentario de revisión de la solicitud de extracción
      • Envío
      • Repositorio
    7. Marca la casilla Cualquier cuenta para permitir que cualquier organización o usuario instale tu app de GitHub.
  3. Haz clic en Crear app de GitHub para crear tu app de GitHub.

    Una vez que hagas clic en Crear app de GitHub, se te redireccionará a la página de tu app. Toma nota del ID de tu app y del slug de la app. El slug de la app se encuentra en el último segmento de la URL de la página. Por ejemplo, https://my-ghe-server.net/settings/apps/{app-slug}

  4. En la sección Claves privadas, haz clic en Generar una clave privada.

    Almacena el archivo descargado en un lugar seguro.

  5. En el panel izquierdo, selecciona Instalar app.

    Selecciona el usuario o la organización en la que deseas instalar la app. Después de instalarla, toma nota del ID de instalación. El ID de instalación se puede encontrar en el último segmento de la URL de la página. Por ejemplo, https://my-ghe-server.net/settings/installations/{installation-id}.

Después de instalar la app de GitHub, completa los siguientes pasos para conectar el host de GitHub Enterprise de manera programática mediante Terraform o gcloud.

Terraform

Una vez que instales la app de GitHub, puedes conectar tu host de GitHub Enterprise a Cloud Build mediante el proveedor de Google Terraform.

En el siguiente ejemplo, el fragmento de código hace lo siguiente:

  • Configura el proveedor de Google para Terraform
  • Crea un secreto para almacenar la clave privada y el secreto de webhook de la app de GitHub
  • Otorga los permisos necesarios al agente de servicio de Cloud Build para acceder a los secretos
  • Crea una conexión de GitHub Enterprise

    // Configure the terraform google provider
    terraform {
      required_providers {
        google = {}
      }
    }
    
    // create Secrets and grant permissions to the Service Agent
    resource "google_secret_manager_secret" "private-key-secret" {
        project = "PROJECT_ID"
        secret_id = "PRIVATE_KEY_SECRET"
    
        replication {
            automatic = true
        }
    }
    
    resource "google_secret_manager_secret_version" "private-key-secret-version" {
        secret = google_secret_manager_secret.private-key-secret.id
        secret_data = file("private-key.pem")
    }
    
    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-pk" {
      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-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"
    
        github_enterprise_config {
            host_uri = "URI"
            private_key_secret_version = google_secret_manager_secret_version.private-key-secret-version.id
            webhook_secret_secret_version = google_secret_manager_secret_version.webhook-secret-secret-version.id
            app_id = "APP_ID"
            app_slug = "APP_SLUG"
            app_installation_id = INSTALLATION_ID
        }
    
        depends_on = [
            google_secret_manager_secret_iam_policy.policy-pk,
            google_secret_manager_secret_iam_policy.policy-whs
        ]
    }
    

Donde:

  • PROJECT_ID es tu ID del proyecto de Google Cloud.
  • PRIVATE_KEY_SECRET es el secreto que contiene la clave privada de tu app de GitHub.
  • WEBHOOK_SECRET es el nombre del secreto que contiene el valor del secreto de webhook de tu app de GitHub.
  • WEBHOOK_SECRET_VALUE es el valor del secreto de webhook de tu app de GitHub.
  • REGION es la región de tu conexión.
  • CONNECTION_NAME es el nombre de tu conexión de GitHub.
  • URI es el URI de la conexión. Por ejemplo, https://my-github-enterprise-server.net
  • APP_ID es el ID de tu app de GitHub.
  • APP_SLUG es la slug de la app. Por ejemplo, https://github.com/settings/apps/{app-slug}
  • INSTALLATION_ID es el ID de instalación de tu app de GitHub. Puedes encontrarlo en la URL de tu app de GitHub de Cloud Build, https://github.com/settings/installations/{installation-id}.

Creaste correctamente una conexión de GitHub Enterprise.

gcloud

Después de instalar la app de GitHub, completa los siguientes pasos para conectar el host de GitHub Enterprise de manera programática mediante gcloud:

  1. Almacena tus secretos en Secret Manager:

    echo -n WEBHOOK_SECRET | gcloud secrets create mygheapp-webhook-secret --data-file=-
    # creating secret from the downloaded private key:
    gcloud secrets create mygheapp-private-key --data-file=PRIVATE_KEY_FILE
    

    Donde:

    • WEBHOOK_SECRET es la string que creaste para el secreto de tu webhook.
    • PRIVATE_KEY_FILE es la ruta del archivo a la clave privada que generaste.
  2. Otorga acceso al agente de servicio de Cloud Build para acceder a tus secretos:

    PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    CLOUD_BUILD_SERVICE_AGENT="service-$PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"
    gcloud secrets add-iam-policy-binding mygheapp-webhook-secret \
      --member="serviceAccount:CLOUD_BUILD_SERVICE_AGENT" \
      --role="roles/secretmanager.secretAccessor"
    gcloud secrets add-iam-policy-binding mygheapp-private-key \
      --member="serviceAccount:CLOUD_BUILD_SERVICE_AGENT" \
      --role="roles/secretmanager.secretAccessor"
    

    Donde:

    • PROJECT_ID es tu ID del proyecto de Google Cloud.
    • CLOUD_BUILD_SERVICE_AGENT es tu cuenta por producto y por proyecto.
  3. Crea tu conexión de GitHub Enterprise:

    gcloud builds connections create github-enterprise CONNECTION_NAME \
      --host-uri=HOST_URI \
      --app-id=APP_ID \
      --app-slug=APP_SLUG \
      --private-key-secret-version=projects/PROJECT_ID/secrets/mygheapp-private-key/versions/1 \
      --webhook-secret-secret-version=projects/PROJECT_ID/secrets/mygheapp-webhook-secret/versions/1 \
      --app-installation-id=INSTALLATION_ID \
      --region=REGION
    

    Donde:

    • CONNECTION_NAME es el nombre de tu conexión.
    • HOST_URI es el URI de tu instancia de GitHub Enterprise. Por ejemplo, https://mmy-ghe-server.net
    • APP_ID es el ID de tu app de GitHub.
    • APP_SLUG es la slug de la app. Por ejemplo, https://my-ghe-server.net/settings/apps/app-slug
    • PROJECT_ID es tu ID del proyecto de Google Cloud.
    • INSTALLATION_ID es el ID de instalación de tu app de GitHub. Por ejemplo, https://my-ghe-server.net/settings/installations/installation-id
    • REGION es la región de tu conexión.

    Si tu instancia de GitHub Enterprise está en una red privada, especifica el recurso del Directorio de servicios. También puedes especificar tu certificado de CA.

      --service-directory-service=projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE_NAME \
      --ssl-ca-file=SSL_CA_FILEPATH
    

    Donde:

    • PROJECT_ID es tu ID del proyecto de Google Cloud.
    • REGION es la región de tu conexión.
    • NAMESPACE es el espacio de nombres de tu servicio.
    • SERVICE_NAME es el nombre del servicio en tu espacio de nombres.
    • SSL_CA_FILEPATH es la ruta de acceso al archivo de tu certificado de CA.

Creaste correctamente una conexión de GitHub Enterprise.

Próximos pasos