使用 GitHub Actions 连接到 Azure
了解如何将 Azure 登录与 Azure PowerShell 或 Azure CLI 搭配使用,以便与你的 Azure 资源进行交互。
若要在 GitHub Actions 工作流中使用 Azure PowerShell 或 Azure CLI,首先需要使用 Azure 登录操作进行登录。
Azure 登录操作支持两种不同的 Azure 身份验证方式:
默认情况下,登录操作使用 Azure CLI 登录并设置 Azure CLI 的 GitHub Actions 运行程序环境。 可以通过 Azure 登录操作的 enable-AzPSSession
属性使用 Azure PowerShell。 这会使用 Azure PowerShell 模块设置 GitHub Actions 运行程序环境。
可以使用 Azure 登录来连接到公有云或主权云(包括 Azure 政府和 Azure Stack Hub)。
将 Azure 登录操作与 OpenID Connect 结合使用
要使用 OpenID Connect 设置 Azure 登录并在 GitHub Actions 工作流中使用它,需要:
- 一个 Microsoft Entra 应用程序,其中包含已为订阅分配了适当角色的服务主体。
- 使用联合凭据配置的 Microsoft Entra 应用程序,用于信任 GitHub Actions 颁发给 GitHub 存储库的令牌。 可以在Azure 门户或 Microsoft Graph REST API 中配置此功能。
- 一个 GitHub Actions 工作流,用于请求 GitHub 向工作流颁发令牌,并使用 Azure 登录操作。
创建 Microsoft Entra 应用程序和服务主体
需要创建 Microsoft Entra 应用程序和服务主体,然后将订阅上的角色分配给应用程序,以便工作流有权访问订阅。
如果没有现有应用程序,请注册可访问 资源的新 Microsoft Entra 应用程序和服务主体。 在此过程过程中,请确保:
- 使用 Microsoft Entra ID 注册应用程序并创建服务主体
- 向应用程序分配角色
在 Azure 门户中打开“应用注册”,找到你的应用程序。 复制“应用程序(客户端) ID”和“目录(租户) ID”的值,以便在 GitHub Actions 工作流中使用。
在 Azure 门户中打开“订阅”,找到你的订阅。 复制订阅 ID。
添加联合凭据
可在 Azure 门户中或使用 Microsoft Graph REST API 添加联合凭据。
- 转到 Azure 门户中的“应用注册”,打开你要配置的应用。
- 在该应用中,转到“证书和机密”。
- 在“联合凭据”选项卡中,选择“添加凭据” 。
- 选择凭据场景“部署 Azure 资源的 GitHub Actions”。 输入你的凭据详细信息,生成凭据。
字段 | 说明 | 示例 |
---|---|---|
组织 | 你的 GitHub 组织名称或 GitHub 用户名。 | contoso |
存储库 | 你的 GitHub 存储库名称。 | contoso-app |
实体类型 | 用于确定来自 GitHub 工作流的 OIDC 请求范围的筛选器。 此字段用于生成 subject 声明。 |
Environment 、、Branch Pull request 、、Tag |
GitHub名称 | 环境、分支或标记的名称。 | main |
名称 | 联合凭据的标识符。 | contoso-deploy |
有关更详细的概述,请参阅配置应用使其信任 GitHub 存储库。
创建 GitHub 机密
需要向登录操作提供应用程序的“客户端 ID”、“租户 ID”和“订阅 ID” 。 这些值可直接在工作流中提供,或可存储在 GitHub 机密中并在工作流中引用。 将这些值保存为 GitHub 机密是更安全的选择。
打开 GitHub 存储库并转到“设置”。
选择“安全性”>“机密和变量”>“操作”。
为
AZURE_CLIENT_ID
、AZURE_TENANT_ID
和AZURE_SUBSCRIPTION_ID
创建机密。 将 Azure Active Directory 应用程序中的这些值用于 GitHub 机密:GitHub 机密 Azure Active Directory 应用程序 AZURE_CLIENT_ID 应用程序(客户端)ID AZURE_TENANT_ID 目录(租户)ID AZURE_SUBSCRIPTION_ID 订阅 ID 通过选择“添加机密”来保存每个机密。
使用 OpenID Connect 身份验证设置 Azure 登录
GitHub Actions 工作流使用 OpenID Connect 向 Azure 进行身份验证。 若要详细了解此交互,请参阅 GitHub Actions 文档。
在此示例中,你将使用 OpenID 连接 Azure CLI 通过 Azure 登录操作向 Azure 进行身份验证。 该示例将 GitHub 机密用于 client-id
、tenant-id
和 subscription-id
值。 你还可以直接在登录操作中传递这些值。
Azure 登录操作包括默认为api://AzureADTokenExchange
的可选audience
输入参数。 可以为自定义受众值更新此参数。
此工作流使用 OpenID 连接进行身份验证,并使用 Azure CLI 获取连接的订阅和列表资源组的详细信息。
name: Run Azure Login with OpenID Connect
on: [push]
permissions:
id-token: write
contents: read
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 'Az CLI login'
uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: 'Run Azure CLI commands'
run: |
az account show
az group list
pwd
通过 OpenID 验证 Azure 登录是否成功
打开 Az CLI login
操作并验证它是否成功运行。 应该看到消息 Login successful
。 如果登录失败,你将看到消息 Az CLI Login failed.
。
将 Azure 登录操作与服务主体机密结合使用
若要将 Azure 登录与一个服务主体一起使用,首先需要将 Azure 服务主体作为机密添加到 GitHub 存储库。
创建服务主体
在本例中,你将创建一个可用于向 Azure 进行身份验证的机密,名为 AZURE_CREDENTIALS
。
在 Azure 门户中打开 Azure Cloud Shell 或在本地打开 Azure CLI。
注意
如果使用的是 Azure Stack Hub,则需要将 SQL 管理终结点设置为
not supported
。az cloud update -n {environmentName} --endpoint-sql-management https://notsupported
在 Azure 门户中为你的应用创建新服务主体。 必须使用适当的角色分配服务主体。
az ad sp create-for-rbac --name "myApp" --role contributor \ --scopes /subscriptions/{subscription-id}/resourceGroups/{resource-group} \ --json-auth
该参数
--json-auth
输出登录操作接受的结果字典,可在 Azure CLI 版本 >= 2.51.0 中访问。 此版本之前的版本使用--sdk-auth
,带有弃用警告。复制你的服务主体的 JSON 对象。
{ "clientId": "<GUID>", "clientSecret": "<GUID>", "subscriptionId": "<GUID>", "tenantId": "<GUID>", (...) }
将服务主体添加为 GitHub 机密
在 GitHub 中,转到存储库。
转到导航菜单中的“设置”。
选择“安全性”>“机密和变量”>“操作”。
选择“新建存储库机密”。
将 Azure CLI 命令的整个 JSON 输出粘贴到机密的值字段中。 为机密指定名称
AZURE_CREDENTIALS
。选择“添加机密”。
使用 Azure 登录操作
将服务主体机密与 Azure 登录操作配合使用,以向 Azure 进行身份验证。
在此工作流中,将结合使用 Azure 登录操作和存储在 secrets.AZURE_CREDENTIALS
中的服务主体详细信息进行身份验证。 然后,运行 Azure CLI 操作。 有关如何在工作流文件中引用 GitHub 机密的详细信息,请参阅 GitHub 文档中的在工作流中使用加密的机密。
拥有可用的 Azure 登录步骤后,便可以使用 Azure PowerShell 或 Azure CLI 操作。 还可以使用其他 Azure 操作,如 Azure webapp 部署和 Azure Functions。
on: [push]
name: AzureLoginSample
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Log in with Azure
uses: azure/login@v1
with:
creds: '${{ secrets.AZURE_CREDENTIALS }}'
使用 Azure PowerShell 操作
在此示例中,你将使用 Azure 登录操作进行登录,然后使用 Azure PowerShell 操作检索资源组。
on: [push]
name: AzureLoginSample
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Log in with Azure
uses: azure/login@v1
with:
creds: '${{ secrets.AZURE_CREDENTIALS }}'
enable-AzPSSession: true
- name: Azure PowerShell Action
uses: Azure/powershell@v1
with:
inlineScript: Get-AzResourceGroup -Name "< YOUR RESOURCE GROUP >"
azPSVersion: "latest"
使用 Azure CLI 操作
在本例中,你需要使用 Azure 登录操作登录,然后使用 Azure CLI 操作检索资源组。
on: [push]
name: AzureLoginSample
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Log in with Azure
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Azure CLI script
uses: azure/CLI@v1
with:
azcliversion: 2.0.72
inlineScript: |
az account show
az storage -h
连接到 Azure 政府和 Azure Stack Hub 云
若要登录到其中一个 Azure 政府云,请使用支持的云名称 AzureUSGovernment
或 AzureChinaCloud
设置可选参数环境。 如果未指定此参数,则将使用默认值 AzureCloud
并连接到 Azure 公有云。
- name: Login to Azure US Gov Cloud with CLI
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_US_GOV_CREDENTIALS }}
environment: 'AzureUSGovernment'
enable-AzPSSession: false
- name: Login to Azure US Gov Cloud with Az Powershell
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_US_GOV_CREDENTIALS }}
environment: 'AzureUSGovernment'
enable-AzPSSession: true
连接其他 Azure 服务
以下文章详细介绍了如何从 Azure 与其他服务连接到 GitHub。