教程:使用 GitHub Actions 将 ASP.NET Core 应用和数据库部署到 Azure 容器应用

本教程介绍如何使用 Visual Studio 和 GitHub Actions 将 ASP.NET Core 应用和 SQL 数据库部署到 Azure 容器应用。 还介绍如何在 GitHub Actions 中管理实体框架迁移和数据库更新,而这些概念也可以应用于其他 CI/CD 工具和环境。

先决条件

需要安装带有“ASP.NET 和 Web 开发”以及“Azure 开发”工作负载的 Visual Studio 2022

如果已安装 Visual Studio:

  • 通过选择“帮助”>“检查更新”,在 Visual Studio 中安装最新更新。
  • 通过选择“工具”>“获取工具和功能”,验证是否已安装“ASP.NET 和 Web 开发”和“Azure 开发”工作负载。

在本地设置示例应用

使用 ToDo 示例应用配合跟进本教程的学习。 使用以下命令从 GitHub 中克隆应用:

git clone https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore.git
cd msdocs-app-service-sqldb-dotnetcore

导航到项目文件夹,并在 Visual Studio 中打开 DotNetCoreSqlDb.sln 解决方案。

ToDo 应用程序已准备就绪,但需要在 Visual Studio 中与 localdb SQL Server 建立连接。 连接到 localdb 后,在本地工作时,便可在运行应用的同时保留待办事项。

  1. 右键单击 Visual Studio 解决方案资源管理器中的“连接的服务”节点,然后选择“添加”>“SQL Server 数据库”。
  2. 在“连接到依赖项”对话框中,选择“SQL Server Express LocalDB (本地)”然后选择“下一步”。
  3. 在“连接到 SQL Server Express LocalDB (本地)”对话框中,设置以下值:
    • 连接字符串名称:保留默认值。
    • 连接字符串值:保留默认值。
    • 将连接字符串值保存到:选择“无”。
    • 选择“下一步”
  4. 在“更改摘要”屏幕上,将设置保留为默认值,然后选择“完成”以完成工作流。

Visual Studio 显示服务依赖项的摘要,包括与 LocalDB 的连接。

A screenshot showing how to add a migration using Visual Studio.

接下来,需要创建初始迁移,并使用它来更新含 Todo 应用的正确架构的本地数据库。

  1. 选择 LocalDB 连接旁边的服务依赖项列表右侧的“...”图标,然后选择添加“迁移”。
  2. 在“实体框架迁移”对话框中,等待 Visual Studio 找到项目中包含的 DbContext 类。 加载完值后,选择“完成”。
  3. Visual Studio 在项目中生成文件夹 Migrations 并创建初始迁移类。 通过此类,可使用正确的架构更新数据库。
  4. 再次选择 LocalDB 服务旁边的“...”图标,然后选择“更新数据库”。
  5. 在“实体框架迁移”对话框中,等待 Visual Studio 再次找到 DbContext 类,然后选择“完成”。 Visual Studio 运行迁移并为服务器中的 LocalDB 数据库创建架构。

通过选择 Visual Studio 顶部“DotNetCoreSqlDb”运行按钮来启动项目。

应用加载时,通过输入新的待办事项来验证数据库是否正常工作。 待办事项显示在应用主页的主列表视图中。

浏览应用启动配置

示例应用在 Program.cs 文件中包含以下代码:

if(builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
}
else
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}

此代码应用以下配置:

  • 当应用在本地运行时,将从 appsettings.json 文件中拉取 localdb 连接字符串并提供给实体框架。 通过此配置可将 localdb 连接字符串签入源代码管理,这样其他开发人员可以在开发期间轻松连接到本地数据库。 该配置还支持在本地运行实体框架迁移。 默认情况下,运行迁移时,实体框架不会发现存储在环境变量中的连接字符串。
  • 当应用在 GitHub Actions 工作流或生产环境中运行时,将从环境变量中提取连接字符串。 环境变量可以阻止将生产安全连接字符串签入源代码管理或包含在配置文件中。

创建 Azure 服务

