Cómo conectarse 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

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

Permisos de IAM obligatorios

Para conectar tu host de GitHub Enterprise, otorga el rol de administrador de conexión 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 los roles de IAM asociados con Cloud Build, consulta Roles y permisos de IAM.

Para crear conexiones con los pasos de instalación de gcloud, otorga el rol de administrador de Secret Manager (roles/secretmanager.admin) al agente de servicio de Cloud Build ejecutando el siguiente comando en tu Google Cloud proyecto:

      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 se aloja en una red privada, consulta Cómo compilar 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.

Cómo conectarse a un host de GitHub Enterprise

Console

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 2ª gen.

  4. Haz clic en Create host connection para conectar un host nuevo a Cloud Build.

  5. En el panel izquierdo, selecciona GitHub Enterprise como 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 tu 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 AC: 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 Internet pública.

      2. Acceso a red privada: Selecciona esta opción si tu instancia se aloja en una red privada.

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

        • En el proyecto your-project
        • En otro proyecto
        • Ingresar manualmente
        1. Si seleccionas En otro proyecto o Ingresar de forma manual, ingresa la siguiente información:

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

          • Región: En este campo, se preselecciona la región de tu conexión. La región especificada para tu servicio debe coincidir con la región asociada con tu conexión.

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

        3. 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 el 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 del webhook. La clave privada se usa como método de autenticación para acceder a la API del servidor empresarial. El secreto del webhook se usa para validar los eventos que se envían del 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 secretos y visualiza detalles de 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 con los comandos 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
    

    Aquí:

    • 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 se encuentra en una red privada, especifica tu recurso de directorio de servicios. También puedes especificar tu certificado de AC.

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

    Aquí:

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

    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 muestra en el paso anterior para crear e instalar la app de GitHub de Cloud Build en tu servidor empresarial.

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

    gcloud builds connections describe CONNECTION_NAME --region=REGION
    

    Aquí:

    • 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 necesarios.

Creaste correctamente una conexión de GitHub Enterprise.

Cómo conectarse a un host de GitHub Enterprise de manera programática

Para conectar tu host de GitHub Enterprise de forma programática a Cloud Build, debes instalar la app de GitHub. Para ello, completa 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 tu servidor de GitHub Enterprise.
    3. Desmarca la casilla Vencer los tokens de autorización del usuario.
    4. En la sección Webhook, completa los siguientes pasos:
      • Activo: Marca la casilla para activar tu libro electrónico.
      • URL de webhook: Ingresa la URL de tu webhook. Por ejemplo, https://cloudbuild.googleapis.com/v2/projects/{PROJECT_NUMBER}/locations/{REGION}/connections:processWebhook La región de la URL del webhook debe coincidir con la región de tu conexión.
      • Secreto de webhook: Ingresa una cadena generada de forma aleatoria y toma nota de ella.
    5. En la sección Permisos, especifica los siguientes permisos:
      • Permisos del repositorio:
        • Verificaciones: Lectura y escritura
        • Contenido: Lectura y escritura
        • Problemas: Solo lectura
        • Metadatos de solo lectura
        • Estados de confirmación: Solo lectura
        • Solicitudes de extracción: Solo lectura
    6. En la sección Suscribirse a eventos, marca las siguientes casillas:
      • Verificación de la ejecución
      • Check suite
      • Confirmar comentario
      • Comentario sobre el problema
      • Solicitud de extracción
      • Comentario de revisión de la solicitud de extracción
      • Push
      • Repositorio
    7. Marca la casilla Cualquier cuenta para permitir que cualquier usuario o organización instale tu app de GitHub.
  3. Haz clic en Crear app de GitHub para crear tu app de GitHub.

    Cuando hagas clic en Crear app de GitHub, se te redireccionará a la página de tu app. Toma nota del ID de la app y el fragmento de la app. El fragmento 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 Install App.

    Selecciona el usuario o la organización en la que quieres instalar la app. Después de instalarla, toma nota del ID de instalación. El ID de instalación se encuentra 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 tu host de GitHub Enterprise de forma programática con Terraform o gcloud.

Terraform

Una vez que hayas instalado la app de GitHub, podrás conectar tu host de GitHub Enterprise a Cloud Build con el proveedor de Terraform de Google.

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

  • Configura el proveedor de Google de 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 {
            auto {}
        }
    }
    
    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 {
            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-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
        ]
    }
    

Aquí:

  • PROJECT_ID es el Google Cloud ID de tu proyecto.
  • 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 secreto del webhook de tu app de GitHub.
  • WEBHOOK_SECRET_VALUE es el valor del secreto del 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 tu conexión. Por ejemplo, https://my-github-enterprise-server.net
  • APP_ID es el ID de tu app de GitHub.
  • APP_SLUG es el fragmento 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 encontrar tu ID de instalación en la URL de la 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 tu host de GitHub Enterprise de forma programática con 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
    

    Aquí:

    • WEBHOOK_SECRET es la cadena que creaste para el secreto de tu webhook.
    • PRIVATE_KEY_FILE es la ruta de acceso al archivo de 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"
    

    Aquí:

    • PROJECT_ID es el Google Cloud ID de tu proyecto.
    • 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
    

    Aquí:

    • 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 el fragmento de la app. Por ejemplo, https://my-ghe-server.net/settings/apps/app-slug
    • PROJECT_ID es el Google Cloud ID de tu proyecto.
    • 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 se encuentra en una red privada, especifica tu recurso de directorio de servicios. También puedes especificar tu certificado de AC.

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

    Aquí:

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

Creaste correctamente una conexión de GitHub Enterprise.

Próximos pasos