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 la función 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 proyecto 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

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 Google Cloud .

  3. En la parte superior de la página, selecciona la pestaña 2ª 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 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 CA: Haz clic en Examinar 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 la red privada: Selecciona esta opción si tu instancia está alojada 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 manualmente, ingresa la siguiente información:

          • Proyecto: Ingresa o selecciona tu ID de proyecto de Google Cloud 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 a 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 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 Enterprise Server. El secreto del webhook se usa para validar los eventos que se envían 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.

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

gcloud

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

    Aquí:

    • CONNECTION_NAME es un nombre para la conexión del host de GitHub Enterprise en Cloud Build.
    • 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 tu recurso de 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
    

    Aquí:

    • PROJECT_ID es el Google Cloud ID del 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 a 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 devolvió 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 tu conexión:

    gcloud builds connections describe CONNECTION_NAME --region=REGION
    

    Aquí:

    • CONNECTION_NAME es el nombre de la conexión con el host de GitHub Enterprise en Cloud Build.
    • REGION es la región de tu conexión.

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

Conéctate a un host de GitHub Enterprise de forma 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 nueva app de GitHub. Por ejemplo, puedes registrar una nueva app de GitHub 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 GitHub Enterprise Server.
    3. Desmarca la casilla Vencimiento de tokens de autorización del usuario.
    4. En la sección Webhook, completa los siguientes pasos:
      • Activo: Marca la casilla para activar tu webhook.
      • 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 de la URL del webhook debe coincidir con la región de tu conexión.
      • Webhook secret: Ingresa una cadena generada de forma aleatoria y anótala.
    5. En la sección Permisos, especifica los siguientes permisos:
      • Permisos del repositorio:
        • Checks: Lectura y escritura
        • Contenido: Lectura y escritura
        • Issues: 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:
      • Ejecución de la verificación
      • Check suite
      • Comentario de confirmación
      • Comentar sobre el problema
      • Solicitud de extracción
      • Comentario de revisión de solicitud de extracción
      • Push
      • Repositorio
    7. Marca la casilla de Cualquier cuenta para permitir que cualquier usuario u organización instale tu app de GitHub.
  3. Haz clic en Create GitHub app para crear tu app de GitHub.

    Una vez que hagas clic en Crear app de GitHub, se te redireccionará a la página de la app. Toma nota del ID de la aplicación y el slug de la aplicación. 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 Install App.

    Selecciona el usuario o la organización en la que quieres instalar la app. Después de instalarla, anota el 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, puedes conectar tu host de GitHub Enterprise a Cloud Build con el proveedor de Google Terraform.

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 del 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 del 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 un nombre para la conexión del host de GitHub Enterprise en Cloud Build.
  • 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 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}.

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 tu secreto de webhook.
    • PRIVATE_KEY_FILE es la ruta a la clave privada que generaste.
  2. Otorga acceso al agente de servicio de Cloud Build para que acceda 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 del 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 un nombre para la conexión del host de GitHub Enterprise en Cloud Build.
    • 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 el Google Cloud ID del 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 está en una red privada, especifica tu recurso de 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
    

    Aquí:

    • PROJECT_ID es el Google Cloud ID del 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 a tu certificado de CA.

Próximos pasos