关于 GitHub 托管运行器的 Azure 专用网络
若要将GitHub托管运行程序与 Azure VNET 配合使用,请先配置Azure资源。 然后,在 GitHub 中创建专用网络配置。
以下流程将引导你完成这两步操作。
有关使用 Azure VNET 中的 GitHub 托管的运行器时排查常见问题的详细信息,请参阅 排查组织中的 GitHub 托管运行器的 Azure 专用网络配置问题。
注意
默认情况下,企业中的组织无法创建新的网络配置,只能继承企业级网络配置。 企业所有者可以设置策略,允许企业中的组织创建独立于企业的网络配置。 有关详细信息,请参阅“为企业中的GitHub托管运行器配置私有网络”。
配置Azure资源
将使用脚本自动配置 Azure 资源。
先决条件
-
使用具有订阅参与者角色和网络参与者角色的 Azure 帐户。 这些角色可让你注册
GitHub.Network资源提供程序,并对子网进行委托。 有关详细信息,请参阅Azure文档中Azure内置角色。 -
若要将子网与正确的用户关联,必须在创建虚拟网络的同一订阅中创建 Azure
NetworkSettings资源。 -
为了确保资源可用性/数据驻留,必须在同一 Azure 区域中创建资源。
-
来自该子网的出站网络流量不得受到 TLS 拦截,因为我们的虚拟机不会被配置为信任贵网络用于实施此类拦截的中间证书。
如果需要使用 TLS 拦截,可以通过自定义映像安装中间证书。 请参阅“使用自定义映像”。
-
建议对 Azure VNET 进行某种级别的网络流量控制,并使用基于 DNS/域的控制。 以前建议的 IP 地址将在 2026 年 7 月 1 日或之后关闭。
DNS/域控制(建议)
如果您使用 Azure VNET 通过 DNS 或域名控制由 GitHub 托管的运行器的出站访问,则需要将一组用于 GitHub Actions 功能的域名加入允许列表。 这是推荐的方法,因为这些域名会发布到 GitHub meta 终结点,而该终结点 GitHub 会随着网络要求的变化保持更新。 有关按函数划分的域的细分,请参阅 自托管运行程序参考 中的“通信”部分。
您可以在位于 https://api.github.com/meta 的 GitHub meta 端点上找到要加入允许列表的域名。 有关元终结点的详细信息,请参阅 元数据的 REST API 端点。
在 meta 端点上有三个部分,你可以根据这些部分选择将其加入允许列表:
domains.actions_inbound.full_domains:GitHub Actions 功能所需的极其具体的精确域名列表,且不包含通配符域名。domains.actions:一个折中的域名列表,其中对某些由 GitHub 拥有的域名使用了通配符,而其他域名则被明确列出。domains.actions_inbound.wildcard_domains:主要由通配符域名组成的列表。 从域名变更的角度来看,这是最稳定的。
警告
元数据端点上要求的域名可能会发生变化。 GitHub 确保域在投入使用前,已在 meta 端点上至少保留一周。 元终结点不提供“上次更新时间”,因此不能依赖时间戳来检测更改。
如果计划使用更具体的域列表,则必须每周检查新域并相应地更新网络控制系统,否则作业 GitHub Actions 可能会遇到意外问题。 由于新域名至少会在需要使用前一周发布,因此每周检查一次,就有足够的准备时间在变更生效前进行调整。 允许某些 GitHub 域通配符的中间位置列表将更加稳定,并且完整的通配符列表应几乎没有变化。
可以使用所选的任何技术在 Azure VNET 上执行 DNS/域控制。 本指南适用于基本功能所需的最少域;对于其他方案,可能需要将更多域添加到允许列表系统。
IP 地址控件
警告
下面的基于 .bicep IP 的模板将在 关闭 2026 年 7 月 1 日或之后删除。 它仍可用于支持迁移至基于 DNS/域的控制(请参阅上文“DNS/域控制”)。 对于将此 IP 列表硬编码或写入模板中(例如在 Terraform 中)的客户,当底层 Azure IP 范围发生变化时,可能会面临流量中断的风险,因为此静态列表不会得到及时更新。 请在此模板被移除之前迁移到 Meta 端点域名。
注意
要确定适当的子网 IP 地址范围,建议为预期的最大作业并发添加 30% 的缓冲区。 例如,如果网络配置的运行器的最大作业并发设置为 300,则建议使用可容纳至少 390 个运行器的子网 IP 地址范围。 此缓冲区有助于确保网络可以处理虚拟机需求的意外增加,以满足作业并发,而无需耗尽 IP 地址。
如果在转换期间使用 IP 地址控制出站访问,请保存以下 .bicep 文件。 为 actions-nsg-deployment.bicep 文件命名。
我们提供的 .bicep 文件包含将 GitHub 托管的运行器与 Azure VNET 配合使用时所需的最小规则集。 可能需要为特定用例添加规则。
如果您使用 带有数据驻留权的 GitHub Enterprise Cloud,则在 AllowOutBoundGitHub 部分中,还必须包含 GHE.com 的入口 IP 范围。 请参阅“GHE.com 的网络详细信息”。
@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: '443'
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: '443'
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.217.135.1/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.26.156.211/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'
'4.225.11.196/32'
'4.237.22.32/32'
]
}
}
{
name: 'AllowStorageOutbound'
properties: {
protocol: '*'
sourcePortRange: '*'
destinationPortRange: '443'
sourceAddressPrefix: '*'
destinationAddressPrefix: 'Storage'
access: 'Allow'
priority: 230
direction: 'Outbound'
destinationAddressPrefixes: []
}
}
]
}
}
@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: '443'
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: '443'
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.217.135.1/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.26.156.211/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'
'4.225.11.196/32'
'4.237.22.32/32'
]
}
}
{
name: 'AllowStorageOutbound'
properties: {
protocol: '*'
sourcePortRange: '*'
destinationPortRange: '443'
sourceAddressPrefix: '*'
destinationAddressPrefix: 'Storage'
access: 'Allow'
priority: 230
direction: 'Outbound'
destinationAddressPrefixes: []
}
}
]
}
}
1. 为组织获取 databaseId
提示
你的令牌至少需要 read:org 权限才能执行成功的查询。
可以使用以下 GraphQL 查询来检索组织 databaseId。 在下一步中,将使用组织 databaseId 来获取 DATABASE_ID 环境变量的值。 有关使用 GraphQL 的详细信息,请参阅“使用 GraphQL 建立调用”。
| 查询变量 | 说明 |
|---|---|
login | 组织帐户的登录,可查看组织的 URL https:/ 识别。 |
query(
$login: String!
){
organization (login: $login)
{
login
databaseId
}
}
'
Variables
{
"login": "ORGANIZATION_LOGIN"
}
或者,你可以使用以下 curl 命令查找 databaseId。
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
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. 使用脚本来配置 Azure 资源
使用以下脚本为 Azure 私有网络设置子网。 此脚本创建了同一资源组中的所有资源。
若要使用该脚本,请使用实际值填充占位符环境变量值,然后从 bash shell 或适用于 Linux 的 Windows 子系统运行脚本。
注意
- 在保存以下
actions-nsg-deployment.bicep文件的相同目录中运行以下脚本。 - 设置
YOUR_AZURE_LOCATION环境变量时,请使用区域的名称。 此值不同于区域的显示名称。 要查看名称和显示名称的列表,请使用az account list-locations -o table。 - 创建网络设置资源时,服务关联链接将应用于你所提供的子网。 此链接可防止 GitHub Actions 服务使用子网时意外删除该子网。
- 如果自定义此脚本以使用现有子网中的网络资源,则必须确保在将子网委派给 GitHub Actions 服务之前删除与子网连接的现有网络接口 (NIC)。 否则,服务将无法将服务关联链接应用到子网。
#!/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
export API_VERSION=2024-04-02
# 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 $API_VERSION
echo
echo To clean up and delete resources run the following command:
echo az group delete --resource-group $RESOURCE_GROUP_NAME
#!/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
export API_VERSION=2024-04-02
# 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 $API_VERSION
echo
echo To clean up and delete resources run the following command:
echo az group delete --resource-group $RESOURCE_GROUP_NAME
该脚本将返回所创建资源的完整有效负载。 在创建的资源的有效负载中返回的 GitHubId 哈希值是网络设置资源 ID,你将在后续步骤中使用 GitHub 配置网络配置时使用这些 ID。
在 GitHub 中为组织创建网络配置
配置Azure资源后,可以通过在组织级别创建网络配置,将 Azure 虚拟网络 (VNET)用于专用网络。 然后,你可以将该网络配置与运行器组关联。
请注意,在创建使用 Azure 配置的网络设置时,初始设置必须在企业级别进行。 这就是为什么在获取 databaseId 时,步骤会要求你配置企业标识符。 只有在企业通过企业策略启用托管计算网络后,组织才可以创建自己的网络配置。 有关运行器组的更多信息,请参阅“控制对较大运行器的访问”。
网络配置与运行器组关联后,该组中的所有运行器均将有权访问已连接到底层配置的 Azure VNET。
先决条件
在添加网络配置__GitHub,请确保已配置 Azure 资源。 有关详细信息,请参阅 为企业中的GitHub托管运行器配置私有网络。
1. 为组织添加新的网络配置
-
在 GitHub 的右上角,单击个人资料图片,然后单击“ Your organizations”****。
-
单击以选择一个组织。
-
在组织名称下,单击 “Settings”****。 如果看不到“设置”选项卡,请选择“”下拉菜单,然后单击“设置”********。

