Skip to main content

Configuración de redes privadas para los ejecutores hospedados en GitHub en su organización

Aprenda a utilizar ejecutores hospedados en GitHub con una red privada de Azure en su organización.

¿Quién puede utilizar esta característica?

Los propietarios de organizaciones de una empresa pueden configurar redes privadas de Azure para ejecutores hospedados en GitHub en el nivel de organización.

Acerca de la configuración de la red privada para ejecutores hospedados en GitHub

Para usar ejecutores hospedados en GitHub con VNET de Azure, primero configure los recursos de Azure. A continuación, cree una configuración de red privada en GitHub.

Los siguientes procedimientos le guiarán a través de ambos pasos.

Para más información sobre cómo solucionar problemas comunes con el uso de ejecutores hospedados en GitHub con VNET de Azure, consulta "Solución de problemas de configuraciones de red privada de Azure para ejecutores hospedados en GitHub en su empresa.".

Note

De manera predeterminada, las organizaciones de una empresa no pueden crear configuraciones de red y solo heredan configuraciones de red de nivel empresarial. Los propietarios de empresas pueden establecer una directiva que permita a las organizaciones de la empresa crear configuraciones de red independientes de la empresa. Para obtener más información, vea «Configuración de redes privadas para los ejecutores hospedados en GitHub en su empresa».

Configuración de recursos de Azure

Usará un script para automatizar la configuración de los recursos de Azure.

