使用部署组将 Web 应用部署到 Azure VM

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

在早期版本的 Azure Pipelines 中,将应用程序部署到多个服务器需要大量的规划和维护。 必须手动启用 Windows PowerShell 远程处理,需要打开特定的端口,并且必须在每台服务器上安装部署代理。 管理推出部署也需要手动干预。 通过引入 部署组,这些挑战大大简化了。

部署组在组中的每个目标服务器上安装部署代理,并使发布管道能够在这些服务器上逐步部署应用程序。 可以为推出部署创建多个管道,从而允许分阶段将应用程序更新传送到不同的用户组。

注释

经典管道中使用部署组。 如果使用 YAML 管道,请参阅 “环境”。

先决条件

产品 要求
Azure DevOps - 一个 Azure DevOps 组织
- Azure DevOps 项目
Azure DevOps 演示生成器 - 设置演示生成器
- 创建新的 Azure DevOps 项目 ,并确保选择 DeploymentGroups 模板(列表中的数字 15)。
Azure - Azure 订阅

在 Azure 中设置资源

本部分介绍如何使用 ARM 模板设置 Azure 资源。 它预配了六台虚拟机(VM)Web 服务器,其中配置了 IIS、SQL Server VM(DB 服务器)、Azure 负载均衡器和所有必要的网络连接。

  1. 选择“ 部署到 Azure ”按钮以启动在 Azure 中部署资源。

  2. 填写所需的信息,然后选择“ 查看 + 创建”。 可以使用任何允许的用户名和密码组合,因为它们不会在本教程中再次使用。 Env 前缀名称将添加到所有资源名称,以确保全局唯一性。 使用个人或随机内容。 如果在验证或创建过程中遇到命名冲突,请尝试更改此值并重新部署。 预配通常需要 10-15 分钟。

    显示如何在 Azure 中设置 Azure 资源的屏幕截图。

  3. 验证完成后,选择“ 创建 ”以部署资源。

  4. 部署完成后,转到 Azure 门户中的资源组,查看生成的资源。 选择名称中带有 sqlSrv 的 DB 服务器 VM 以查看其详细信息。

    显示 Azure 中新创建资源的屏幕截图。

  5. 复制 DNS 名称, 因为稍后的步骤需要它。

    显示 Azure 中的 DB 服务器 VM 的屏幕截图。

创建部署组

部署组是一组计算机,每个计算机都安装了部署代理。 这些计算机与 Azure Pipelines 通信,以协调应用程序部署。

  1. 导航到之前使用演示生成器创建的 Azure DevOps 项目。

  2. 选择 管道>部署组

  3. 选择 “添加部署组”。

  4. 输入 “发布 ”作为 部署组名称,然后选择“ 创建”。 将生成注册脚本。 可以使用此脚本注册目标服务器并手动安装部署代理。 但是,在本教程中,目标服务器会自动注册为发布管道的一部分。

创建个人访问令牌

  1. 在 Azure DevOps 项目中,选择 “用户设置” 图标,然后选择 “个人访问令牌”。

  2. 选择 “新建令牌”,输入 PAT 的名称,然后选择到期日期。

  3. 选择自定义定义的范围,选择“显示所有作用域”,然后检查以下范围:

    1. 项目和团队 ->读取和写入
    2. 代理池 ->读取和管理
    3. 部署组 ->读取和管理
  4. 完成后,选择“创建”,并复制你的 PAT,因为你在下一部分中将需要它。

配置发布管道

经典发布管道模板包括一个代理作业( 代理阶段),该作业在代理池中的代理上运行任务。 它还包括两个部署组作业: 部署组阶段IIS 部署阶段。 部署组作业在部署组中定义的计算机上运行任务。 请按照以下步骤配置每个任务。

配置代理作业

  1. 导航到 Azure DevOps 项目并选择 “Pipelines>发布”。

  2. 选择 部署组 版本定义,然后选择“ 编辑”。

  3. 选择“ 任务 ”选项卡以查看管道中的部署任务。

  4. 选择 代理阶段 阶段,然后选择 Azure Pipelines 池和 Windows 最新 规范。

    显示经典发布管道中的代理阶段的屏幕截图。

  5. 选择 Azure 资源组部署 任务,选择之前用于创建资源的 Azure 订阅 ,然后选择 “授权 ”以授权连接。 授权后,选择为本教程创建的 资源组

    显示如何在部署任务中配置资源组的屏幕截图。

  6. 此任务将在 Azure 中的虚拟机上运行,必须能够回连到流水线以满足部署组的要求。 若要保护连接,必须使用之前创建的个人访问令牌(PAT)设置服务连接。 在同一任务中向下滚动,然后在 Azure Pipelines 服务连接下选择“新建”。

  7. “新建服务连接”面板中,输入 Azure DevOps 组织的https://dev.azure.com/organizationName”。 粘贴您之前创建的 个人访问令牌,指定 服务连接名称,并选中 授予对所有流水线的访问权限 框。 完成操作后,选择验证并保存

    显示如何为部署任务配置新服务连接的屏幕截图。

  8. 向下滚动到 Azure 资源组部署 任务,然后从 团队项目 和之前创建的 部署组 的下拉菜单中进行选择。

    显示如何为部署任务配置团队项目和部署组的屏幕截图。

