练习 - 设置 Azure DevOps 环境

已完成

在本单元中,确保已设置好 Azure DevOps 组织,以完成本模块的其余操作。 还需创建将部署到的 Azure 应用服务环境。

若要实现这些目标,需要:

  • 添加一名用户来确保 Azure DevOps 可连接到你的 Azure 订阅。
  • 设置一个 Azure DevOps 项目供本模块使用。
  • 在 Azure Boards 中,将本模块的工作项移动到“Doing”列。
  • 确保你的项目是在本地设置的,以便可将更改推送到管道。
  • 在 Azure Cloud Shell 中使用 Azure CLI 创建 Azure 应用服务和 Azure Functions 应用。
  • 创建管道变量来定义应用服务和 Azure Functions 实例的名称。
  • 创建一个服务连接,让 Azure Pipelines 可安全地访问你的 Azure 订阅。

向 Azure DevOps 添加用户

要完成本模块,你需要有自己的 Azure 订阅。 可免费开始使用 Azure。

虽然无需 Azure 订阅即可使用 Azure DevOps,但本练习将使用 Azure DevOps 部署到 Azure 订阅中的 Azure 资源。 为了简化操作流程,请使用相同的 Microsoft 帐户登录 Azure 订阅和 Azure DevOps 组织。

重要

如果使用不同的帐户登录,则应该将用户添加到你用于登录 Azure 的 Microsoft 帐户下的 DevOps 组织。 有关详细信息,请参阅向组织或项目添加用户。 添加用户时,请选择“Basic”访问级别。

然后注销 Azure DevOps,并使用新用户帐户登录。 使用用于登录 Azure 订阅的 Microsoft 帐户。

获取 Azure DevOps 项目

确保你的 Azure DevOps 组织已设置好,可完成本模块的其余操作。 为此,将运行在 Azure DevOps 中创建项目的模板。

该学习路径中的模块是循序渐进的,你在该过程中将跟随 Tailspin Web 团队完成其 DevOps 之旅。 为便于学习,每个模块都有自己的 Azure DevOps 项目。

运行模板

  1. 运行一个模板来设置 Azure DevOps 组织:

  2. 在 Azure DevOps 演示生成器站点中,选择“登录”。 如果系统提示,请接受使用条款。 此时将显示“创建新项目”页。

  3. 在“创建新项目”页上,输入项目名称,例如“Space Game - web - Azure Functions”,然后在“选择组织”处,选择用于 Azure 订阅的组织。

    Azure DevOps Demo Generator 的屏幕截图,其中显示了如何创建项目。

  4. 在下一部分中,选择“是,我想要分叉此存储库”,然后选择“授权”。

    如果出现相关窗口,请授权访问你的 GitHub 帐户。

    重要

    启用此分支选项是模板连接到 GitHub 存储库的必需选项。 即使已为 Space Game 网站项目创建分支,也请选中此选项。 该模板使用现有分支。

  5. 选择“创建项目”。

    模板需要一些时间来运行。

  6. 成功预配项目后,选择“导航到项目”以转到 Azure DevOps 中的项目。

重要

本模块中的清理 Azure DevOps 环境页包含必须完成的重要步骤(即使你没有完成本模块)。 清理操作有助于确保免费生成分钟数不会耗尽。

设置项目的可见性

最初,GitHub 上 Space Game 存储库的分支设置为“公共”,而 Azure DevOps 模板创建的项目设置为“专用”。 GitHub 上的公共存储库可供任何人访问,而专用存储库仅供你和你选择与之共享的人员访问。 同样,在 Azure DevOps 上,公共项目为未经身份验证的用户提供只读访问权限,而专用项目要求授予用户访问权限并经过身份验证才能访问服务。

目前,出于本模块的目的,无需修改这些设置中的任何一个。 但是,对于个人项目,必须确定要授予其他人的可见性和访问权限。 例如,如果你的项目是开源的,你可能会选择将 GitHub 存储库和 Azure DevOps 项目都设为“公共”。 而如果你的项目是专有的,那么你通常会将 GitHub 存储库和 Azure DevOps 项目都设为“专用”。