Requisitos previos

  • Use una cuenta de Azure con el rol de colaborador de la suscripción y el rol de colaborador de red. Estos roles permiten registrar el proveedor de recursos GitHub.Network y delegar la subred. Para más información, consulta Roles integrados de Azure en Microsoft Learn.

  • Para asociar correctamente las subredes con el usuario adecuado, los recursos de NetworkSettings de Azure se deben crear en las mismas suscripciones en las que se crean las redes virtuales.

  • Para garantizar la disponibilidad de recursos o la residencia de datos, los recursos deben crearse en la misma región de Azure.

  • Guarde el siguiente archivo .bicep. Asigna al archivo el nombre actions-nsg-deployment.bicep.

    El archivo .bicep que proporcionamos contiene el conjunto mínimo de reglas para usar ejecutores hospedados en GitHub con red virtual de Azure. Es posible que tenga que agregar reglas para su caso de uso específico.

    Nota: Como alternativa, para permitir que los GitHub Actions se comunique con los ejecutores, puede permitir los mismos dominios de firewall necesarios para la comunicación entre ejecutores autohospedados y GitHub Enterprise Cloud. Para obtener más información, vea «Acerca de los ejecutores autohospedados». Para determinar el intervalo de direcciones IP de subred adecuado, se recomienda agregar un búfer del 30 % superior a la simultaneidad máxima del trabajo previsto. Por ejemplo, si los ejecutores de la configuración de red se establecen en una simultaneidad de trabajo máxima de 300, se recomienda usar un intervalo de direcciones IP de subred que pueda contener al menos 390 ejecutores. Este búfer ayuda a garantizar que la red pueda controlar los aumentos inesperados de las máquinas virtuales para satisfacer la simultaneidad del trabajo sin que se le agoten las direcciones IP.

    Bicep
    @description('NSG for outbound rules')
    param location string
    param nsgName string = 'actions_NSG'
    
    resource actions_NSG 'Microsoft.Network/networkSecurityGroups@2017-06-01' = {
      name: nsgName
      location: location
      properties: {
        securityRules: [
          {
            name: 'AllowVnetOutBoundOverwrite'
            properties: {
              protocol: 'TCP'
              sourcePortRange: '*'
              destinationPortRange: '443'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'VirtualNetwork'
              access: 'Allow'
              priority: 200
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
          {
            name: 'AllowOutBoundActions'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              access: 'Allow'
              priority: 210
              direction: 'Outbound'
              destinationAddressPrefixes: [
                '4.175.114.51/32'
                '20.102.35.120/32'
                '4.175.114.43/32'
                '20.72.125.48/32'
                '20.19.5.100/32'
                '20.7.92.46/32'
                '20.232.252.48/32'
                '52.186.44.51/32'
                '20.22.98.201/32'
                '20.246.184.240/32'
                '20.96.133.71/32'
                '20.253.2.203/32'
                '20.102.39.220/32'
                '20.81.127.181/32'
                '52.148.30.208/32'
                '20.14.42.190/32'
                '20.85.159.192/32'
                '52.224.205.173/32'
                '20.118.176.156/32'
                '20.236.207.188/32'
                '20.242.161.191/32'
                '20.166.216.139/32'
                '20.253.126.26/32'
                '52.152.245.137/32'
                '40.118.236.116/32'
                '20.185.75.138/32'
                '20.96.226.211/32'
                '52.167.78.33/32'
                '20.105.13.142/32'
                '20.253.95.3/32'
                '20.221.96.90/32'
                '51.138.235.85/32'
                '52.186.47.208/32'
                '20.7.220.66/32'
                '20.75.4.210/32'
                '20.120.75.171/32'
                '20.98.183.48/32'
                '20.84.200.15/32'
                '20.14.235.135/32'
                '20.10.226.54/32'
                '20.22.166.15/32'
                '20.65.21.88/32'
                '20.102.36.236/32'
                '20.124.56.57/32'
                '20.94.100.174/32'
                '20.102.166.33/32'
                '20.31.193.160/32'
                '20.232.77.7/32'
                '20.102.38.122/32'
                '20.102.39.57/32'
                '20.85.108.33/32'
                '40.88.240.168/32'
                '20.69.187.19/32'
                '20.246.192.124/32'
                '20.4.161.108/32'
                '20.22.22.84/32'
                '20.1.250.47/32'
                '20.237.33.78/32'
                '20.242.179.206/32'
                '40.88.239.133/32'
                '20.121.247.125/32'
                '20.106.107.180/32'
                '20.22.118.40/32'
                '20.15.240.48/32'
                '20.84.218.150/32'
              ]
            }
          }
          {
            name: 'AllowOutBoundGitHub'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              access: 'Allow'
              priority: 220
              direction: 'Outbound'
              destinationAddressPrefixes: [
                '140.82.112.0/20'
                '143.55.64.0/20'
                '185.199.108.0/22'
                '192.30.252.0/22'
                '20.175.192.146/32'
                '20.175.192.147/32'
                '20.175.192.149/32'
                '20.175.192.150/32'
                '20.199.39.227/32'
                '20.199.39.228/32'
                '20.199.39.231/32'
                '20.199.39.232/32'
                '20.200.245.241/32'
                '20.200.245.245/32'
                '20.200.245.246/32'
                '20.200.245.247/32'
                '20.200.245.248/32'
                '20.201.28.144/32'
                '20.201.28.148/32'
                '20.201.28.149/32'
                '20.201.28.151/32'
                '20.201.28.152/32'
                '20.205.243.160/32'
                '20.205.243.164/32'
                '20.205.243.165/32'
                '20.205.243.166/32'
                '20.205.243.168/32'
                '20.207.73.82/32'
                '20.207.73.83/32'
                '20.207.73.85/32'
                '20.207.73.86/32'
                '20.207.73.88/32'
                '20.233.83.145/32'
                '20.233.83.146/32'
                '20.233.83.147/32'
                '20.233.83.149/32'
                '20.233.83.150/32'
                '20.248.137.48/32'
                '20.248.137.49/32'
                '20.248.137.50/32'
                '20.248.137.52/32'
                '20.248.137.55/32'
                '20.26.156.215/32' 
                '20.26.156.216/32'
                '20.27.177.113/32'
                '20.27.177.114/32'
                '20.27.177.116/32'
                '20.27.177.117/32'
                '20.27.177.118/32'
                '20.29.134.17/32'
                '20.29.134.18/32'
                '20.29.134.19/32'
                '20.29.134.23/32'
                '20.29.134.24/32'
                '20.87.245.0/32'
                '20.87.245.1/32'
                '20.87.245.4/32'
                '20.87.245.6/32'
                '20.87.245.7/32'
                '4.208.26.196/32'
                '4.208.26.197/32'
                '4.208.26.198/32'
                '4.208.26.199/32'
                '4.208.26.200/32'
              ]
            }
          }
          {
            name: 'AllowStorageOutbound'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'Storage'
              access: 'Allow'
              priority: 230
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
        ]
      }
    }
    

1. Obtener el objeto databaseId para tu organización

Puedes usar la siguiente consulta de GraphQL para recuperar la organización databaseId. Usarás la organización databaseId para el valor de la variable de entorno DATABASE_ID en el paso siguiente. Para más información sobre cómo trabajar con GraphQL, consulta "Formar llamados con GraphQl".

Variable de consultaDescripción
loginInicio de sesión de la cuenta de la organización, que puede identificar examinando la dirección URL de la organización, https://github.com/organizations/ORGANIZATION_LOGIN.
query(
  $login: String!
){
  organization (login: $login)
  {
    login
    databaseId
  }
}
'
Variables
{
  "login": "ORGANIZATION_LOGIN"
}

De forma alternativa, puede utilizar el siguiente comando curl para buscar su databaseId.

Shell
curl -H "Authorization: Bearer BEARER_TOKEN" -X POST \
  -d '{ "query": "query($login: String!) { organization (login: $login) { login databaseId } }" ,
        "variables": {
          "login": "ORGANIZATION_LOGIN"
        }
      }' \
https://api.github.com/graphql