-
在左侧边栏中,单击托管的计算网络。
-
单击“新建网络配置”下拉列表。 然后单击Azure专用网络。
-
为网络配置命名。
-
单击 Add Azure 虚拟网络。
-
在弹出窗口中,输入为专用网络配置Azure资源时检索的网络设置资源 ID。
-
单击 Add Azure 虚拟网络。
2. 为组织创建运行器组
注意
若要让组织内存储库可以访问运行器组,这些存储库必须有权在组织级别访问该运行器组。 有关详细信息,请参阅“控制对较大运行器的访问”。
- 为组织创建新的运行器组。 有关如何创建运行器组的详细信息,请参阅“控制对较大运行器的访问”。
- 要选择存储库访问策略,请选择“存储库访问”下拉列表,然后单击一个策略。 你可以将运行程序组配置为可供特定存储库列表或组织中的所有存储库访问。
- 在配置运行程序组时,在“网络配置”下,使用下拉菜单选择为 Azure VNET 创建的网络配置。
- 要创建组并应用策略,请单击创建组。
3. 将 GitHub托管的运行器添加到组织运行器组
注意
将您的 GitHub 托管运行器添加到运行器组时,请选择您在前面步骤中创建的运行器组。
- 将 GitHub 托管的 runner 添加到 runner 组。 有关详细信息,请参阅“管理较大的运行器”。
4.(可选)管理网络配置
-
在 GitHub 的右上角,单击个人资料图片,然后单击“ Your organizations”****。
-
单击以选择一个组织。
-
在组织名称下,单击 “Settings”****。 如果看不到“设置”选项卡,请选择“”下拉菜单,然后单击“设置”********。

