使用 GitHub Actions 连接到 Azure

了解如何将 Azure 登录Azure PowerShellAzure 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 应用程序和服务主体,然后将订阅上的角色分配给应用程序,以便工作流有权访问订阅。

  1. 如果没有现有应用程序,请注册可访问 资源的新 Microsoft Entra 应用程序和服务主体。 在此过程过程中,请确保:

    • 使用 Microsoft Entra ID 注册应用程序并创建服务主体
    • 向应用程序分配角色
  2. 在 Azure 门户中打开“应用注册”,找到你的应用程序。 复制“应用程序(客户端) ID”和“目录(租户) ID”的值,以便在 GitHub Actions 工作流中使用

  3. 在 Azure 门户中打开“订阅”,找到你的订阅。 复制订阅 ID。

添加联合凭据

可在 Azure 门户中或使用 Microsoft Graph REST API 添加联合凭据。

  1. 转到 Azure 门户中的“应用注册”,打开你要配置的应用
  2. 在该应用中,转到“证书和机密”
    Select Certificates & secrets.
  3. 在“联合凭据”选项卡中,选择“添加凭据” 。 Add the federated credential
  4. 选择凭据场景“部署 Azure 资源的 GitHub Actions”。 输入你的凭据详细信息,生成凭据。
字段 说明 示例
组织 你的 GitHub 组织名称或 GitHub 用户名。 contoso
存储库 你的 GitHub 存储库名称。 contoso-app
实体类型 用于确定来自 GitHub 工作流的 OIDC 请求范围的筛选器。 此字段用于生成 subject 声明。 Environment、、BranchPull request、、Tag
GitHub名称 环境、分支或标记的名称。 main
名称 联合凭据的标识符。 contoso-deploy

有关更详细的概述,请参阅配置应用使其信任 GitHub 存储库

创建 GitHub 机密

需要向登录操作提供应用程序的“客户端 ID”、“租户 ID”和“订阅 ID” 。 这些值可直接在工作流中提供,或可存储在 GitHub 机密中并在工作流中引用。 将这些值保存为 GitHub 机密是更安全的选择。

  1. 打开 GitHub 存储库并转到“设置”。

    Select Settings in the navigation

  2. 选择“安全性”>“机密和变量”>“操作”。

    Choose to add a secret

  3. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID 创建机密。 将 Azure Active Directory 应用程序中的这些值用于 GitHub 机密:

    GitHub 机密 Azure Active Directory 应用程序
    AZURE_CLIENT_ID 应用程序(客户端)ID
    AZURE_TENANT_ID 目录(租户)ID
    AZURE_SUBSCRIPTION_ID 订阅 ID
  4. 通过选择“添加机密”来保存每个机密。

使用 OpenID Connect 身份验证设置 Azure 登录

GitHub Actions 工作流使用 OpenID Connect 向 Azure 进行身份验证。 若要详细了解此交互,请参阅 GitHub Actions 文档

在此示例中,你将使用 OpenID 连接 Azure CLI 通过 Azure 登录操作向 Azure 进行身份验证。 该示例将 GitHub 机密用于 client-idtenant-idsubscription-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.

GitHub Actions Azure Login successful.

将 Azure 登录操作与服务主体机密结合使用

若要将 Azure 登录与一个服务主体一起使用,首先需要将 Azure 服务主体作为机密添加到 GitHub 存储库。

创建服务主体

在本例中,你将创建一个可用于向 Azure 进行身份验证的机密,名为 AZURE_CREDENTIALS

  1. 在 Azure 门户中打开 Azure Cloud Shell 或在本地打开 Azure CLI

    注意

    如果使用的是 Azure Stack Hub,则需要将 SQL 管理终结点设置为 not supportedaz cloud update -n {environmentName} --endpoint-sql-management https://notsupported

  2. 在 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,带有弃用警告。

  3. 复制你的服务主体的 JSON 对象。

    {
        "clientId": "<GUID>",
        "clientSecret": "<GUID>",
        "subscriptionId": "<GUID>",
        "tenantId": "<GUID>",
        (...)
    }
    

将服务主体添加为 GitHub 机密

  1. GitHub 中,转到存储库。

  2. 转到导航菜单中的“设置”。

  3. 选择“安全性”>“机密和变量”>“操作”。

    Screenshot of select Actions menu item.

  4. 选择“新建存储库机密”。

  5. 将 Azure CLI 命令的整个 JSON 输出粘贴到机密的值字段中。 为机密指定名称 AZURE_CREDENTIALS

  6. 选择“添加机密”。

使用 Azure 登录操作

将服务主体机密与 Azure 登录操作配合使用,以向 Azure 进行身份验证。

在此工作流中,将结合使用 Azure 登录操作和存储在 secrets.AZURE_CREDENTIALS 中的服务主体详细信息进行身份验证。 然后,运行 Azure CLI 操作。 有关如何在工作流文件中引用 GitHub 机密的详细信息,请参阅 GitHub 文档中的在工作流中使用加密的机密

拥有可用的 Azure 登录步骤后,便可以使用 Azure PowerShellAzure 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 政府云,请使用支持的云名称 AzureUSGovernmentAzureChinaCloud 设置可选参数环境。 如果未指定此参数,则将使用默认值 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。

Microsoft Entra ID

Power BI

连接器

Azure Databricks