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

教程:使用 GitHub Actions 部署到应用服务自定义容器并连接到数据库

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

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

  • 使用 GitHub Actions 工作流通过 Azure 资源管理器模板(ARM 模板)将资源添加到 Azure
  • 使用 GitHub Actions 工作流生成包含最新 Web 应用更改的容器

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

先决条件

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

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

下载示例

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

https://github.com/Azure-Samples/dotnetcore-containerized-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 ID 应用程序和服务主体

    az ad app create --display-name myApp
    

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

  2. 创建服务主体。 将 $appID 替换为 JSON 输出中的 appId。

    此命令使用服务主体 id 生成 JSON 输出。 服务主体 id 用作下一步 az role assignment create 命令中 --assignee-object-id 参数的值。

    复制 JSON 输出中的 appOwnerOrganizationId,以在稍后用作 AZURE_TENANT_ID 的 GitHub 机密。

     az ad sp create --id $appId
    
  3. 为服务主体创建新的角色分配。 默认情况下,角色分配将绑定到默认订阅。 将 $subscriptionId 替换为你的订阅 ID,将 $resourceGroupName 替换为你的资源组名称,将 $servicePrincipalId 替换为新创建的服务主体 ID。

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

    • APPLICATION-OBJECT-ID 替换为 Microsoft Entra ID 应用程序的 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. 通过选择“添加机密”来保存每个机密。

添加 SQL Server 机密

在存储库中为 SQL_SERVER_ADMIN_PASSWORD 创建新机密。 此机密可以是符合 Azure 密码安全标准的任何密码。 以后你不再可以访问此密码,因此请将其另行保存。

创建 Azure 资源

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

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

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

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

  3. WEB_APP_NAMESQL_SERVER_NAME 的值更新为 Web 应用名称和 SQL Server 名称。

  4. 转到“操作”并选择“运行工作流” 。

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

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

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

添加容器注册表和 SQL 机密

  1. 在 Azure 门户中,打开资源组中新建的 Azure 容器注册表。

  2. 转到“访问密钥”,然后复制用户名和密码值。

  3. 在存储库中为 ACR_USERNAMEACR_PASSWORD 密码创建新的 GitHub 机密。

  4. 在 Azure 门户中,打开你的 SQL 数据库。 打开“连接字符串”并复制值。

  5. SQL_CONNECTION_STRING 创建新机密。 将 {your_password} 替换为你的 SQL_SERVER_ADMIN_PASSWORD

生成、推送和部署映像

生成、推送和部署工作流生成一个包含最新应用更改的容器,将该容器推送到 Azure 容器注册表,并将 Web 应用程序过渡槽更新为指向所推送的最新容器。 该工作流包含生成和部署作业:

  • 生成作业通过签出操作签出源代码。 然后,该作业使用 Docker 登录操作和自定义脚本向 Azure 容器注册表进行身份验证,生成容器映像,并将其部署到 Azure 容器注册表。
  • 部署作业通过 Azure 登录操作登录到 Azure,并收集环境和 Azure 资源的信息。 然后,该作业通过 Azure 应用服务设置操作更新 Web 应用设置,并通过 Azure Web 部署操作部署到应用服务过渡槽。 最后,该作业运行自定义脚本来更新 SQL 数据库,并从过渡槽交换到生产槽。

若要运行生成、推送和部署工作流,请执行以下操作:

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

  2. 确认 AZURE_RESOURCE_GROUPWEB_APP_NAME 的环境变量是否与 azuredeploy.yaml 中的环境变量相匹配。

  3. ACR_LOGIN_SERVER 值更新为你的 Azure 容器注册表登录服务器。

后续步骤