-
在左侧边栏中,单击托管的计算网络。
-
若要编辑网络配置,请在网络配置右侧单击 。 单击“编辑配置”。
-
若要禁用网络配置,请在网络配置右侧单击 。 然后单击“禁用”。
-
若要删除网络配置,请在网络配置右侧单击 。 然后单击“删除”****。
5. (可选)将故障转移网络添加到网络配置
注意
VNET 故障转移处于 公开预览 阶段,可能会发生变化。
可以为您的网络配置故障转移网络。 故障转移网络是辅助 Azure 虚拟网络子网,可以位于与主子网不同的 Azure 区域中。 如果主子网因区域性中断或其他原因而不可用,您可以启用故障转移网络,通过辅助子网路由跑程流量,从而保持 GitHub Actions 工作流的连续性。
关于 VNET 故障转移的关键点:
- 故障转移子网可以驻留在与主子网不同的 Azure 区域中。
- 在主子网和故障转移子网之间切换是一个手动过程。 可以随意启用或禁用故障转移网络。
- 主子网和故障转移子网都必须使用所需的 Azure 资源(VNET/子网、网络设置等)进行配置,然后才能使用故障转移。
- 故障转移子网必须位于 受支持的区域中。
在添加故障转移网络之前,请确保已为辅助子网配置 Azure 资源(VNET、子网、网络安全组和网络设置资源),并遵循上述相同的“配置 Azure 资源”过程。 故障转移子网可以位于与主子网不同的 Azure 区域中。
-
在 GitHub 的右上角,单击个人资料图片,然后单击“ Your organizations”****。
-
单击以选择一个组织。
-
在组织名称下,单击 “Settings”****。 如果看不到“设置”选项卡,请选择“”下拉菜单,然后单击“设置”********。

