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

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

Permisos de IAM obligatorios

Para conectar tu host de GitHub Enterprise, otorga al 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 Para obtener más información sobre los roles de IAM asociados con Cloud Build, consulta Roles y permisos de IAM.

Para crear conexiones mediante los pasos de instalación de gcloud, otorga a Rol Administrador de Secret Manager (roles/secretmanager.admin) para el agente de servicio de Cloud Build ejecutando el 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 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 Repositories.

  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 2nd 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 tu proveedor de código fuente.

  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 la Internet pública.

      2. Acceso a red privada: Selecciona esta opción si tu instancia se aloja 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
        • Ingresar manualmente
        1. Si seleccionas En otro proyecto o Ingresar manualmente, ingresa la siguiente información:

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

          • Región (Region): Este campo 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 tu GitHub Enterprise aloja y, luego, instala la app 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 del servidor empresarial. El secreto de webhook se usa para validar la 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 secretos y visualiza detalles de secretos.

    Luego de autorizar la app de GitHub de Cloud Build, podrás se redireccionará a los Repositorios de Cloud Build .

Creaste correctamente una conexión de GitHub Enterprise.

gcloud

Para conectar tu host de GitHub Enterprise a Cloud Build con 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 la 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 la AC.

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

    Aquí:

    • PROJECT_ID es tu ID del proyecto de 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 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 devuelto en el paso anterior para crear e instalar el 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 instaló la conexión. De lo contrario, el campo installationState proporciona un vínculo con los pasos adicionales requeridos.

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. GitHub App Name: 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 Expirar 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
        • Pull requests: Solo lectura
    6. En la sección Suscribirse a eventos, marca las siguientes casillas:
      • Ejecución de la verificación
      • Comprobar 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.

    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 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 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 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 conecta tu host de GitHub Enterprise de forma programática con Terraform o gcloud

Terraform

Una vez que hayas instalado la app de GitHub, puedes 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 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 {
            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 tu ID del proyecto de 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 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. Tu el ID de instalación en la URL de tu Cloud Build App de GitHub, 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 tu ID del proyecto de Cloud.
    • CLOUD_BUILD_SERVICE_AGENT es tu cuenta por producto 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 la 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 slug de la app. Por ejemplo, https://my-ghe-server.net/settings/apps/app-slug
    • PROJECT_ID es tu ID del proyecto de 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 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 tu ID del proyecto de 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 AC.

Creaste correctamente una conexión de GitHub Enterprise.

Próximos pasos