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

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

先决条件

需要安装 Visual Studio 2022,并配置 ASP.NET 和 Web 开发,以及 Azure 开发 工作负载。

如果已安装 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的连接。

显示如何使用 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 运行按钮来启动项目。

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

浏览应用启动配置

示例应用在 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 连接字符串,并将其提供给 Entity Framework。 此配置允许将 localdb 连接字符串签入源代码管理,以便其他开发人员可以在开发过程中轻松连接到本地数据库。 它还允许在本地运行 Entity Framework 迁移。 默认情况下,实体框架在运行迁移时不会发现存储在环境变量中的连接字符串。
  • 当应用在 GitHub Actions 工作流或生产环境中运行时,将从环境变量中提取连接字符串。 环境变量可以阻止将生产安全连接字符串签入源代码管理或包含在配置文件中。

创建 Azure 服务

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

  • 容器应用: 托管和运行已部署的应用程序所必需的。
  • 容器注册表: 存储容器化应用的生成映像项目。
  • SQL 数据库: Azure SQL 数据库来存储应用的数据。

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

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

  1. 在 Visual Studio 解决方案资源管理器中,右键单击顶级项目节点,然后选择 发布

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

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

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

    显示如何创建容器应用的屏幕截图。

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

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

    显示如何创建新容器注册表的屏幕截图。

  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
    • 数据库服务器: 选择“新建...”,然后在新的 POP-up 中输入以下值:
      • 数据库服务器名称: 输入唯一的服务器名称,或将随机数追加到自动生成的名称的末尾。
      • 位置: 选择离你近的位置。
      • 管理员用户名: 输入选择的值。
      • 管理员密码: 输入选择的值。
      • 管理员密码(确认): 输入相同的密码进行确认。 选择 确定 以关闭 SQL Server 对话框
    • 选择 创建 以创建 SQL Server 和数据库。
    • 操作完成后,从列表中选择服务器,然后选择“下一步”
  5. 在“连接到 Azure SQL 数据库”对话框中,保留默认值,但确保在底部为“将连接字符串值保存到”选项选择了“无”
  6. 选择 完成,Visual Studio 将创建 SQL 资源。

将容器应用连接到 Azure SQL

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

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

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

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

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

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

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

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

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

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

      显示如何使用服务连接器的屏幕截图。

  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”选项卡上,将连接字符串从窗体字段复制出来。

    显示如何检索连接字符串的屏幕截图。

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

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

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

    • 名称: 输入 DbConnection的名称。

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

    • 选择 添加机密

      显示如何创建 GitHub 机密的屏幕截图。

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

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

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

    显示如何编辑工作流的屏幕截图。

  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 参数来替代存储在 appsettings.json 文件中的 localdb 连接字符串,并将值添加到 GitHub 机密。

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

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

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

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

    显示 GitHub 操作工作流的屏幕截图。

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

可以导航到容器应用的主页并创建 TODO 来测试部署,就像在本地一样。 始终可以在 Azure 门户中应用的概述页上找到容器应用的 URL。