-
在左侧边栏中,单击托管的计算网络。
-
单击要向其添加故障转移网络的网络配置旁边的编辑图标()。 单击“编辑配置”。
-
单击“ 添加故障转移网络”。
-
在弹出窗口中,输入辅助(故障转移)Azure 子网的网络设置资源 ID。
-
单击 Add Azure 虚拟网络。
-
现在你将在网络配置中看到列出的两个子网:主子网和故障转移子网,已相应标记。
6. (可选)启用或禁用故障转移网络
添加故障转移网络后,可以启用它以通过辅助子网路由流量,或将其禁用以返回到主子网。
-
在 GitHub 的右上角,单击个人资料图片,然后单击“ Your organizations”****。
-
单击以选择一个组织。
-
在组织名称下,单击 “Settings”****。 如果看不到“设置”选项卡,请选择“”下拉菜单,然后单击“设置”********。

-
在左侧边栏中,单击托管的计算网络。
-
单击网络配置旁边的编辑图标()。 单击“编辑配置”。
-
若要切换到故障转移网络,请单击“ 启用故障转移 VNET”。 运行器流量将通过故障转移子网路由。
-
若要切换回主网络,请单击“ 禁用备用 VNET”。 运行器流量将返回主子网。
注意
如果 GitHub 在区域中断期间自动启用故障转移,你将通过审核日志事件和电子邮件收到通知。 必须手动禁用切换功能,以便在故障解除后能够返回主子网。
删除子网
创建网络设置资源时,服务关联链接将应用于你所提供的子网。 此链接可防止 GitHub Actions 服务使用子网时意外删除该子网。
要删除子网,首先需要移除此服务关联链接。 删除网络设置资源后,服务关联链接将被自动安全移除。
需要首先删除使用它的网络配置,然后才能删除网络设置资源。
-
导航到您的企业。 例如,从 GitHub.com 上的 公司 页面。
-
在页面顶部,单击“ 设置”。
-
在左侧边栏中,单击托管的计算网络。
-
打开正在使用要删除的子网的网络配置。
-
检查使用该网络配置的运行器组列表。
-
单击右上角的“”按钮。 然后单击“删除配置”****。
-
要删除网络设置资源并移除服务关联链接,请使用以下 Azure CLI 命令以及你自己的输入。 有关详细信息,请参阅 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 $API_VERSION
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 $API_VERSION -
删除 Azure 中的子网。 有关详细信息,请参阅 Microsoft Learn 上的删除子网。