配置部署组任务

  1. 部署组 发布定义中,选择 部署组阶段 作业。 此作业在部署组中定义的计算机上执行任务。 此作业使用 SQL-Svr-DB 标记部署到部署组中的目标子集。 在 “部署组 ”下拉列表下,选择之前创建的 发布 部署组。

    显示如何配置部署组阶段作业的屏幕截图。

  2. 选择 IIS 部署阶段 作业。 此作业使用 WebSrv 标记将 Web 应用程序部署到 Web 服务器的子集。 从下拉列表中选择之前创建的 部署组

  3. 断开 Azure 网络负载均衡器连接 Azure 网络负载均衡器 任务已弃用。 可以通过右键单击任务并选择“ 禁用选择任务”来暂时禁用它们。

  4. IIS Web 应用管理和IIS Web 应用部署任务已预先填充,无需进行任何更改。

  5. 从左上角选择“ 变量 ”选项卡,选择 “管道变量”,并提供以下值。 将 DefaultConnectionString 变量中的占位符替换为之前复制的 SQL Server DNS 名称:

    变量名称 变量值
    数据库名称 PartsUnlimited-Dev
    DBPassword xxxxxxxx
    DBUserName xxxxxxxx
    默认连接字符串 数据源=[YOUR_DNS_NAME];初始目录=PartsUnlimited-Dev;用户ID=xxxxxxxx;密码=xxxxxxxx;MultipleActiveResultSets=False;连接超时=30;
    服务器名称 localhost
  6. 选择“ 保存”,根据需要添加注释,然后选择“ 确定”。

小窍门

如果收到 DefaultConnectionString 变量必须保存为机密的错误,请选择其值旁边的挂锁图标来保护它。

创建发布和部署应用程序

配置并保存发布定义后,可以继续创建发布以将 Web 应用部署到 Azure。 但是,在开始发布之前,必须确保生成管道至少运行一次。 这会生成部署所需的流水线工件。 如果在生成管道之前尝试运行发布管道,发布面板中的 “项目 ”部分将为空。 按照以下步骤运行您的管道,生成管道工件,然后创建新的发布版本:

  1. 在 Azure DevOps 项目中,选择 “管道”,然后选择 “部署组 生成管道”。

  2. 选择“运行管道”。 在管道运行面板中,选择 代理规范,然后选择“ 运行”。

    屏幕截图显示如何配置管道运行。

  3. 管道成功完成后,它将生成管道工件。 可以从管道摘要窗口查看它:

    显示生成的管道工件的屏幕截图。

  4. 现在转到 Pipelines>Release,选择发布定义,然后选择“ 创建发布 ”以启动部署管道。

    显示如何创建新版本的屏幕截图。

  5. 完成后,选择“ 创建 ”,然后选择管道运行以打开概述。 您应该会看到您的管道正在进行。 单击该阶段以查看详细的部署日志。

    显示发布管道概述的屏幕截图。

  6. 在摘要窗口中,可以看到部署的每个阶段的状态:

    显示发布摘要的屏幕截图。

故障排除

  • 无法连接到主服务器或目标服务器或A 连接已成功与服务器建立连接,但在登录过程中发生错误。

如果在运行 Sql Dacpac 部署计算机组 任务时遇到以下任一错误,请执行以下步骤:

  1. 验证数据库:

确保在资源部署期间成功创建数据库。 可以使用 Azure CLI 或 sqlcmd 确认这一点:

sqlcmd -S <server-name> -U <username> -P <password> -Q "SELECT name FROM sys.databases"

如果列表中不存在数据库,可以使用以下命令创建新的数据库:

sqlcmd -S <server-name> -U <username> -P <password> -Q "CREATE DATABASE [YourDatabaseName]"
  1. 验证 SQL Server 身份验证:

确保启用了 SQL Server 身份验证,必须将 SQL Server 配置为允许 SQL 和 Windows 身份验证(混合模式)。 启用此功能:

a。 使用 SSMS 或 sqlcmd 进行连接

b. 运行以下查询:

EXEC xp_instance_regwrite 
    N'HKEY_LOCAL_MACHINE',
    N'Software\\Microsoft\\MSSQLServer\\MSSQLServer',
    N'LoginMode',
    REG_DWORD,
    2;

选项c. 重启 SQL Server 服务,使更改生效:

net stop MSSQLSERVER
net start MSSQLSERVER
  • 即使代理在 VM 上运行,我的某些代理也处于脱机状态

如果一个或多个客服人员显示为脱机,可以尝试一些措施。 首先,登录到运行代理的 VM,并运行以下命令来检查 VM 是否解析为同一组 IP。

nslookup dev.azure.com

如果所有 VM 都解析为同一组 IP,请确保使用正确的出站规则配置负载均衡器。 可以将后端池添加到 Azure 中的负载均衡器,将 VM 的 NIC 添加到后端池,然后将其与负载均衡器的出站规则相关联。 为此,请按以下步骤操作:

  1. 导航到 Azure 并找到负载均衡器。

  2. 选择 后端池,选择现有池或创建新的池,并在 IP 配置下添加 Web 服务器。

  3. 转到 负载均衡规则,选择负载均衡规则,然后从 “后端池 ”下拉列表中选择后端池。

清理资源

本教程创建了 Azure DevOps 项目并在 Azure 中部署了资源。 如果不再需要它们,请按照以下步骤进行清理:

  1. 删除 Azure DevOps 项目:导航到 项目设置>“概述>删除”。

  2. 删除本教程期间创建的所有 Azure 资源都放置在同一资源组中。 删除资源组将删除所有关联的资源。 可以通过 Azure 门户或 CLI 执行此作:

  • Azure CLI

    az group delete --name <RESOURCE_GROUP_NAME> --yes --no-wait
    
  • Azure 门户

  1. 导航到 Azure 门户 >资源组

  2. 选择本教程中使用的资源组。

  3. 选择 “删除资源组”,确认名称,然后选择“ 删除”。