2. Use un script para configurar los recursos de Azure

Use el siguiente script para configurar una subred para redes privadas de Azure. El script crea todos los recursos en el mismo grupo de recursos.

Para usar el script, rellene los valores de la variable de entorno de marcador de posición con los valores reales y ejecute el script desde un shell de Bash o Subsistema de Windows para Linux.

Notas:

  • Ejecute el siguiente script en el mismo directorio donde guardó el archivo actions-nsg-deployment.bicep.
  • Al establecer la variable de entorno YOUR_AZURE_LOCATION, use el nombre de la región. Este valor es diferente del nombre para mostrar de la región. Para ver una lista de nombres y nombres para mostrar, use az account list-locations -o table.
  • Al crear el recurso de configuración de red, se aplica un vínculo de asociación de servicio a la subred que proporcione. Este vínculo evita la eliminación accidental de la subred mientras se usa en el servicio GitHub Actions.
  • Si personaliza esta secuencia de comandos para usar recursos de red en subredes existentes, debe asegurarse de que las interfaces de red existentes (NIC) conectadas a la subred se eliminan antes de que la subred se delegue al servicio GitHub Actions. De lo contrario, el servicio no podrá aplicar el vínculo de asociación de servicio a la subred.
Bash
#!/bin/bash

# This script creates the following resources in the specified subscription:
# - Resource group
# - Network Security Group rules
# - Virtual network (vnet) and subnet
# - Network Settings with specified subnet and GitHub Enterprisedatabase ID
#
# It also registers the `GitHub.Network` resource provider with the subscription,
# delegates the created subnet to the Actions service via the `GitHub.Network/NetworkSettings`
# resource type, and applies the NSG rules to the created subnet.

# stop on failure
set -e

#set environment
export AZURE_LOCATION=YOUR_AZURE_LOCATION
export SUBSCRIPTION_ID=YOUR_SUBSCRIPTION_ID
export RESOURCE_GROUP_NAME=YOUR_RESOURCE_GROUP_NAME
export VNET_NAME=YOUR_VNET_NAME
export SUBNET_NAME=YOUR_SUBNET_NAME
export NSG_NAME=YOUR_NSG_NAME
export NETWORK_SETTINGS_RESOURCE_NAME=YOUR_NETWORK_SETTINGS_RESOURCE_NAME
export DATABASE_ID=YOUR_DATABASE_ID