应用需要创建以下 Azure 服务才能成功部署:

  • 容器应用:托管和运行部署的应用程序时需要。
  • 容器注册表:存储容器化应用的生成映像工件。
  • SQL 数据库:用于存储应用数据的 Azure SQL 数据库。

Visual Studio 的发布功能可以创建这些资源。

创建 Azure 容器应用和 Azure 容器注册表

  1. 在 Visual Studio 解决方案资源管理器中,右键单击顶部项目节点并选择“发布”。

  2. 在发布对话框中,选择“Azure”作为部署目标,然后选择“下一步”。

  3. 对于“特定目标”,选择“Azure 容器应用(Linux)”,然后选择“下一步”。

  4. 新建要部署到的容器应用。 选择“+ 新建”按钮以打开一个新对话框并输入以下值:

    A screenshot showing how to create a container app.

    • 容器应用名称:保留默认值或输入名称。
    • 订阅名称:选择要部署到的订阅。
    • 资源组:选择“新建”,新建名为 msdocs-app-db-ef 的资源组。
    • 容器应用环境:选择“新建”以打开容器应用环境对话框并输入以下值
      • 环境名称:保留默认值。
      • 位置:选择你所在位置附近的位置。
      • Azure Log Analytics 工作区:选择“新建”以打开日志分析工作区对话框。
        • 名称:保留默认值。
        • 位置:选择你所在位置附近的位置,然后选择“确定”关闭对话框。
      • 选择“确定”关闭容器应用环境对话框。
    • 选择“创建”以关闭原始容器应用对话框。 Visual Studio 在 Azure 中创建容器应用资源。
  5. 创建资源后,确保在容器应用列表中选中它,然后选择“下一步”。

  6. 你需要创建 Azure 容器注册表来存储为应用发布的映像项目。 选择容器注册表屏幕上的绿色 + 图标。

    A screenshot showing how to create a new container registry.

  7. 保留默认值,然后选择“创建”。

  8. 创建容器注册表后,确保选中该注册表,然后选择“下一步”。

  9. 在“部署类型”屏幕上,选择“使用 GitHub Actions 工作流的 CI/CD (生成 yml 文件)”,然后选择“完成”。 如果 Visual Studio 提示你允许管理员用户访问已发布的 docker 容器,请选择“是”。

Visual Studio 创建并显示发布配置文件。 GitHub Actions .yml 文件中介绍了大多数发布步骤和详细信息,可以通过单击发布配置文件摘要视图中的“编辑工作流”按钮来查看该文件。 本文稍后会更深入地介绍此文件。

创建 Azure SQL 数据库

  1. 在解决方案资源管理器中,右键单击“连接的服务”节点,然后选择“添加”>“SQL Server 数据库”。
  2. 在“连接到依赖项”对话框中,选择“Azure SQL 数据库”,然后选择“下一步”。
  3. 选择“+ 新建“以添加新数据库。
  4. 在“Azure SQL 数据库”对话框中,输入以下值:
    • 数据库名称:保留默认值。
    • 订阅名称:选择与之前相同的订阅。
    • 资源组:选择之前创建的同一 msdocs-app-db-ef 组。
    • 数据库服务器:选择“新建...”,然后在新的弹出窗口中输入以下值
      • 数据库服务器名称:输入唯一的服务器名称,或在自动生成的名称末尾追加随机数。
      • 位置:选择最近的位置。
      • 管理员用户名:输入所需值。
      • 管理员密码:输入所需值。
      • 管理员密码(确认):输入相同的密码进行确认。 选择“确定”,关闭“SQL Server”对话框
    • 选择“创建”,创建 SQL Server 和数据库。
    • 操作完成后,从列表中选择服务器,然后选择“下一步”
  5. 在“连接到 Azure SQL 数据库”对话框中,保留默认值,但确保在底部为“将连接字符串值保存到”选项选择了“无”。
  6. 选择“完成”,Visual Studio 随即创建 SQL 资源。