稍后,你会发现以下资源有助于确定哪个选项最适合你的项目:

分配工作项并将其移动到“正在执行”状态

在这里,你将在 Azure Boards 中为自己分配工作项,并将工作项状态设置为“正在执行”。 实际上,你和你的团队会在每次冲刺(sprint) 或工作迭代开始时创建工作项。

本练习将创建一个清单供你使用。 通过工作清单,其他团队成员可以知道你的当前工作内容和剩余工作量。 工作项还有助于强制实施进行中的工作 (WIP) 限制,使团队一次不会负责太多工作。

  1. 从 Azure DevOps 导航到“Boards”类别,然后从菜单中选择“Boards”。

    显示“Boards”菜单位置的 Azure DevOps。

  2. 通过选择标题打开“以 Azure Function 工作项方式打开重构排行榜 API”。 将此工作项分配给自己,然后选择“保存并关闭”

  3. 选择卡片底部的向下箭头,然后选择“正在执行”或选择卡片并将其拖动到“正在执行”列

    工作项卡的屏幕截图,其中突出显示了向下箭头的位置。

  4. 将工作项从“待办事项”列拖动到“正在执行”列。

    Azure Boards 的屏幕截图,突出显示了“正在执行”列中的工作项卡。

在本模块结束时,完成任务后将卡片移动到“Done”列。

创建 Azure 应用服务和 Azure Functions 环境

在这里,你将创建部署新版本的网站和 API 所需的应用服务和 Azure Functions 应用。

使用 Azure Pipelines 创建发布管道 Learn 模块中,你通过 Azure 门户启动了应用服务。 虽然很适合通过门户来探索 Azure 上的可用功能或执行基本任务,但启动应用服务之类的组件可能很麻烦。

在本模块中,你将使用 Azure CLI 启动应用服务实例。 可以从终端或通过 Visual Studio Code 访问 Azure CLI。 在这里,将从 Azure Cloud Shell 访问 Azure CLI。 此基于浏览器的 shell 体验托管在云中。 在 Cloud Shell 中,Azure CLI 配置为与你的 Azure 订阅配合使用。

重要

你需要自己的 Azure 订阅才能完成此模块中的练习。

通过 Azure 门户打开 Cloud Shell

  1. 登录 Azure 门户

  2. 在页眉的全局控件中,选择“Cloud Shell”。

    Azure 门户的屏幕截图,显示了 Cloud Shell 菜单项的位置。

    终端随即打开并连接到 Azure Cloud Shell。

  3. 如有必要,请从终端菜单中选择“Bash”。

    备注

    Cloud Shell 要求使用 Azure 存储资源来保存在 Cloud Shell 中创建的任何文件。 首次打开 Cloud Shell 时,系统将提示你创建资源组、存储帐户和 Azure 文件共享。 此设置会自动用于所有未来的 Cloud Shell 会话。

选择 Azure 区域

区域是地理位置内的一个或多个 Azure 数据中心。 例如美国东部、美国西部和北欧等区域。 每种 Azure 资源(包括应用服务实例)都会分配一个区域。

要使命令更容易运行,请先选择一个默认区域。 指定默认区域后,你输入的命令会使用该区域,直至指定其他区域。

  1. 在 Cloud Shell 中运行以下 az account list-locations 命令,列出可从你的 Azure 订阅使用的区域:

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 从输出的 Name 列中,选择靠近你的区域。 例如,选择 eastasiawestus2

  3. 运行 az configure 以设置默认区域。 将 <REGION> 替换为你选择的区域的名称。

    az configure --defaults location=<REGION>
    

    此示例将 westus2 设置为默认区域:

    az configure --defaults location=westus2
    

创建 Bash 变量