# These are the default values. You can adjust your address and subnet prefixes.
export ADDRESS_PREFIX=10.0.0.0/16
export SUBNET_PREFIX=10.0.0.0/24

echo
echo login to Azure
. az login --output none

echo
echo set account context $SUBSCRIPTION_ID
. az account set --subscription $SUBSCRIPTION_ID

echo
echo Register resource provider GitHub.Network
. az provider register --namespace GitHub.Network

echo
echo Create resource group $RESOURCE_GROUP_NAME at $AZURE_LOCATION
. az group create --name $RESOURCE_GROUP_NAME --location $AZURE_LOCATION

echo
echo Create NSG rules deployed with 'actions-nsg-deployment.bicep' file
. az deployment group create --resource-group $RESOURCE_GROUP_NAME --template-file ./actions-nsg-deployment.bicep --parameters location=$AZURE_LOCATION nsgName=$NSG_NAME

echo
echo Create vnet $VNET_NAME and subnet $SUBNET_NAME
. az network vnet create --resource-group $RESOURCE_GROUP_NAME --name $VNET_NAME --address-prefix $ADDRESS_PREFIX --subnet-name $SUBNET_NAME --subnet-prefixes $SUBNET_PREFIX

echo
echo Delegate subnet to GitHub.Network/networkSettings and apply NSG rules
. az network vnet subnet update --resource-group $RESOURCE_GROUP_NAME --name $SUBNET_NAME --vnet-name $VNET_NAME --delegations GitHub.Network/networkSettings --network-security-group $NSG_NAME

echo
echo Create network settings resource $NETWORK_SETTINGS_RESOURCE_NAME
. az resource create --resource-group $RESOURCE_GROUP_NAME  --name $NETWORK_SETTINGS_RESOURCE_NAME --resource-type GitHub.Network/networkSettings --properties "{ \"location\": \"$AZURE_LOCATION\", \"properties\" : {  \"subnetId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME\", \"businessId\": \"$DATABASE_ID\" }}" --is-full-object --output table --query "{GitHubId:tags.GitHubId, name:name}" --api-version 2024-04-02

echo
echo To clean up and delete resources run the following command:
echo az group delete --resource-group $RESOURCE_GROUP_NAME

El script devolverá la carga completa del recurso creado. El valor hash de GitHubId devuelto en la carga útil del recurso creado es el identificador de recurso de configuración de red que usará en los pasos siguientes al configurar una opción de red en GitHub.

Creación de una configuración de red para tu empresa en GitHub

Después de configurar los recursos de Azure, puedes utilizar una instancia de Azure Virtual Network (VNET) para redes privadas mediante la creación de una configuración de red a nivel de empresa u organización. A continuación, puede asociar esa configuración de red a grupos de ejecutores. Para más información acerca de los grupos de ejecutores, consulta "Control del acceso a los ejecutores más grandes."

Una vez asociada la configuración de red a un grupo de ejecutores, todos los ejecutores de ese grupo tendrán acceso a la red virtual de Azure que se ha conectado a la configuración subyacente.

Requisitos previos

Asegúrese de que los recursos de Azure se han configurado antes de agregar una configuración de red en GitHub. Para obtener más información, consulte "Configuración de redes privadas para los ejecutores hospedados en GitHub en su empresa".

1. Agregar una nueva configuración de red para tu organización

  1. En la esquina superior derecha de GitHub, seleccione la foto del perfil y haga clic en Sus organizaciones.
  2. Junto a la organización, haga clic en Settings.
  3. En la barra lateral de la izquierda, haz clic en Red informática alojada.
  4. Haga clic en la lista desplegable Nueva configuración de red. A continuación, haga clic en Red privada de Azure.
  5. Aporte un nombre a la configuración de red.
  6. Haga clic en Agregar red virtual de Azure.
  7. En la ventana emergente, escriba el identificador de recurso de configuración de red que recuperó al configurar los recursos de Azure para redes privadas.
  8. Haga clic en Agregar red virtual de Azure.