将容器应用连接到 Azure SQL

  1. 在创建的容器应用的概述页上,选择左侧导航栏中的“服务连接器(预览)”。

  2. 选择“+ 创建”,创建新连接。

  3. 在“创建连接”浮出控件中,输入以下值:

    • 容器:选择创建的 dotnetcoresqldb 容器。

    • 服务类型:选择“SQL 数据库”。

    • 订阅:选择用于创建容器应用的同一订阅。

    • 连接名称:保留默认值。

    • SQL Server:选择之前创建的数据库服务器。

    • SQL 数据库:选择之前创建的数据库。

    • 客户端类型:选择“.NET”。

      A screenshot showing how to use service connector.

  4. 选择“下一步: 身份验证”并输入以下值:

    • 为身份验证类型选择“连接字符串”。
    • 用户名:输入创建数据库服务器时使用的用户名。
    • 密码:输入创建数据库服务器时使用的密码。
  5. 将其余设置保留为默认值,然后选择“下一步: 网络”。

  6. 保留默认值并选择“下一步: 查看 + 创建”。

  7. Azure 验证设置后,选择“创建”。

片刻后,应会显示与 SQL 数据库的连接。 选择箭头以展开连接,并查看 AZURE_SQL_CONNECTIONSTRING 值。 此连接名称与示例应用中定义的环境变量连接字符串的名称匹配。

配置 GitHub Actions 工作流

GitHub 可以使用 Visual Studio 生成的 GitHub Actions 工作流文件在推送更改时生成应用并将其部署到 Azure。 目前,此过程可正常完成,但部署的应用会引发异常。 尽管已创建 Azure SQL 数据库,但必须向 GitHub Actions 工作流添加一个步骤才能生成架构。 Azure SQL 数据库的连接字符串可以作为机密安全地存储在 GitHub 中,并在运行时由工作流检索。

检索连接字符串并将其添加到 GitHub 机密

  1. 在 Azure 门户中,在主搜索栏中搜索创建的数据库,并从结果中选择它。

  2. 在数据库概述页上,从左侧导航栏中选择“连接字符串”。

  3. 在“ADO.NET”选项卡上,将连接字符串从表单域中复制出来。

    A screenshot showing how to retrieve the connection string.

  4. 导航到应用的分叉 GitHub 存储库。

  5. 在“设置”选项卡下,从左侧导航中选择“机密”>“操作”,然后选择“新建存储库机密”。

  6. 在 “新建机密”页上,输入以下值:

    • 名称:输入名称 DbConnection

    • 机密:粘贴从 Azure 复制的连接字符串。 请确保将连接字符串中的密码占位符替换为创建数据库时选择的密码。

    • 选择“添加机密”。

      A screenshot showing how to create a GitHub secret.

连接字符串现在安全地存储在 GitHub 存储库机密中,可以使用 GitHub 工作流进行检索。

修改 GitHub Actions 工作流以启用迁移

  1. 选择发布摘要页上的“编辑工作流”按钮,打开 Visual Studio 生成的 GitHub Actions 工作流 .yml 文件。

    A screenshot showing how to edit the workflow.

  2. 将以下 yaml 追加到工作流文件的末尾:

    - name: Run EF 
      run: | 
        dotnet tool install --global dotnet-ef
        dotnet tool restore
        dotnet ef database update -p DotNetCoreSqlDb --connection '${{ secrets.DBConnection }}'
    

    此代码安装实体框架命令行工具并运行应用迁移。 工作流运行时,该代码还通过 database update 命令的 connection 参数,用添加到 GitHub 机密的值替代存储在 appsettings.json 文件中的 localdb 连接字符串。

运行 GitHub Actions 工作流并测试部署

  1. 使用以下命令将更改提交到应用程序,并推送到分支存储库:

    git add --all
    git commit -m "Added GitHub Actions workflow"
    git push
    
  2. 导航到 GitHub 存储库并选择“操作”选项卡。如果推送成功,应会自动触发工作流运行。

  3. 选择活动工作流,在每个步骤完成时查看其日志详细信息。 最后会运行迁移以更新 Azure 中的数据库。

    A screenshot showing the GitHub action workflow.

工作流完成后,应用程序被部署到 Azure 容器应用,并使用更新的架构连接到数据库。

可以通过导航到容器应用的主页并创建待办事项来测试部署,与在本地操作时一样。 始终可以在 Azure 门户中应用的概述页上找到容器应用的 URL。