练习 - 创建在 Azure 上运行的生成代理
在本单元中,你将使用在 Microsoft Azure 上运行的虚拟机来配置可在 Microsoft Azure Pipelines 中使用的生成代理。 我们提供一个虚拟机,您可以在本模块的整个持续时间内使用。
在本单元中,你将学习以下内容:
- 在 Azure 上创建 Ubuntu 虚拟机,用作生成代理。
- 在 Microsoft Azure DevOps 中创建代理池。
- 创建访问令牌以使用 Azure DevOps 对代理进行身份验证。
- 用生成“Space Game”网站所需的软件配置代理。
- 将代理配置为连接到 Azure DevOps,以便它可以接收生成作业。
- 验证代理是否已连接到 Azure DevOps 并准备好接收生成作业。
可以通过多种方式在 Azure 上创建虚拟机。 在本单元中,你将使用名为 Cloud Shell 的交互式终端创建 Ubuntu 虚拟机。
若要配置 VM,有几个选择:
- 对于 Linux VM,可以直接通过 SSH 进行连接,并以交互方式配置系统。
- 可以使用 ARM 模板、Bicep 或其他自动化预配工具自动执行部署。
- 如果需要部署许多生成代理,可以创建预安装了所有软件的 VM 映像。
以交互方式配置系统是入门的好方法,因为它有助于了解过程和所需内容。 为了简化此过程,请通过 SSH 连接到 Ubuntu VM,并运行 shell 脚本来设置生成代理。
注释
如果您不熟悉如何连接到或配置 Linux 系统,请继续跟随说明进行操作。 可以将相同的概念应用于 Windows 生成代理。
创建 Linux 虚拟机
在本部分中,将创建一个运行 Ubuntu 20.04 的 VM,该 VM 将充当生成代理。 VM 尚未设置为生成代理,或者具有生成 Space Game Web 应用程序所需的任何工具。 你很快就会将其设置好。
通过 Azure 门户启动 Cloud Shell
重要
若要完成本模块中的练习,需要自己的 Azure 订阅。
转到 Azure 门户并登录。
在菜单上,选择“Cloud Shell”。 出现提示时,选择“Bash”体验。
注释
Cloud Shell 需要一个 Azure 存储资源来保留你在 Cloud Shell 中创建的任何文件。 首次打开 Cloud Shell 时,系统会提示创建资源组、存储帐户和 Azure 文件共享。 此设置会自动用于所有未来的 Cloud Shell 会话。
选择 Azure 区域
区域是地理位置中的一个或多个 Azure 数据中心。 美国东部、美国西部和北欧是区域示例。 为每个 Azure 资源(包括 Azure VM)分配一个区域。
若要使命令更易于运行,请首先选择默认区域。 指定默认区域后,以后的命令将使用该区域,除非指定其他区域。
在 Cloud Shell 中,若要列出 Azure 订阅中可用的区域,
az account list-locations
请运行以下命令:az account list-locations \ --query "[].{Name: name, DisplayName: displayName}" \ --output table
从输出中的
Name
列选择离你近的区域。 例如,选择eastasia
或westus2
。运行
az configure
以设置默认区域。 请将<REGION>
替换为您所选区域的名称。az configure --defaults ___location=<REGION>
此示例将
westus2
设置为默认区域:az configure --defaults ___location=westus2
创建资源组
创建资源组以包含此训练模块中使用的资源。
若要创建名为 tailspin-space-game-rg 的资源组,
az group create
请运行以下命令:az group create --name tailspin-space-game-rg
创建 VM
若要创建 VM,请 az vm create
运行以下命令:
az vm create \
--name MyLinuxAgent \
--resource-group tailspin-space-game-rg \
--image canonical:ubuntu-24_04-lts:server:latest \
--size Standard_DS2_v2 \
--admin-username azureuser \
--generate-ssh-keys
VM 需要几分钟时间才能启动。
Standard_DS2_v2 指定 VM 的大小。 VM 的大小定义其处理器速度、内存量、初始存储量和预期的网络带宽。 这与 Microsoft 托管代理提供的大小相同。 在实践中,可以选择提供更多计算能力或附加功能(如图形处理)的大小。
该 --resource-group
参数指定保存我们需要创建的所有内容的 资源组 。 资源组使您可以管理构成我们解决方案的所有 VM、磁盘、网络接口和其他元素作为一个整体单元。
创建代理池
请回顾一下,代理池组织生成代理。 在本部分中,将在 Azure DevOps 中创建代理池。 稍后,在配置代理时,你将指定代理池的名称,以便它可以将自己注册到正确的池中。
在 Azure DevOps 中,转到“Space Game - Web - Agent”项目。
选择“Project settings”。
在“管道”下,选择“代理池”。
选择“添加池”。
在 “添加池 ”窗口中:
- 在 “要链接的池”下,选择“ 新建”。
- 在 “池类型”下,选择“ 自承载”。
- 在 “名称”下,输入 MyAgentPool。
在实践中,你将为池选择更具描述性的名称。
选择 创建。 新代理池将显示在列表中。
创建个人访问令牌
若要让生成代理向 Azure DevOps 注册自身,需要一种方法才能对自身进行身份验证。
为此,可以创建个人访问令牌。 个人访问令牌(或 PAT)是密码的替代方法。 可以使用 PAT 对 Azure DevOps 等服务进行身份验证。
重要
与使用密码一样,请务必将访问令牌保存在安全的位置。 在本部分中,你将访问令牌存储为环境变量,使其不会出现在 shell 脚本中。
在 Azure DevOps 中,打开配置文件设置,然后选择 “个人访问令牌”。
选择 “新建令牌”。
输入令牌的名称,例如 生成代理。
在 “作用域”下,选择底部的 “显示所有范围 ”链接。
查找 代理池,然后选择“ 读取和管理”。
选择 创建。
将令牌复制到安全的位置。
稍后,将使用令牌使生成代理能够对 Azure Pipelines 的访问进行身份验证。
连接到您的虚拟机
在本部分中,你将通过 SSH 连接到 Linux VM,以便对其进行配置。
请注意,不能以交互方式登录到 Microsoft 托管代理。 由于专用构建代理是你自己的,因此你可以登录并按自己的喜好进行配置。
通过连接到构建代理,您可以使用所需的工具对其进行配置,以便生成您的软件。 它还允许你在生成管道配置时排查问题。
若要获取 VM 的 IP 地址,请在 Cloud Shell 中运行
az vm show
:IPADDRESS=$(az vm show \ --name MyLinuxAgent \ --resource-group tailspin-space-game-rg \ --show-details \ --query [publicIps] \ --output tsv)
此命令将 IP 地址存储在一个名为
IPADDRESS
的 Bash 变量中。将 VM 的 IP 地址打印到控制台:
echo $IPADDRESS
创建 SSH 与 VM 的连接。 代替$IPADDRESS,输入在上一步中收到的 IP 地址。 在提示符下,输入 “是 ”以继续连接。
ssh azureuser@$IPADDRESS
现在,你已通过 SSH 连接到 VM。
此命令有效,因为你在之前运行
az vm create
时提供了--generate-ssh-keys
该选项。 此选项将创建一个 SSH 密钥对,使你能够登录到 VM。
在 VM 上安装生成工具
在本部分中,你将使用生成 Space Game 网站所需的工具配置 VM。
回想一下,现有生成过程使用这些工具:
- .NET SDK,用于生成应用程序
- Node.js,用于执行生成任务
- npm,Node.js 包管理器
- gulp,一个用于压缩 JavaScript 和 CSS 文件的 Node.js 工具包
这些是生成过程所需的主要工具。 若要安装它们,你将从 GitHub 下载并运行 shell 脚本。
注释
生成过程使用其他工具(如 node-sass)将 Sass (.scss) 文件转换为 CSS (.css) 文件。 不过,Node.js 会在生成运行时安装这些工具。
首先,更新名为 apt 的 Ubuntu 包管理器。 此作从包存储库中提取最新信息,通常是在设置新的 Ubuntu 系统时要做的第一件事。
在 SSH 连接中,更新 apt 包管理器缓存:
sudo apt-get update
sudo
使用管理员或根权限运行命令。若要从 GitHub 下载名为 build-tools.sh 的 shell 脚本,
curl
请运行以下命令:curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-tools.sh > build-tools.sh
将脚本打印到终端,以便检查其内容:
cat build-tools.sh
显示以下结果:
#!/bin/bash set -e # Select a default .NET version if one is not specified if [ -z "$DOTNET_VERSION" ]; then DOTNET_VERSION=6.0.300 fi # Add the Node.js PPA so that we can install the latest version curl -sL https://deb.nodesource.com/setup_16.x | bash - # Install Node.js and jq apt-get install -y nodejs apt-get install -y jq # Install gulp npm install -g gulp # Change ownership of the .npm directory to the sudo (non-root) user chown -R $SUDO_USER ~/.npm # Install .NET as the sudo (non-root) user sudo -i -u $SUDO_USER bash << EOF curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin -c LTS -v $DOTNET_VERSION EOF
该脚本安装 Node.js、npm、gulp 和 .NET Core。
通过设置
DOTNET_VERSION
环境变量,可以指定要安装的 .NET 版本。 如果未设置此变量,脚本将安装现有生成配置使用的版本。 出于学习目的,你不会设置此变量。 允许脚本使用默认版本。使脚本可执行,然后运行脚本:
chmod u+x build-tools.sh sudo ./build-tools.sh
运行脚本需要几分钟时间。
实际上,现在可以运行命令来验证是否已成功安装每个软件组件。
在 VM 上安装代理软件
现在,是时候在 VM 上安装代理软件了。 此软件使 VM 能够充当生成代理,并从 Azure Pipelines 接收生成作业。
注册过程会在将代理注册到 Azure Pipelines 之前检查已安装的软件。 因此,安装所有其他软件后,必须设置代理。 在实践中,如果需要安装其他软件,可以再次注册代理。
本文档介绍如何手动设置 自承载 Linux 代理 以及 macOS 和 Windows 代理。 运行 shell 脚本以与在上一部分中设置生成工具的方式大致相同来配置代理。
重要
此处运行的脚本用于学习目的。 在实践中,应首先了解所生成的脚本中的每个命令如何影响整个系统。 在模块结束时,我们将指向更完整地描述你的选项的文档。
若要从 GitHub 下载名为 build-agent.sh 的 shell 脚本,
curl
请运行以下命令:curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-agent.sh > build-agent.sh
将脚本打印到终端,以便检查其内容:
cat build-agent.sh
显示以下结果:
#!/bin/bash set -e # Select a default agent version if one is not specified if [ -z "$AZP_AGENT_VERSION" ]; then AZP_AGENT_VERSION=2.187.2 fi # Verify Azure Pipelines token is set if [ -z "$AZP_TOKEN" ]; then echo 1>&2 "error: missing AZP_TOKEN environment variable" exit 1 fi # Verify Azure DevOps URL is set if [ -z "$AZP_URL" ]; then echo 1>&2 "error: missing AZP_URL environment variable" exit 1 fi # If a working directory was specified, create that directory if [ -n "$AZP_WORK" ]; then mkdir -p "$AZP_WORK" fi # Create the Downloads directory under the user's home directory if [ -n "$HOME/Downloads" ]; then mkdir -p "$HOME/Downloads" fi # Download the agent package curl https://vstsagentpackage.azureedge.net/agent/$AZP_AGENT_VERSION/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz > $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz # Create the working directory for the agent service to run jobs under if [ -n "$AZP_WORK" ]; then mkdir -p "$AZP_WORK" fi # Create a working directory to extract the agent package to mkdir -p $HOME/azp/agent # Move to the working directory cd $HOME/azp/agent # Extract the agent package to the working directory tar zxvf $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz # Install the agent software ./bin/installdependencies.sh # Configure the agent as the sudo (non-root) user chown $SUDO_USER $HOME/azp/agent sudo -u $SUDO_USER ./config.sh --unattended \ --agent "${AZP_AGENT_NAME:-$(hostname)}" \ --url "$AZP_URL" \ --auth PAT \ --token "$AZP_TOKEN" \ --pool "${AZP_POOL:-Default}" \ --work "${AZP_WORK:-_work}" \ --replace \ --acceptTeeEula # Install and start the agent service ./svc.sh install ./svc.sh start
无需了解每行的工作原理,但下面简要总结了此脚本的作用:
- 它将代理包下载为 .tar.gz 文件并提取其内容。
- 在提取的文件中,脚本为:
- 运行名为 installdependencies.sh 的 shell 脚本以安装代理软件。
- 运行名为 config.sh 的 shell 脚本,以配置代理并将代理注册到 Azure Pipelines。
- 运行名为 svc.sh 的 shell 脚本来安装和启动代理服务。
该脚本使用环境变量来提供有关 Azure DevOps 组织的详细信息。 摘要如下:
Bash 变量 DESCRIPTION 违约 AZP_AGENT_VERSION
要安装的代理软件的版本 我们上次用于测试此模块的版本 AZP_URL
Azure DevOps 组织的 URL (无) AZP_TOKEN
个人访问令牌 (无) AZP_AGENT_NAME
在 Azure DevOps 中显示的代理名称 系统的主机名 AZP_POOL
代理池的名称 默认 AZP_WORK
代理执行生成任务的工作目录 _work 如果脚本未为未设置的变量提供默认值,该脚本将输出错误消息并立即退出。
在以下步骤中,设置以下环境变量:
AZP_AGENT_VERSION
AZP_URL
AZP_TOKEN
AZP_AGENT_NAME
AZP_POOL
目前,我们建议将其他变量保留为未设置。
设置
AZP_AGENT_NAME
环境变量以指定代理的名称。 建议 使用 MyLinuxAgent。export AZP_AGENT_NAME=MyLinuxAgent
设置
AZP_URL
环境变量以指定 Azure DevOps 组织的 URL。将 <组织> 替换为自己的组织。 可以从显示 Azure DevOps 的浏览器选项卡中获取名称。
export AZP_URL=https://dev.azure.com/organization
设置
AZP_TOKEN
环境变量以指定个人访问令牌(即在此单元前面部分复制的长令牌值)。将 <令牌> 替换为自己的令牌。
export AZP_TOKEN=token
设置
AZP_POOL
环境变量以指定代理池的名称。 之前,你创建了一个名为 MyAgentPool 的池。export AZP_POOL=MyAgentPool
设置
AZP_AGENT_VERSION
环境变量以指定最新版本的代理。export AZP_AGENT_VERSION=$(curl -s https://api.github.com/repos/microsoft/azure-pipelines-agent/releases | jq -r '.[0].tag_name' | cut -d "v" -f 2)
Linux 计算机上的 YAML 管道必须使用最新版本的代理,即使它已预发布也是如此。 代理软件会不断更新,因此可以从
curl
GitHub 存储库获取版本信息。 该命令使用jq
从返回的 JSON 字符串中读取最新的版本。将代理版本打印到控制台。 (可选) 检查 以确保这是最新版本。
echo $AZP_AGENT_VERSION
使脚本可执行文件,然后运行它:
chmod u+x build-agent.sh sudo -E ./build-agent.sh
sudo
使脚本能够作为根用户运行。 该-E
参数会保留当前环境变量,包括设置的环境变量,以便这些变量可供脚本使用。当脚本运行时,你会看到代理连接到 Azure DevOps,添加到代理池中,然后代理连接被测试。
验证代理是否正在运行
已成功在 VM 上安装生成工具和代理软件。 作为验证步骤,请转到 Azure DevOps,并在代理池中查看您的代理。
在 Azure DevOps 中,转到“Space Game - Web - Agent”项目。
选择“Project settings”。
在“管道”下,选择“代理池”。
选择 MyAgentPool。
选择“ 代理 ”选项卡。
可以看到你的代理处于联机状态且已准备好接受生成作业。
小窍门
如果生成代理显示为 脱机,请尝试等待片刻,然后刷新页面。
选择代理 MyLinuxAgent。
选择 功能 选项卡。
在安装过程中,配置过程会扫描工具功能的生成代理。 你会看到
npm
是其中之一。 请注意,最初的构建配置指定npm
必须安装在代理上。指定要使用的代理池时,可以在
demands
部分中包含其中任何条目。 包含它们可确保 Azure Pipelines 选择具有生成应用程序所需软件的生成代理。 它还使你能够创建具有各种软件配置的代理池。 Azure Pipelines 将根据要求选择正确的配置。