你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用 GitHub Actions 部署到应用服务并连接到数据库

了解如何设置 GitHub Actions 工作流来使用 Azure SQL 数据库后端部署 ASP.NET Core 应用程序。 完成后,你便拥有了一个在 Azure 中运行并连接到 SQL 数据库的 ASP.NET 应用。 首先使用 ARM 模板创建资源。

本教程不使用容器。 如果要部署到容器化的 ASP.NET Core 应用程序,请参阅使用 GitHub Actions 部署到用于容器的应用服务并连接到数据库

在本教程中,你将了解如何执行以下操作:

  • 使用 GitHub Actions 工作流通过 Azure 资源管理器模板(ARM 模板)将资源添加到 Azure
  • 使用 GitHub Actions 工作流生成 ASP.NET Core 应用程序

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

先决条件

若要完成本教程,你需要:

  • 具有活动订阅的 Azure 帐户。 免费创建帐户
  • 一个 GitHub 帐户。 如果没有该帐户,请注册免费版
    • GitHub 存储库,用于存储资源管理器模板和工作流文件。 若要创建一个存储库,请参阅创建新存储库

下载示例

在 Azure 示例存储库中创建示例项目的分支

https://github.com/Azure-Samples/dotnetcore-sqldb-ghactions

创建资源组

https://shell.azure.com 上打开 Azure Cloud Shell。 或者,可以使用 Azure CLI(如果已在本地安装)。 (有关 Cloud Shell 的详细信息,请参阅 Cloud Shell 概述。)

az group create --name {resource-group-name} --location {resource-group-location}

生成部署凭据

OpenID Connect 是一种使用短期令牌的身份验证方法。 使用 GitHub Actions 设置 OpenID Connect 的过程会更复杂,能提供更强的安全性。

  1. 如果当前没有应用程序,请注册一个新的可访问资源的 Microsoft Entra 应用程序和服务主体

    az ad app create --display-name myApp
    

    此命令将输出 JSON,其中 appId 为你的 client-idobjectIdAPPLICATION-OBJECT-ID,它将用于通过图形 API 调用创建联合凭据。 保存该值,稍后将其用作 AZURE_CLIENT_ID GitHub 机密。

  2. 创建服务主体。 将 $appID 替换为 JSON 输出中的 appId。 此命令使用不同的 objectId 生成 JSON 输出,将在下一步中使用。 新的 objectIdassignee-object-id

    此命令使用不同的 objectId 生成 JSON 输出,将在下一步中使用。 新的 objectIdassignee-object-id

    复制 appOwnerTenantId 以在稍后用作 AZURE_TENANT_ID 的 GitHub 机密。

     az ad sp create --id $appId
    
  3. 按订阅和对象创建新的角色分配。 默认情况下,角色分配将绑定到默认订阅。 将 $subscriptionId 替换为你的订阅 ID,将 $resourceGroupName 替换为你的资源组名称,将 $assigneeObjectId 替换为生成的 assignee-object-id(新创建的服务主体对象 ID)。

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $assigneeObjectId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
    
  4. 运行以下命令,为 Microsoft Entra 应用程序创建新的联合标识凭据

    • APPLICATION-OBJECT-ID 替换为 Microsoft Entra 应用程序的 objectId(在创建应用时生成)。
    • CREDENTIAL-NAME 设置一个值供以后引用。
    • 设置 subject。 此项的值由 GitHub 根据工作流定义:
      • GitHub Actions 环境中的作业:repo:< Organization/Repository >:environment:< Name >
      • 对于未绑定到环境的作业,请根据用于触发工作流的 ref 路径包括分支/标记的 ref 路径:repo:< Organization/Repository >:ref:< ref path>。 例如 repo:n-username/ node_express:ref:refs/heads/my-branchrepo:n-username/ node_express:ref:refs/tags/my-tag
      • 对于由拉取请求事件触发的工作流:repo:< Organization/Repository >:pull_request
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:octo-org/octo-repo:environment:Production",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }
    

若要了解如何在 Azure 门户中创建 Active Directory 应用程序、服务主体和联合凭据,请参阅连接 GitHub 和 Azure

配置 GitHub 机密以进行身份验证

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

  1. GitHub 中,转到存储库。

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

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

    添加机密的屏幕截图

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

  5. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID 创建机密。 将 Microsoft Entra 应用程序中的这些值用于 GitHub 机密:

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

为生成项添加 Github 机密

  1. 在 GitHub 存储库中为 SQLADMIN_PASSSQLADMIN_LOGIN 创建两个新机密。 确保选择复杂的密码,否则 SQL 数据库服务器的创建步骤将失败。 以后你不再可以访问此密码,因此请将其另行保存。

  2. 为你的 Azure 订阅 ID 创建 AZURE_SUBSCRIPTION_ID 机密。 如果不知道订阅 ID,请使用 Azure Shell 中的此命令进行查找。 复制 SubscriptionId 列中的值。

    az account list -o table
    

创建 Azure 资源

“创建 Azure 资源”工作流运行一个 ARM 模板以将资源部署到 Azure。 该工作流:

若要运行“创建 Azure 资源”工作流,请执行以下操作:

  1. 打开存储库内 .github/workflows 中的 infraworkflow.yml 文件。

  2. AZURE_RESOURCE_GROUP 的值更新为你的资源组名称。

  3. 将 ARM 部署操作中 region 的输入设置为你所在的区域。

    1. 打开 templates/azuredeploy.resourcegroup.parameters.json 并将 rgLocation 属性更新为你所在的区域。
  4. 转到“操作”并选择“运行工作流” 。

    运行 GitHub Actions 工作流以添加资源。

  5. 通过检查“操作”页上是否显示了绿色打勾标记来确认操作是否成功运行。

    成功运行创建资源的操作。

  6. 创建资源后,转到“操作”,选择“创建 Azure 资源”,然后禁用该工作流。

    禁用“创建 Azure 资源”工作流。

创建发布配置文件机密

  1. 在 Azure 门户中,打开使用 Create Azure Resources 工作流创建的新暂存应用服务(槽)。

  2. 选择“获取发布配置文件”。

  3. 在文本编辑器中打开发布配置文件并复制其内容。

  4. AZURE_WEBAPP_PUBLISH_PROFILE 创建新的 GitHub 机密。

生成并部署你的应用

若要运行生成和部署工作流:

  1. 打开存储库内 .github/workflows 中的 workflow.yaml 文件。

  2. 确认 AZURE_RESOURCE_GROUPAZURE_WEBAPP_NAMESQLSERVER_NAMEDATABASE_NAME 的环境变量是否与 infraworkflow.yml 中的环境变量相匹配。

  3. 访问“交换到生产槽”输出中的 URL 来验证应用是否已部署。 应会看到名为“我的 TodoList 应用”的示例应用。

清理资源

如果不再需要示例项目,请删除 Azure 门户中的资源组,并删除 GitHub 中的存储库。

后续步骤