在此处,将创建 Bash 变量,使安装过程更方便且更不容易出错。 将变量用于共享文本字符串有助于避免意外键入错误。

  1. 从 Cloud Shell 生成一个随机数,我们将在下一步中使用该随机数为某些服务创建全局唯一的名称。

    resourceSuffix=$RANDOM
    
  2. 创建 3 个全局唯一名称,分别用于应用服务、Azure 函数和存储帐户。 这些命令使用双引号,指示 Bash 使用内联语法解析变量。

    webName="tailspin-space-game-web-${resourceSuffix}"
    leaderboardName="tailspin-space-game-leaderboard-${resourceSuffix}"
    storageName="tailspinspacegame${resourceSuffix}"
    
  3. 再创建两个 Bash 变量来存储资源组和服务计划的名称。

    rgName='tailspin-space-game-rg'
    planName='tailspin-space-game-asp'
    

创建所需的 Azure 资源

此解决方案需要几个用于部署的 Azure 资源,现在就可以创建这些资源。

备注

本练习使用默认网络设置,以便可从 Internet 访问站点。 在实践中,可以配置 Azure 虚拟网络,将网站放置于只有你和你的团队可以访问的网络中。 稍后,你可重新配置虚拟网络,使用户可访问你的网站。

  1. 运行以下 az group create 命令,使用前面定义的名称创建一个资源组:

    az group create --name $rgName
    
  2. 运行以下 az appservice plan create 命令,使用前面任务定义的名称创建一个应用服务计划:

    az appservice plan create \
      --name $planName \
      --resource-group $rgName \
      --sku B1 \
      --is-linux
    

    --sku 参数指定 B1 计划。 此计划在基本层上运行。 --is-linux 参数指定 Linux 工作线程(事件和任务计划中使用的线程)。

    重要

    如果 B1 SKU 在你的 Azure 订阅中不可用,那么请选择其他计划,例如 S1(标准)。

  3. 运行以下 az webapp create 命令来创建应用服务实例:

    az webapp create \
      --name $webName \
      --resource-group $rgName \
      --plan $planName \
      --runtime "DOTNETCORE|6.0"
    
  4. Azure Functions 需要一个存储帐户来进行部署。 运行以下 az storage account create 命令来创建它:

    az storage account create \
      --name $storageName \
      --resource-group $rgName \
      --sku Standard_LRS
    
  5. 运行以下 az functionapp create 命令来创建 Azure Functions 应用示例。 将 <region> 替换为你的首选区域。

    az functionapp create \
      --name $leaderboardName \
      --resource-group $rgName \
      --storage-account $storageName \
      --functions-version 4 \
      --consumption-plan-location <region>
    
  6. 运行以下 az webapp list 命令,列出应用服务实例的主机名和状态:

    az webapp list \
      --resource-group $rgName \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    

    记下正在运行的服务的主机名。 它应如下所示,但随机数标识符将有所不同。 稍后在验证工作时,需要用到这些主机名。

    HostName                                        State
    ----------------------------------------------  -------
    tailspin-space-game-web-4692.azurewebsites.net  Running
    
  7. 运行以下 az functionapp list 命令,列出 Azure Functions 实例的主机名和状态。

    az functionapp list \
      --resource-group $rgName \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    

    记下正在运行的服务的主机名。 它应如下所示,但随机数标识符将有所不同。 稍后在验证工作时,需要用到该排行榜主机名。

    HostName                                                State
    ------------------------------------------------------  -------
    tailspin-space-game-leaderboard-4692.azurewebsites.net  Running
    
  8. 将这两个主机名复制到稍后容易访问的位置。

  9. 作为可选步骤,打开浏览器并输入主机名以验证其是否正在运行。 此时将显示默认主页。

重要

此模块中的清理 Azure DevOps 环境页面包含重要的清理步骤。 清理资源可帮助确保完成此模块后不再支付 Azure 资源费用。 即使未完成此模块,也要务必执行清理步骤。

在 Azure Pipelines 中创建管道变量

