Self-hosted Windows agents(自托管 Windows 代理)
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018
若要生成和部署Windows、Azure 和其他Visual Studio解决方案,至少需要一个Windows代理。 Windows代理还可以生成 Java 和Android应用。
开始之前:
- 如果代码位于Azure Pipelines并且Microsoft 托管的代理满足你的需求,则可以跳过设置自承载Windows代理。
- 如果代码位于本地 TFS) 2015 服务器Team Foundation Server (,请参阅在本地 TFS 2015 Windows上部署代理。
- 否则,你已来到正确的位置,在Windows上设置代理。 请继续阅读下一节。
了解代理
如果已知道代理是什么及其工作原理,请随时直接跳转到以下部分。 但是,如果你希望更了解他们做什么及其工作原理,请参阅Azure Pipelines代理。
检查先决条件
确保计算机具有以下先决条件:
- 如果使用客户端 OS) ,Windows 7 SP1 ESU、8.1、10 或 11 (
- 如果使用服务器 OS) ,Windows 2012 或更高版本 (
- PowerShell 3.0 或更高版本
- .NET Framework 4.6.2 或更高版本
重要
从 2019 年 12 月开始,生成代理所需的最低 .NET 版本为 4.6.2 或更高版本。
建议:
- Visual Studio 2015 年或更高版本的生成工具 ()
如果要从 Subversion 存储库生成,则必须在计算机上安装 Subversion 客户端 。
首次应手动运行代理安装程序。 在了解代理的工作原理或想要自动设置许多代理后,请考虑使用 无人参与的配置。
硬件规格
代理的硬件规格因需求、团队大小等而异。无法提出将适用于每个人的一般建议。 作为参考点,Azure DevOps团队使用利用托管代理的管道生成托管代理代码。 另一方面,运行 4 个自承载代理的 24 核服务器类计算机构建了大部分Azure DevOps代码。
准备权限
自承载代理的信息安全
配置代理的用户需要池管理员权限,但运行代理的用户不需要。
代理控制的文件夹应限制为尽可能少的用户,并且它们包含可以解密或外泄的机密。
ADO 管道代理是一种软件产品,旨在执行从外部源下载的代码。 它本质上可能是远程代码执行 (RCE) 攻击的目标。
因此,请务必考虑每个单独使用Pipelines代理的威胁模型来执行工作,并决定可以向运行代理的用户授予哪些最低权限、代理运行的计算机、对管道定义具有写入访问权限的用户、存储 yaml 的 git 存储库的用户, 或控制对新管道池的访问权限的用户组。
最好是让运行代理的标识不同于有权将代理连接到池的标识。 生成凭据的用户 (和其他代理相关的文件) 不同于需要读取凭据的用户。 因此,仔细考虑授予代理计算机本身的访问权限以及包含敏感文件的代理文件夹(例如日志和项目)更安全。
仅针对运行代理进程的DevOps管理员和用户标识授予对代理文件夹的访问权限是有意义的。 管理员可能需要调查文件系统以了解生成失败或获取日志文件才能报告Azure DevOps故障。
确定要使用的用户
作为一次性步骤,必须注册代理。 有权 管理代理队列 的人员必须完成这些步骤。 代理不会在日常操作中使用此人的凭据,但需要他们才能完成注册。 详细了解 代理的通信方式。
使用个人访问令牌进行身份验证 (PAT)
- 使用计划在 Team Foundation Server Web 门户中使用的用户帐户登录, ()
https://{your-server}:8080/tfs/。
- 使用计划用于Azure DevOps Server Web 门户的用户帐户登录, (
https://{your-server}/DefaultCollection/) 。
- 使用计划在 Azure DevOps 组织 (
https://dev.azure.com/{your_organization}) 中使用的用户帐户登录。
在主页中,打开个人资料。 转到安全详细信息。

-

在主页中,打开用户设置,然后选择“个人访问令牌”。

-

对于范围,请选择 (读取的代理池,请管理) 并确保清除所有其他框。 如果是 部署组 代理,对于范围选择“ 部署组” (读取、管理) 并确保清除所有其他框。
选择“创建新个人访问令牌”窗口底部的所有范围,以查看范围的完整列表。
复制令牌。 配置代理时,你将使用此令牌。
确认用户是否具有权限
确保要使用的用户帐户有权注册代理。
用户是Azure DevOps组织所有者还是 TFS 或Azure DevOps Server管理员? 请在此处停止,您具有权限。
否则:
打开浏览器并导航到Azure Pipelines组织或Azure DevOps Server或 TFS 服务器的“代理池”选项卡:
选择Azure DevOps“组织”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

导航到项目,然后选择代理队列) > (齿轮图标设置。

选择 “管理池”。

选择页面右侧的池,然后单击“ 安全性”。
如果未显示要使用的用户帐户,请获取管理员添加它。 管理员可以是代理池管理员、Azure DevOps组织所有者或 TFS 或Azure DevOps Server管理员。
如果是部署组代理,管理员可以是部署组管理员、Azure DevOps组织所有者或 TFS 或Azure DevOps Server管理员。
可以在Azure Pipelines“部署组”页上的“安全”选项卡中将用户添加到部署组管理员角色。
注意
如果看到如下所示的消息:很抱歉,无法添加标识。请尝试其他标识。你可能已针对组织所有者或 TFS 或Azure DevOps Server管理员执行上述步骤。 无需执行任何操作;你已有权管理代理队列。
下载并配置代理
Azure Pipelines
使用已为其准备权限的帐户登录到计算机,如上所述。
在 Web 浏览器中,登录到Azure Pipelines,并导航到“代理池”选项卡:
选择Azure DevOps“组织”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

导航到项目,然后选择代理队列) > (齿轮图标设置。

选择 “管理池”。

选择 “默认 池”,选择“ 代理 ”选项卡,然后选择“ 新建代理”。
在“获取代理”对话框中,选择Windows。
在左窗格中,选择计算机上安装的Windows OS 版本的处理器体系结构。 x64 代理版本适用于 64 位Windows,而 x86 版本适用于 32 位Windows。 如果不确定安装了哪个版本的Windows,请按照以下说明了解。
在右窗格中,单击“ 下载 ”按钮。
按照页面上的说明下载代理。
将代理解压缩到所选目录中。 请确保目录的路径不包含空格,因为工具和脚本并不总是正确转义空格。 建议的文件夹是
C:\agents。 在下载文件夹中提取或其他用户文件夹可能会导致权限问题。 然后运行config.cmd。 这将询问配置代理的一系列问题。
Azure DevOps Server 2019 和 Azure DevOps Server 2020
使用已为其准备权限的帐户登录到计算机,如上所述。
在 Web 浏览器中,登录到 Azure DevOps Server 2019,并导航到“代理池”选项卡:
选择Azure DevOps“组织”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

导航到项目,然后选择代理队列) > (齿轮图标设置。

选择 “管理池”。

单击“下载代理”。
在“获取代理”对话框中,单击Windows。
在左窗格中,选择计算机上安装的Windows OS 版本的处理器体系结构。 x64 代理版本适用于 64 位Windows,而 x86 版本适用于 32 位Windows。 如果不确定安装了哪个版本的Windows,请按照以下说明了解。
在右窗格中,单击“ 下载 ”按钮。
按照页面上的说明下载代理。
将代理解压缩到所选目录中。 请确保目录的路径不包含空格,因为工具和脚本并不总是正确转义空格。 建议的文件夹是
C:\agents。 在下载文件夹中提取或其他用户文件夹可能会导致权限问题。 然后运行config.cmd。 这将询问配置代理的一系列问题。
TFS 2018
使用已为其准备权限的帐户登录到计算机,如上所述。
在 Web 浏览器中,登录到 TFS,并导航到 “代理池 ”选项卡:
导航到项目,然后选择代理队列) > (齿轮图标设置。

选择 “管理池”。

单击“下载代理”。
在“获取代理”对话框中,单击Windows。
单击“ 下载 ”按钮。
按照页面上的说明下载代理。
将代理解压缩到所选目录中。 请确保目录的路径不包含空格,因为工具和脚本并不总是正确转义空格。 建议的文件夹是
C:\agents。 在下载文件夹中提取或其他用户文件夹可能会导致权限问题。 然后运行config.cmd。
重要
强烈建议从提升的 PowerShell 窗口配置代理。 如果要配置为服务, 则需要这样做。
重要
出于安全原因,强烈建议确保代理文件夹 (C:\agents) 只能由管理员编辑。
注意
请避免在代理配置中使用基于 mintty 的 shell,例如 git-bash。 Mintty 与本机输入/输出WINDOWS API 不兼容 (,此处提供了一些有关它的信息) ,在这种情况下,我们无法保证安装脚本的正确工作。
服务器 URL 和身份验证
当安装程序要求服务器 URL 时,请回答https://dev.azure.com/{your-organization}Azure DevOps Services。
当安装程序要求服务器 URL 时,对于 TFS,请回答 https://{your_server}/tfs。
设置要求身份验证类型时,请选择 PAT。 然后将 创建的 PAT 令牌 粘贴到命令提示符窗口中。
注意
使用 PAT 作为身份验证方法时,PAT 令牌仅在代理的初始配置期间使用。 稍后,如果 PAT 过期或需要续订,则代理无需进一步更改。
重要
确保服务器 配置为支持要使用的身份验证方法 。
将代理配置为连接到 TFS 时,有以下选项:
使用基本身份验证将备用连接到 TFS。 选择“备用”后,系统会提示输入凭据。
通过 NTLM 或 Kerberos 等Windows 身份验证方案 连接协商与 TFS 协商为非登录用户。 选择“协商”后,系统会提示输入凭据。
集成 (默认) 连接使用登录用户的凭据 Windows 身份验证(例如 NTLM 或 Kerberos)将Windows代理) 连接 TFS。 选择此方法后,系统不会提示输入凭据。
帕特仅在 Azure Pipelines 和 TFS 2017 及更新版本上受支持。 选择 PAT 后,将 创建的 PAT 令牌 粘贴到命令提示符窗口中。 如果 TFS 实例和代理计算机不在受信任的域中,请使用个人访问令牌 (PAT) 。 PAT 身份验证由 TFS 实例而不是域控制器处理。
注意
使用 PAT 作为身份验证方法时,PAT 令牌仅用于代理的初始配置。 如果需要重新生成 PAT,则无需对代理进行进一步更改。
在与 Azure Pipelines 或 TFS 通信中了解详细信息。
选择交互式或服务模式
有关是以交互模式还是作为服务运行代理的指导,请参阅 代理:交互式与服务。
如果选择以服务 (运行,我们建议) ,则运行用户名应为 20 个字符或更少。
运行代理
以交互方式运行
如果将代理配置为以交互方式运行,请运行它:
.\run.cmd
若要重启代理,请按 Ctrl+C 停止代理,然后运行 run.cmd 以重启代理。
运行一次
对于配置为以交互方式运行的代理,可以选择让代理只接受一个作业。 若要在此配置中运行,请执行以下操作:
.\run.cmd --once
此模式下的代理将只接受一个作业,然后正常向下旋转, (适用于在服务(如 Azure 容器实例) )上运行的 Docker。
作为服务运行
如果将代理配置为作为服务运行,则它会自动启动。 可以从服务管理单元查看和控制代理运行状态。 运行 services.msc 并查找以下项之一:
- “Azure Pipelines代理 (代理) 的名称”。
- “VSTS 代理 (代理) 的名称 ”。
- “vstsagent. (组织名称) . (代理) 的名称 ”。
若要重启代理,请右键单击该条目,然后选择 “重启”。
注意
如果需要更改代理的登录帐户,请不要从服务管理单元执行此操作。 相反,请参阅以下信息以重新配置代理。
若要使用代理,请使用代理的池运行 作业 。 如果未选择其他池,代理将位于 默认 池中。
替换代理
若要替换代理,请遵循 “下载”并再次配置代理 步骤。
使用已存在的代理的名称配置代理时,系统会询问是否要替换现有代理。 如果回答 Y,请确保删除代理 (看到下面) 要替换。 否则,在发生几分钟冲突后,其中一个代理将关闭。
删除并重新配置代理
若要删除该代理,请执行以下操作:
.\config remove
删除代理后,可以 再次对其进行配置。
无人参与配置
可以从没有人工干预的脚本设置代理。
必须通过 --unattended 并回答所有问题。
若要配置代理,它必须知道组织的 URL 或有权设置代理的人员的集合和凭据。
所有其他响应都是可选的。
可以使用环境变量指定任何命令行参数:将其名称放在大写和前面 VSTS_AGENT_INPUT_。
例如, VSTS_AGENT_INPUT_PASSWORD 而不是指定 --password。
必需选项
--unattended- 代理设置不会提示输入信息,并且必须在命令行上提供所有设置--url <url>- 服务器的 URL。 例如:https://dev.azure.com/myorganization 或 http://my-azure-devops-server:8080/tfs--auth <type>- 身份验证类型。 有效值是:pat(个人访问令牌) - PAT 是唯一可用于Azure DevOps Services的方案。negotiate(Kerberos 或 NTLM)alt(基本身份验证)integrated(Windows默认凭据)
身份验证选项
- 如果选择
--auth pat:--token <token>- 指定个人访问令牌- PAT 是唯一适用于Azure DevOps Services的方案。
- 如果选择
--auth negotiate或--auth alt:--userName <userName>- 指定格式或格式domain\userName的Windows用户名userName@domain.com--password <password>- 指定密码
池和代理名称
--pool <pool>- 要加入的代理的池名称--agent <agent>- 代理名称--replace- 替换池中的代理。 如果另一个代理侦听同名,它将开始失败并发生冲突
代理设置
--work <workDirectory>- 存储作业数据的工作目录。 默认为_work代理目录的根目录下。 工作目录由给定代理拥有,不应在多个代理之间共享。--acceptTeeEula- 仅接受Team Explorer Everywhere最终用户许可协议 (macOS和 Linux)--disableloguploads- 不要将控制台日志输出流式传输或发送到服务器。 相反,可以在作业完成后从代理主机的文件系统中检索它们。
仅限Windows启动
--runAsService- 将代理配置为作为Windows服务运行, (需要管理员权限)--runAsAutoLogon- 配置自动登录并在启动时运行代理 (需要管理员权限)--windowsLogonAccount <account>- 用于--runAsService或--runAsAutoLogon指定格式或格式domain\userName的Windows用户名userName@domain.com--windowsLogonPassword <password>- 用于--runAsService或--runAsAutoLogon指定组托管服务帐户和Windows内置帐户(如“NT AUTHORITY\NETWORK SERVICE”) )不需要Windows登录密码 (--overwriteAutoLogon- 用于--runAsAutoLogon覆盖计算机上的现有自动登录--noRestart- 用于--runAsAutoLogon在代理配置完成后停止主机重启
仅限部署组
--deploymentGroup- 将代理配置为部署组代理--deploymentGroupName <name>- 用于--deploymentGroup指定要加入的代理的部署组--projectName <name>- 用于--deploymentGroup设置项目名称--addDeploymentGroupTags- 用于--deploymentGroup指示应添加部署组标记--deploymentGroupTags <tags>- 用于--addDeploymentGroupTags指定部署组代理的逗号分隔标记列表 - 例如“web, db”
仅限环境
--addvirtualmachineresourcetags- 用于指示应添加环境资源标记--virtualmachineresourcetags <tags>- 用于--addvirtualmachineresourcetags指定环境资源代理的逗号分隔标记列表 -例如“web,db”
.\config --help 始终列出最新的必需响应和可选响应。
诊断
如果在自承载代理时遇到问题,可以尝试运行诊断。 配置代理后:
.\run --diagnostics
这将通过诊断套件来帮助你解决问题。 诊断功能从代理版本 2.165.0 开始可用。
有关其他选项的帮助
若要了解其他选项,请执行以下操作:
.\config --help
帮助提供有关身份验证替代项和无人参与配置的信息。
功能
代理的功能在池中编录和播发,以便只为其分配可以处理的生成和发布。 请参阅 生成和发布代理功能。
在许多情况下,在部署代理后,需要安装软件或实用程序。 通常,应在代理上安装任何在开发计算机上使用的软件和工具。
例如,如果生成包含npm任务,则除非池中安装了npm生成代理,否则生成不会运行。
重要
功能包括所有环境变量以及代理运行时设置的值。 如果代理正在运行时这些值中的任何一个更改,则必须重新启动代理才能选取新值。 在代理上安装新软件后,必须重启代理,使新功能显示在池中,以便生成可以运行。
如果要将环境变量排除为功能,可以通过设置具有逗号分隔的变量列表的环境变量 VSO_AGENT_IGNORE 来指定它们。
常见问题解答
如何实现确保我有最新的 v2 代理版本?
导航到 “代理池 ”选项卡:
选择Azure DevOps“组织”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

选择Azure DevOps,“集合”设置。

选择 代理池。

导航到项目,然后选择代理队列) > (齿轮图标设置。

选择 “管理池”。

单击包含代理的池。
确保已启用代理。
导航到“功能”选项卡:
从 “代理池 ”选项卡中,选择所需的代理池。

选择 代理 并选择所需的代理。

选择 “功能 ”选项卡。

注意
Microsoft 托管的代理不显示系统功能。 有关在 Microsoft 托管代理上安装的软件的列表,请参阅 使用 Microsoft 托管的代理。
从 “代理池 ”选项卡中,选择所需的池。

选择 “代理 ”,然后选择所需的代理。

选择 “功能 ”选项卡。

从 “代理池 ”选项卡中,选择所需的池。

选择 “代理 ”,然后选择所需的代理。

选择 “功能 ”选项卡。

选择所需的代理,然后选择 “功能 ”选项卡。

查找
Agent.Version功能。 可以针对最新发布的代理版本检查此值。 请参阅Azure Pipelines代理并检查列出的最高版本号页面。每个代理在运行需要较新版本代理的任务时自动更新自身。 如果要手动更新某些代理,请右键单击池,然后选择 “更新所有代理”。
是否可以更新属于Azure DevOps Server池的 v2 代理?
是的。 从 Azure DevOps Server 2019 开始,可以将服务器配置为在本地磁盘上查找代理包文件。 此配置将替代服务器发布时附带的默认版本。 当服务器无权访问 Internet 时,此方案也适用。
从具有 Internet 访问权限的计算机,从 Azure Pipelines 代理GitHub发布页下载.zip或 .tar.gz) 表单 (最新版本的代理包文件。
通过使用所选 ((例如 USB 驱动器、网络传输等)的方法,将下载的包文件传输到每个Azure DevOps Server应用程序层) 。 将代理文件放在文件夹下
%ProgramData%\Microsoft\Azure DevOps\Agents。你已全部设置! 每当更新代理时,Azure DevOps Server都将使用本地文件。 每个代理在运行需要较新版本代理的任务时自动更新自身。 但是,如果要手动更新某些代理,请右键单击池,然后选择 “更新所有代理”。
我正在运行防火墙,我的代码在 Azure Repos 中。 代理需要与哪些 URL 通信?
如果在防火墙后面的安全网络中运行代理,请确保代理可以启动与以下 URL 和 IP 地址的通信。
| 域 URL | 说明 |
|---|---|
https://{organization_name}.pkgs.visualstudio.com |
使用{organization_name}.visualstudio.com域的组织Azure DevOps打包 API |
https://{organization_name}.visualstudio.com |
对于使用 {organization_name}.visualstudio.com 域的组织 |
https://{organization_name}.vsblob.visualstudio.com |
使用{organization_name}.visualstudio.com域的组织Azure DevOps遥测 |
https://{organization_name}.vsrm.visualstudio.com |
使用{organization_name}.visualstudio.com域的组织Release Management服务 |
https://{organization_name}.vssps.visualstudio.com |
Azure DevOps使用域的组织的平台{organization_name}.visualstudio.com服务 |
https://{organization_name}.vstmr.visualstudio.com |
使用{organization_name}.visualstudio.com域的组织Azure DevOps测试管理服务 |
https://*.blob.core.windows.net |
Azure Artifacts |
https://*.dev.azure.com |
对于使用 dev.azure.com 域的组织 |
https://*.vsassets.io |
通过 CDN 进行Azure Artifacts |
https://*.vsblob.visualstudio.com |
使用dev.azure.com域的组织Azure DevOps遥测 |
https://*.vssps.visualstudio.com |
Azure DevOps使用域的组织的平台dev.azure.com服务 |
https://*.vstmr.visualstudio.com |
使用dev.azure.com域的组织Azure DevOps测试管理服务 |
https://app.vssps.visualstudio.com |
对于使用 {organization_name}.visualstudio.com 域的组织 |
https://dev.azure.com |
对于使用 dev.azure.com 域的组织 |
https://login.microsoftonline.com |
Azure Active Directory 登录 |
https://management.core.windows.net |
Azure 管理 API |
https://vstsagentpackage.azureedge.net |
代理包 |
若要确保组织适用于任何现有的防火墙或 IP 限制,请确保dev.azure.com*dev.azure.com并且已打开并更新允许列出的 IP,以基于 IP 版本包括以下 IP 地址。 如果当前允许列出 13.107.6.183 和 13.107.9.183 IP 地址,请保留这些地址,因为无需删除它们。
IPv4 范围
13.107.6.0/2413.107.9.0/2413.107.42.0/2413.107.43.0/24
IPv6 范围
2620:1ec:4::/482620:1ec:a92::/482620:1ec:21::/482620:1ec:22::/48
注意
有关允许的地址的详细信息,请参阅 允许的地址列表和网络连接。
如何实现使用自签名证书运行代理?
如何实现在 Web 代理后面运行代理?
如何实现重启代理
如果以交互方式运行代理,请参阅 “以交互方式运行”中的重启说明。 如果以服务的形式运行代理,请按照 运行即服务中的步骤重启代理。
如何实现为每个单独的代理设置不同的环境变量?
在代理的根目录下创建一个 .env 文件,并将要设置为以下格式的环境变量:
MyEnv0=MyEnvValue0
MyEnv1=MyEnvValue1
MyEnv2=MyEnvValue2
MyEnv3=MyEnvValue3
MyEnv4=MyEnvValue4
如何实现配置代理以绕过 Web 代理并连接到Azure Pipelines?
如果希望代理绕过代理并直接连接到Azure Pipelines,则应将 Web 代理配置为使代理能够访问以下 URL。
对于使用 *.visualstudio.com 域的组织:
https://login.microsoftonline.com
https://app.vssps.visualstudio.com
https://{organization_name}.visualstudio.com
https://{organization_name}.vsrm.visualstudio.com
https://{organization_name}.vstmr.visualstudio.com
https://{organization_name}.pkgs.visualstudio.com
https://{organization_name}.vssps.visualstudio.com
对于使用 dev.azure.com 域的组织:
https://dev.azure.com
https://*.dev.azure.com
https://login.microsoftonline.com
https://management.core.windows.net
https://vstsagentpackage.azureedge.net
https://vssps.dev.azure.com
若要确保组织适用于任何现有的防火墙或 IP 限制,请确保dev.azure.com*dev.azure.com并且已打开并更新允许列出的 IP,以基于 IP 版本包括以下 IP 地址。 如果当前允许列出 13.107.6.183 和 13.107.9.183 IP 地址,请保留这些地址,因为无需删除它们。
IPv4 范围
13.107.6.0/2413.107.9.0/2413.107.42.0/2413.107.43.0/24
IPv6 范围
2620:1ec:4::/482620:1ec:a92::/482620:1ec:21::/482620:1ec:22::/48
注意
此过程使代理可以绕过 Web 代理。 生成管道和脚本仍必须针对在生成中运行的每个任务和工具处理绕过 Web 代理。
例如,如果使用NuGet任务,则必须将 Web 代理配置为支持绕过托管所使用的NuGet源的服务器 URL。
我在使用 TFS,上述部分中的 URL 不适用于我。 在哪里可以获取帮助?
我在本地使用 TFS,但没有看到其中某些功能。 为什么看不到?
其中某些功能仅在 Azure Pipelines 上可用,在本地尚不可用。 如果你已升级到最新版本的 TFS,则可在本地使用这些功能。