2. Crear un grupo de ejecutores para tu organización

Nota: Para que el grupo de ejecutores sea accesible por los repositorios de las organizaciones, dichos repositorios deben tener acceso a ese grupo de ejecutores a nivel de organización. Para obtener más información, vea «Control del acceso a los ejecutores más grandes».

  1. Crea un grupo de ejecutores para la organización. Para más información acerca de cómo crear un grupo de ejecutores, consulta "Control del acceso a los ejecutores más grandes."
  2. Para elegir una directiva para el acceso al repositorio, selecciona el menú desplegable Acceso a los repositorios y haz clic en una directiva. Puedes configurar un grupo de ejecutores para que sea accesible para una lista específica de repositorios o para todos los repositorios de la organización.
  3. Al configurar el grupo de ejecutores, en "Configuraciones de red", use el menú desplegable para seleccionar la configuración de red que creó para la red virtual de Azure.
  4. Para crear el grupo y aplicar la directiva, haga clic en Crear grupo.

3. Agregar un ejecutor hospedado en GitHub

al grupo de ejecutores de la organización

Nota: Al agregar los datos del ejecutor hospedado en GitHub a un grupo de ejecutores, seleccione el grupo de ejecutores creado en los procedimientos anteriores.

  1. Agregue un ejecutor GitHub hospedado al grupo de ejecutores Para obtener más información, vea «Administración de ejecutores más grandes».

4. Opcionalmente, administrar configuraciones de red

  1. En la esquina superior derecha de GitHub, seleccione la foto del perfil y haga clic en Sus organizaciones.
  2. Junto a la organización, haga clic en Settings.
  3. En la barra lateral de la izquierda, haga clic en Redes de equipo hospedadas.
  4. Para editar una configuración de red, a la derecha de la configuración de red, haga clic en . A continuación, haga clic en Editar configuración.
  5. Para deshabilitar una configuración de red, a la derecha de la configuración de red, haga clic en . Posteriormente, haga clic en Deshabilitar.
  6. Para eliminar una configuración de red, a la derecha de la configuración de red, haga clic en . Luego haga clic en Eliminar.

Eliminación de una subred

Al crear el recurso de configuración de red, se aplica un vínculo de asociación de servicio a la subred que proporcione. Este vínculo evita la eliminación accidental de la subred mientras se usa en el servicio GitHub Actions.

Para eliminar la subred, primero debe quitarse el vínculo de asociación de servicio. El vínculo de asociación de servicio se quita de forma segura y automática una vez se ha eliminado el recurso de configuración de red.

Para eliminar el recurso de configuración de red, primero debe eliminarse la configuración de red que la usa.

  1. En la esquina superior derecha de GitHub, haga clic en su foto de perfil y, a continuación, en Sus empresas.

  2. En la lista de empresas, da clic en aquella que quieras ver.

  3. En el lado izquierdo de la página, en la barra lateral de la cuenta de empresa, haz clic en Configuración.

  4. En la barra lateral de la izquierda, haga clic en Redes de equipo hospedadas.

  5. Abra la configuración de red que usa la subred que desea eliminar.

  6. Revise la lista de grupos de ejecutores mediante la configuración de red.

  7. En la esquina superior derecha, haga clic en el botón "". A continuación, haga clic en Eliminar configuración.

  8. Para eliminar el recurso de configuración de red y quitar el vínculo de asociación de servicio, use sus propias entradas con los siguientes comandos con la CLI de Azure. Para más información, véase la documentación de la interfaz de la línea de comandos Azure (CLI).

    Bash
    az account set --subscription $SUBSCRIPTION_ID
    az resource delete -g $RESOURCE_GROUP_NAME --name $NETWORK_SETTINGS_RESOURCE_NAME --resource-type 'GitHub.Network/networkSettings' --api-version '2023-11-01-preview'
    
  9. Elimine la subred en Azure. Para más información, consulta Eliminación de una subred en Microsoft Learn.