使用 Azure Pipelines 创建发布管道模块中,你在管道中添加了一个变量,用于在应用服务中存储 Web 应用的名称。 在这里,你也要这样做。 此外,还将为 Azure Functions 实例添加排行榜应用的名称。

你可在管道配置中对这些名称进行硬编码,但如果将其定义为变量,配置的可重用性将更高。 此外,如果实例的名称发生更改,则可以在不修改配置的情况下更新这些变量并触发管道。

将变量组添加到你的项目中。

  1. “Space Game - web - Azure Functions”项目应在 Azure DevOps 中打开。

  2. 在菜单中,选择“Pipelines”,然后在“Pipelines”下选择“库”。 此时将显示“库”窗格。

    Azure DevOps 菜单的屏幕截图,其中突出显示了“Pipelines”下的“库”选项。

  3. 在命令栏中或在窗格的中间,选择“变量组”。 此时将显示“新建变量组”页。

  4. 输入“发布”作为变量组名称。

  5. 在“变量”下,选择“添加”。

  6. 输入“WebAppName”作为变量的名称。 对于值,请输入为你的 Web 应用创建的应用服务实例的名称,例如“tailspin-space-game-web-4692”。

    重要

    设置应用服务实例的名称,而不是其完整的主机名。 例如,在此练习中,“tailspin-space-game-web-4692”是主机名“tailspin-space-game-web-4692.azurewebsites.net”的实例部分。

  7. 使用排行榜实例的值再添加一个名为“LeaderboardAppName”的变量,例如,“tailspin-space-game-leaderboard-4692”。

  8. 最后添加一个名为 ResourceGroupName 的变量,其值为 tailspin-space-game-rg。

  9. 在页面顶部附近的命令栏中,选择“保存”以将“发布”变量组保存到管道。

    变量组中的变量应类似:

    Azure Pipelines 屏幕截图,显示了变量组。该组包含三个变量。

创建 spike 环境

在之前的模块中,你创建了“开发”、“测试”和“过渡”环境。 在这里,你也要这样做。 此时,你将创建一个名为“spike”的环境。

  1. 从“Azure DevOps”菜单的“Pipelines”下,选择“环境”。

    Azure Pipelines 屏幕截图,显示了“环境”菜单项的位置。

  2. 选择“创建环境”。 此时将显示“新建环境”窗格。

  3. 在“名称”下,输入“spike”。

  4. 让其余字段保留其默认值。

  5. 选择“创建”。

创建服务连接

此时要创建一个服务连接,让 Azure Pipelines 可访问你的 Azure 订阅。 Azure Pipelines 使用此服务连接将网站部署到应用服务。 你在上一模块中创建了一个类似的服务连接。

重要

请确保已使用同一 Microsoft 帐户登录到 Azure 门户和 Azure DevOps。

  1. 在 Azure DevOps 中,对于“Space Game - web - Azure Functions”管道项目,在菜单下后选择“项目设置。 此时将显示“项目详细信息”窗格。

  2. 在菜单中的“管道”下,选择“服务连接”。

  3. 在“服务连接”页上,选择“新建服务连接”,然后在“新建服务连接”窗格中选择“Azure 资源管理器”,再选择“下一步”。

  4. 在“新建服务连接”窗格中,选择“服务主体(自动)”,然后选择“下一步”。

  5. 在“新建 Azure 服务连接”窗格中,选择或输入以下设置:

    字段
    范围级别 订阅
    订阅 选择 Azure 订阅
    资源组 tailspin-space-game-rg
    服务连接名称 Resource Manager - Tailspin - Space Game

    在此过程中,系统可能会提示你登录 Microsoft 帐户。

  6. 请确保选中“Grant access permission to all pipelines”。

  7. 选择“保存” 。

Azure DevOps 会执行测试连接,来验证它是否可连接到你的 Azure 订阅。 如果 Azure DevOps 无法连接,你有机会再次登录。