练习 - 设置 Azure DevOps 环境

已完成

在本部分中,你将了解如何设置 Azure DevOps 组织并创建要部署到的 Azure 应用服务环境。

将了解如何执行以下操作:

  • 设置 Azure DevOps 项目。
  • 使用 Azure Boards 管理工作项。
  • 创建 Azure 应用服务环境。
  • 在 Azure Pipelines 中创建管道变量。
  • 创建一个服务连接以使用 Azure 订阅进行身份验证。

将用户添加到 Azure DevOps

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

无需 Azure 订阅即可使用 Azure DevOps,但在本模块中,你将使用 Azure DevOps 来部署到 Azure 资源。 要简化该过程,请使用同一个 Microsoft 帐户登录到 Azure 和 Azure DevOps。

如果你使用不同的 Microsoft 帐户登录 Azure 和 Azure DevOps,请在你用于登录 Azure 的 Microsoft 帐户下,向你的 DevOps 组织添加一名具有“基本”访问级别的用户。 有关更多详细信息,请参阅向组织或项目添加用户

然后退出登录 Azure DevOps,并使用用于登录 Azure 订阅的相同帐户重新登录。

获取 Azure DevOps 项目

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

此学习路径中的模块是循序渐进的。 你全程参与 Tailspin Web 团队的 DevOps 之旅。 为便于学习,每个模块都有自己的 Azure DevOps 项目。

运行模板

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

在 Azure DevOps 演示生成器网站上,按照以下步骤运行模板:

  1. 选择“Sign In”并接受使用条款。

  2. 在“Create New Project”页面上,选择 Azure DevOps 组织。 输入项目名称,例如“Space Game - web - Docker”。

    Screenshot of creating a project through Azure DevOps Demo Generator.

  3. 选择“Yes, I want to fork this repository”>“Authorize”。 如果系统提示,请授权访问你的 GitHub 帐户。

    重要

    需要选择此选项,模板才能连接到 GitHub 存储库。 即使已创建 Space Game 存储库分支,也请确保选中该复选框。 该模板将使用现有分支。

  4. 选择“创建项目”。

  5. 选择“导航到项目”,转到你在 Azure DevOps 中的项目。

重要

此模块中的清理 Azure DevOps 环境页面包含重要的清理步骤。 清理操作有助于确保免费生成分钟数不会耗尽。 即使未完成此模块,也务必要执行清理步骤。

设置项目的可见性

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

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

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

将工作项移动到“正在执行”状态

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

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

在此处,将第一项“Create container version of web site using Docker”移动到“Doing”列,然后将自己分配到该工作项

设置工作项:

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

    Screenshot of Azure DevOps showing the location of the Boards menu.

  2. 在“Create container version of web site using Docker”工作项中,选择卡片底部的向下箭头,然后将工作项分配给自己

    Screenshot of Azure Boards showing the location of the down arrow.

  3. 将工作项从“待办”列移到“正在执行”列。

    Screenshot of Azure Boards showing the card in the Doing column.

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

创建 Azure 应用服务环境

使用 Azure Pipelines 创建发布管道模块中,你使用 Azure 门户创建了一个应用服务实例。 尽管门户是探索 Azure 产品/服务的绝佳工具,但设置应用服务等组件可能会变得很麻烦。

在本模块中,你将使用 Azure CLI 来启动部署和运行应用服务实例所需的资源。 可以从终端或通过 Visual Studio Code 访问 Azure CLI。

重要

你必须有自己的 Azure 订阅才能完成本模块中的练习。

在 Azure 门户中启动 Cloud Shell

  1. 导航到 Azure 门户并登录。

  2. 从菜单栏中选择“Cloud Shell”,然后选择“Bash”体验。

    Screenshot of the Azure portal showing the location of the Cloud Shell menu item.

    注意

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

选择 Azure 区域

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

若要简化运行命令的过程,请先选择默认区域。 指定默认区域后,除非显式指定其他区域,否则后续命令将默认使用该区域。

  1. 运行以下命令,列出 Azure 订阅的可用区域。

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 从输出的“名称”列选择靠近你所在位置的区域。 例如,可以选择 eastasia 或 westus2。

  3. 运行以下命令以设置默认区域。 将占位符替换为所选区域的名称。

    az configure --defaults location=<REGION>
    

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

    az configure --defaults location=westus2
    

创建 Bash 变量

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

  1. 在 Cloud Shell 中生成一个随机数。 这样就可以在下一步中更轻松地为某些服务创建全局唯一名称。

    resourceSuffix=$RANDOM
    
  2. 为应用服务 Web 应用和 Azure 容器注册表创建全局唯一名称。 在这些命令中使用双引号会提示 Bash 使用内联语法内插变量。

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

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

创建 Azure 资源

注意

为便于学习,这里使用默认网络设置。 这些设置使得可从 Internet 访问你的网站。 实际上,你可配置这样一个 Azure 虚拟网络,它将你的网站置于不可从 Internet 路由且仅供你和你的团队访问的网络中。 稍后,你可重新配置网络,使用户可访问你的网站。

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

    az group create --name $rgName
    
  2. 运行以下 az acr create 命令,使用前面定义的名称创建 Azure 容器注册表。

    az acr create --name $registryName \
      --resource-group $rgName \
      --sku Standard \
      --admin-enabled true
    
  3. 运行以下 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(标准)。

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

    az webapp create \
      --name $webName \
      --resource-group $rgName \
      --plan $planName \
      --deployment-container-image-name $registryName.azurecr.io/web:latest
    
  5. 运行以下 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
    
  6. 运行以下 az acr list 命令,列出 Azure 容器注册表实例的登录服务器。 稍后创建管道变量时将需要此服务器名称。

    az acr list \
      --resource-group $rgName \
      --query "[].{loginServer: loginServer}" \
      --output table
    

    记下登录服务器。 稍后在配置管道时需要用到它。 下面是一个示例:

    LoginServer
    ---------------------------------
    tailspinspacegame4692.azurecr.io    
    

重要

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

在 Azure Pipelines 中创建管道变量

使用 Azure Pipelines 创建发布管道中,你在管道中添加了一个变量,用于在应用服务中存储 Web 应用的名称。 在此处执行相同的操作。 此外,你将添加 Azure 容器注册表的名称。

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

若要添加变量:

  1. 在 Azure DevOps 中,转到“Space Game - web - Docker”项目。

  2. 在“Pipelines”下,选择“库”。

    Screenshot of Azure Pipelines showing the Library menu option.

  3. 选择“+ Variable group”。

  4. 在“Properties”下,输入“Release”作为变量组名称。

  5. 在“Variables”下,选择“+ Add”。

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

    重要

    设置应用服务实例的名称,而不是其主机名。 在本例中,你将输入 tailspin-space-game-web-4692,而不是 tailspin-space-game-web-4692.azurewebsites.net。

  7. 重复此过程,添加另一个名为 RegistryName 的变量,其值为 Azure 容器注册表登录服务器的名称,例如 tailspinspacegame4692.azurecr.io。

  8. 选择“管道权限”,然后选择 + 符号以添加管道。 选择 mslearn-tailspin-spacegame-web-docker,以向管道提供对变量组的访问权限。

  9. 选择页面顶部的“保存”以保存变量。 变量组应如下所示:

    Screenshot of Azure Pipeline showing the variable group. The group contains two variables.

创建所需的服务连接

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

重要

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

  1. 在 Azure DevOps 中,转到“Space Game - web - Docker”项目。

  2. 在页面的底角,选择“项目设置”。

  3. 在“管道”下,选择“服务连接”。

  4. 依次选择“新建服务连接”、“Azure 资源管理器”和“下一步”。

  5. 在页面顶部附近,选择“服务主体(自动)”。 然后,选择“下一步”。

  6. 填写以下字段:

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

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

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

  8. 选择“保存” 。

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

  9. 依次选择“新建服务连接”、“Docker 注册表”和“下一步”。

  10. 在页面顶部附近,选择“Azure 容器注册表”。

  11. 填写以下字段:

    字段
    订阅 Azure 订阅
    Azure 容器注册表 选择之前创建的注册表
    服务连接名称 容器注册表连接
  12. 请确保选中“Grant access permission to all pipelines”。

  13. 完成时选择“保存” 。