Azure Pipelines agents(Azure Pipelines 代理)

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

若要生成代码或使用 Azure Pipelines 部署软件,至少需要一个代理。 添加更多代码和人员时,你最终需要更多的代码和人员。

管道运行时,系统会启动一个或多个作业。 代理是计算基础结构,其中包含一次运行一个作业的已安装代理软件。

作业可以直接 在代理的主机容器中运行。

Microsoft 托管代理

如果管道处于Azure Pipelines,则可以使用 Microsoft 托管代理方便地运行作业。 Microsoft 托管的代理可以为你处理维护和升级操作。 每次运行管道时,都会为管道中的每个作业获取一个新的虚拟机。 虚拟机在一个作业 (后被丢弃,这意味着作业对虚拟机文件系统所做的任何更改(例如签出代码)将不适用于下一个作业) 。 Microsoft 托管的代理可以直接 在 VM容器上运行作业。

Azure Pipelines使用 Microsoft 托管的代理提供名为Azure Pipelines的预定义代理池。

对于许多团队,这是运行作业的最简单方法。 可先尝试此操作,了解其是否适用于你的生成或部署。 如果不适用,可以使用自托管代理。

提示

可以免费试用 Microsoft 托管的代理。

详细了解 Microsoft 托管的代理

自托管代理

你自行设置和管理的代理以运行作业是一个 自承载代理。 可以在Azure Pipelines或Azure DevOps Server中使用自承载代理,该代理以前名为 TFS) Team Foundation Server (。 通过自承载代理,可以更灵活地安装生成和部署所需的依赖软件。 此外,计算机级缓存和配置会从运行持续到运行,这可以提高速度。

注意

虽然可以为每个计算机安装多个代理,但我们强烈建议仅为每个计算机安装一个代理。 安装两个或多个代理可能会对性能和管道的结果产生不利影响。

提示

在安装自承载代理之前,可能需要查看 Microsoft 托管代理池是否适合你。 在许多情况下,这是最简单的方式。 试一试

可在 Linux、macOS 或 Windows 计算机上安装代理。 还可以在 Docker 容器上安装代理。 有关安装自承载代理的详细信息,请参阅:

注意

在 macOS 上,需要清除下载存档上的特殊属性,以防止当运行 tar 文件时 ./config.sh 为每个程序集显示 Gatekeeper 保护。 以下命令清除文件中的扩展属性:

xattr -c vsts-agent-osx-x64-V.v.v.tar.gz  ## replace V.v.v with the version in the filename downloaded.

# then unpack the gzip tar file normally:

tar xvfz vsts-agent-osx-x64-V.v.v.tar.gz

在计算机上安装代理后,可以根据作业的要求在该计算机上安装任何其他软件。

注意

代理广泛向后兼容。 只要Azure DevOps不要求更高版本的代理,任何版本的代理都应与任何Azure DevOps版本兼容。

我们仅支持最新版本的代理,因为这是保证具有所有最新修补程序和 bug 修复的唯一版本。

Azure 虚拟机规模集代理

Azure 虚拟机规模集代理是一种可自动缩放以满足需求的自承载代理形式。 这种弹性可减少一直运行专用代理的需求。 与 Microsoft 托管的代理不同,你可以灵活地处理运行代理的计算机的大小和映像。

指定虚拟机规模集、要保持备用状态的多个代理、规模集中的最大虚拟机数,Azure Pipelines管理代理的缩放。

有关详细信息,请参阅 Azure 虚拟机规模集代理

并行作业

并行作业 表示可以在组织中同时运行的作业数。 如果组织有单个并行作业,则可以在组织中一次运行单个作业,并在第一个作业完成之前排队任何其他并发作业。 若要同时运行两个作业,需要两个并行作业。 在Azure Pipelines中,可以在 Microsoft 托管的基础结构或自己的 (自承载) 基础结构上运行并行作业。

默认情况下,Microsoft 在每个组织中提供免费层服务,其中包括至少一个并行作业。 根据需要运行的并发管道数量,可能需要更多并行作业来同时使用多个 Microsoft 托管或自承载代理。 有关并行作业和不同免费服务层的详细信息,请参阅Azure Pipelines中的并行作业

可能需要更多并行作业才能同时使用多个代理:

重要

从 Azure DevOps Server 2019 开始,无需在版本中支付自承载并发作业的费用。 仅受你拥有的代理数的限制。

功能

每个自承载代理都有一组功能,指示它可以执行的操作。 功能是代理软件自动发现的名称-值对,在这种情况下,它们称为 系统功能,或你定义的名称值对,在这种情况下,它们称为 用户功能

代理软件会自动确定各种系统功能,例如计算机的名称、操作系统类型以及计算机上安装的某些软件的版本。 此外,计算机中定义的环境变量会自动显示在系统功能列表中。

注意

将环境变量存储为功能意味着代理运行时,存储的功能值用于设置环境变量。 此外,任何任务都不会拾取和使用代理运行时对环境变量所做的任何更改。 如果你有更改的敏感环境变量,并且不希望它们存储为功能,可以通过设置 VSO_AGENT_IGNORE 环境变量来忽略它们,并用逗号分隔的变量列表来忽略它们。 例如,如果要安装软件, PATH 可能需要忽略的关键变量。

创作管道时,请指定代理的某些 需求 。 系统仅将作业发送到具有与管道中指定的 要求匹配功能的 代理。 因此,代理功能允许将作业定向到特定代理。

注意

需求和功能设计用于自承载代理,以便与满足作业要求的代理匹配。 使用 Microsoft 托管代理时,为符合作业要求的代理选择一个映像,因此,尽管可以将功能添加到 Microsoft 托管的代理,但不需要将功能与 Microsoft 托管的代理配合使用。

配置代理功能

可以通过导航到 代理池 并选择所需代理的 “功能 ”选项卡来查看代理的详细信息,包括其版本和系统功能,以及管理其用户功能。

  1. 在 Web 浏览器中,导航到代理池:

    1. 选择“Azure DevOps组织设置

      Choose Organization settings.

    2. 选择 代理池

      Choose Agent pools tab.

    1. 选择“Azure DevOps”集合设置

      Choose Collection settings.

    2. 选择 代理池

      Choose Agent pools.

    1. 选择“Azure DevOps”集合设置

      Collection settings, 2019.

    2. 选择 代理池

      Choose Agent pools, 2019.

    1. 导航到项目并选择设置 (齿轮图标>) 代理队列

      Choose Settings, Agent Queues, 2018.

    2. 选择 “管理池”。

      Choose Manage pools, 2018.

  2. 导航到“功能”选项卡:

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

      From Agent pools, select the desired agent pool.

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

      Select Agents and choose the agent.

    3. 选择 “功能 ”选项卡。

      Choose the Capabilities tab.

      注意

      Microsoft 托管的代理不显示系统功能。 有关在 Microsoft 托管代理上安装的软件的列表,请参阅 使用 Microsoft 托管的代理

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

      Select the desired pool.

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

      Select Agents and choose the desired agent.

    3. 选择 “功能 ”选项卡。

      Agent capabilities tab.

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

      Select the desired tab, 2019.

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

      Choose the desired agent, 2019.

    3. 选择 “功能 ”选项卡。

      Choose the Capabilities tab, 2019.

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

    Agent capabilities tab, 2018.

  3. 若要向代理注册新功能,请选择 “添加新功能”。

提示

在自承载代理上安装新软件后,必须重启代理,才能显示新功能。 有关详细信息,请参阅重启Windows代理重启 Linux 代理重启 Mac 代理

通信

与Azure Pipelines通信

与 TFS 通信

代理与Azure Pipelines或Azure DevOps Server通信,以确定需要运行的作业,并报告日志和作业状态。 此通信始终由代理启动。 从代理到Azure Pipelines或Azure DevOps Server的所有消息都通过 HTTP 或 HTTPS 发生,具体取决于配置代理的方式。 此拉取模型允许在不同拓扑中配置代理,如下所示。

Agent topologies in on-premises installations.

Agent topologies in Azure DevOps Services.

下面是代理与Azure Pipelines或Azure DevOps Server之间的常见通信模式。

  1. 用户通过将代理添加到代理池来向Azure Pipelines或Azure DevOps Server注册代理。 需要是 代理池管理员 才能在该代理池中注册代理。 代理池管理员的身份仅在注册时需要,并且不会保留在代理上,也不会用于代理与Azure Pipelines或Azure DevOps Server之间的任何进一步通信。 注册完成后,代理会下载 侦听器 OAuth 令牌 ,并使用它侦听作业队列。

  2. 代理侦听是否使用 HTTP 长轮询将新作业请求发布到作业队列中Azure Pipelines/Azure DevOps Server。 当作业可用时,代理会下载作业以及 特定于作业的 OAuth 令牌。 此令牌由管道中指定的作用域标识Azure Pipelines/Azure DevOps Server生成。 该令牌生存期较短,代理用于访问资源 (,例如源代码) 或修改资源 (,例如,在该作业中的Azure Pipelines或Azure DevOps Server上传测试结果) 。

  3. 作业完成后,代理会放弃特定于作业的 OAuth 令牌,并返回到检查是否有使用侦听器 OAuth 令牌的新作业请求。

代理与 Azure Pipelines/Azure DevOps Server 之间交换的消息的有效负载使用非对称加密进行保护。 每个代理都有一个公钥/私钥对,公钥在注册期间与服务器交换。 服务器使用公钥在将作业的有效负载发送到代理之前对其进行加密。 代理使用其私钥解密作业内容。 这是在与代理交换机密时存储在管道或变量组中的机密是如何保护的。

用于部署到目标服务器的通信

使用代理将项目部署到一组服务器时,它必须具有与这些服务器的“视线”连接。 Microsoft 托管的代理池默认与 Azure 中运行的 Azure 网站和服务器建立连接。

注意

如果 Azure 资源在 Azure 虚拟网络中运行,则可以获取部署 Microsoft 托管代理的代理 IP 范围,以便为 Azure VNet 配置防火墙规则以允许代理访问。

如果本地环境未连接到 Microsoft 托管代理池 (这通常是由于中间防火墙) ,则需要在本地计算机上手动配置自承载代理 () 。 代理必须连接到目标本地环境,并且有权访问 Internet 以连接到Azure Pipelines或Team Foundation Server,如下图所示。

Agent connectivity for on-premises environments

身份验证

若要注册代理,需要在代理池中成为 管理员角色 的成员。 代理池管理员的身份仅在注册时需要,并且不会保留在代理上,并且不会在代理与Azure Pipelines或Azure DevOps Server之间的任何后续通信中使用。 此外,你必须是服务器上的本地管理员才能配置代理。

代理可以使用以下方法向Azure Pipelines进行身份验证:

代理可以使用以下方法之一向Azure DevOps Server或 TFS 进行身份验证:

个人访问令牌 (PAT) :

生成并使用 PAT 将代理连接到 Azure Pipelines 或 TFS 2017 及更新。 PAT 是唯一适用于 Azure Pipelines 的方案。 PAT 必须具有 (读取的代理池、管理 部署组 代理的) 范围 (,PAT 必须具有 部署组 (读取、管理) 范围) ,而单个 PAT 可用于注册多个代理,则仅在注册代理时使用 PAT,而不用于后续 通信。 有关详细信息,请参阅 Windows、LinuxmacOS 自承载代理文章中的“使用个人访问令牌进行身份验证” (PAT) 部分。

若要将 PAT 与 Azure DevOps Server 配合使用,必须使用 HTTPS 配置服务器。 请参阅 网站设置和安全性

集成

使用登录用户的凭据通过 NTLM 或 Kerberos 等Windows 身份验证方案将Windows代理连接 TFS。

若要使用此方法进行身份验证,必须先配置 TFS 服务器。

  1. 登录到运行 TFS 的计算机。

  2. 启动 Internet 信息服务 (IIS) 管理器。 选择 TFS 站点,并确保使用有效的提供程序(如 NTLM 或 Kerberos)启用Windows身份验证。

IIS TFS windows authentication

IIS TFS windows authentication with ntlm provider

Negotiate

通过 NTLM 或 Kerberos 等Windows 身份验证方案,将 TFS 连接为非登录用户。

若要使用此方法进行身份验证,必须先配置 TFS 服务器。

  1. 登录到运行 TFS 的计算机。

  2. 启动 Internet 信息服务 (IIS) 管理器。 选择 TFS 站点,并确保使用协商提供程序启用Windows身份验证,并使用 NTLM 或 Kerberos 等其他方法启用身份验证。

IIS TFS windows authentication

IIS TFS windows authentication with negotiate and ntlm provider

备用

使用基本身份验证连接 TFS。 若要使用此方法,必须先 在 TFS 上配置 HTTPS

若要使用此方法进行身份验证,必须按如下所示配置 TFS 服务器:

  1. 登录到运行 TFS 的计算机。

  2. 配置基本身份验证。 请参阅使用基本身份验证针对 Team Foundation Server 2015 的 Usingtfx

交互式与服务

可以将自承载代理作为服务或交互式进程运行。 配置代理后,建议先在交互模式下尝试该代理,以确保它正常工作。 然后,出于生产用途,我们建议在以下模式之一中运行代理,以便它可靠地保持运行状态。 这些模式还可确保代理在重启计算机时自动启动。

  1. 即服务。 可以利用操作系统的服务管理器来管理代理的生命周期。 此外,当代理作为服务运行时,自动升级代理的体验会更好。

  2. 作为启用了自动登录的交互式进程。 在某些情况下,可能需要以交互方式运行代理以供生产使用,例如运行 UI 测试。 当代理配置为在此模式下运行时,屏幕保护程序也会被禁用。 某些域策略可能会阻止启用自动登录或禁用屏幕保护程序。 在这种情况下,可能需要从域策略中寻求豁免,或在应用域策略的工作组计算机上运行代理。

    注意

    启用自动登录或禁用屏幕保护程序时,存在安全风险,因为使其他用户能够访问计算机并使用自动登录的帐户。 如果将代理配置为按此方式运行,则必须确保计算机受到物理保护;例如,位于安全设施中。 如果使用远程桌面访问通过自动登录运行代理的计算机,只需关闭远程桌面即可锁定计算机,并且此代理上运行的任何 UI 测试都可能会失败。 若要避免这种情况,请使用 tscon 命令断开与远程桌面的连接。 例如:

    %windir%\System32\tscon.exe 1 /dest:console

代理帐户

无论是以服务的形式运行代理还是以交互方式运行代理,都可以选择用于运行代理的计算机帐户。 (请注意,这不同于在将代理注册到 Azure Pipelines 或 Azure DevOps Server.) 代理帐户时使用的凭据,具体取决于生成和部署作业中运行的任务的需求。

例如,若要运行使用Windows 身份验证访问外部服务的任务,必须使用有权访问该服务的帐户运行代理。 但是,如果要运行需要浏览器的 UI 测试(如 Selenium 或编码的 UI 测试),则会在代理帐户的上下文中启动浏览器。

在Windows,应考虑使用服务帐户,例如网络服务或本地服务。 这些帐户具有受限的权限,其密码不会过期,这意味着代理需要随时间推移管理较少。

代理版本和升级

我们会每隔几周更新一次代理软件,Azure Pipelines。 我们以格式 {major}.{minor}指示代理版本。 例如,如果代理版本为 2.1,则主版本为 2,次要版本为 1。

Microsoft 托管的代理始终保持最新状态。 如果代理的较新版本仅在次要版本中不同,则通常可以自动更新自承载代理, (在代理池中配置此设置,选择代理,设置 - 默认通过Azure Pipelines启用) 。 当管道中使用的平台功能或其中一项任务需要较新版本的代理时,请求升级。

如果以交互方式运行自承载代理,或者有较新的 版本的代理可用,则可能需要手动升级代理。 可以从组织下的 “代理池 ”选项卡轻松执行此操作。 管道在可以面向兼容的代理之前不会运行。

更新自承载代理

  1. 导航到Project设置代理池

    Project settings, Agent pools

  2. 选择代理池,然后选择 “更新所有代理”。

    Update all agents

    还可以通过从 ...菜单中选择“更新代理”来单独更新代理。

    Update agent

  3. 选择 “更新 ”以确认更新。

    Update all agents confirmation

  4. 池中的每个代理都会对更新请求排队,该代理在当前正在运行的任何作业完成时运行。 升级通常需要一些时间 - 足够长的时间下载最新版本的代理软件 (大约 200 MB) ,解压缩它,并使用新版本重启代理。 可以在 “代理 ”选项卡上监视代理的状态。

我们会使用 Azure DevOps Server 和 TFS 中的每个更新更新来更新代理软件。 我们以格式 {major}.{minor}指示代理版本。 例如,如果代理版本为 2.1,则主版本为 2,次要版本为 1。

当Azure DevOps Server或 TFS 服务器具有较新版本的代理,并且较新的代理在次要版本中仅不同时,它通常会自动升级。 当管道中使用的平台功能或其中一项任务需要较新版本的代理时,请求升级。 从 Azure DevOps Server 2019 开始,无需等待新的服务器版本。 可以将 新版本的代理上传到应用程序层,该版本将作为升级提供。

如果以交互方式运行代理,或者是否有较新的 版本的代理可用,则可能需要手动升级代理。 可以从项目集合下的 “代理池 ”选项卡轻松执行此操作。 管道在可以面向兼容的代理之前不会运行。

可以通过导航到 代理池 并选择所需代理的 “功能 ”选项卡来查看代理的版本,如 “配置代理功能”中所述。

若要以编程方式触发代理更新,可以使用代理更新 API,如本节中所述,如何以编程方式触发特定代理池的代理更新?

注意

对于无法访问 Internet 的服务器,请手动复制代理 zip 文件以 C:\ProgramData\Microsoft\Azure DevOps\Agents\ 用作本地文件。

常见问题解答

如何实现确保我具有最新的 v2 代理版本?

  1. 导航到 “代理池 ”选项卡:

    1. 选择“Azure DevOps组织设置

      Choose Organization settings.

    2. 选择 代理池

      Choose Agent pools tab.

    1. 选择“Azure DevOps”集合设置

      Choose Collection settings.

    2. 选择 代理池

      Choose Agent pools.

    1. 选择“Azure DevOps”集合设置

      Collection settings, 2019.

    2. 选择 代理池

      Choose Agent pools, 2019.

    1. 导航到项目并选择设置 (齿轮图标>) 代理队列

      Choose Settings, Agent Queues, 2018.

    2. 选择 “管理池”。

      Choose Manage pools, 2018.

  2. 单击包含代理的池。

  3. 确保已启用代理。

  4. 导航到“功能”选项卡:

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

      From Agent pools, select the desired agent pool.

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

      Select Agents and choose the agent.

    3. 选择 “功能 ”选项卡。

      Choose the Capabilities tab.

      注意

      Microsoft 托管的代理不显示系统功能。 有关在 Microsoft 托管代理上安装的软件的列表,请参阅 使用 Microsoft 托管的代理

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

      Select the desired pool.

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

      Select Agents and choose the desired agent.

    3. 选择 “功能 ”选项卡。

      Agent capabilities tab.

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

      Select the desired tab, 2019.

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

      Choose the desired agent, 2019.

    3. 选择 “功能 ”选项卡。

      Choose the Capabilities tab, 2019.

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

    Agent capabilities tab, 2018.

  5. 查找 Agent.Version 功能。 可以针对最新发布的代理版本检查此值。 请参阅Azure Pipelines代理并检查列出的最高版本号页面。

  6. 每个代理在运行需要较新版本代理的任务时自动更新自身。 如果要手动更新某些代理,请右键单击池,然后选择 “更新所有代理”。

是否可以更新属于Azure DevOps Server池的 v2 代理?

是。 从 Azure DevOps Server 2019 开始,可以将服务器配置为在本地磁盘上查找代理包文件。 此配置将替代服务器发布时附带的默认版本。 当服务器无权访问 Internet 时,此方案也适用。

  1. 从具有 Internet 访问权限的计算机,从 Azure Pipelines 代理GitHub发布页下载.zip或 .tar.gz) 表单 (最新版本的代理包文件。

  2. 通过使用所选 ((例如 USB 驱动器、网络传输等)的方法,将下载的包文件传输到每个Azure DevOps Server应用程序层) 。 将代理文件放在文件夹下 %ProgramData%\Microsoft\Azure DevOps\Agents

  3. 你已全部设置! 每当更新代理时,Azure DevOps Server都将使用本地文件。 每个代理在运行需要较新版本代理的任务时自动更新自身。 但是,如果要手动更新某些代理,请右键单击池,然后选择 “更新所有代理”。

自托管代理与 Microsoft 托管的代理相比是否有任何性能优势?

在许多情况下,有。 具体而言:

  • 如果使用自托管代理,则可运行增量生成。 例如,如果定义未清理存储库且不执行干净生成的管道,则生成通常会更快运行。 使用 Microsoft 托管的代理时,不会获得这些好处,因为生成或发布管道完成后会销毁代理。

  • Microsoft 托管的代理可能需要更长的时间来启动你的生成。 虽然作业通常需要几秒钟时间才能分配给 Microsoft 托管的代理,但有时可能需要几分钟时间才能分配代理,具体取决于系统上的负载。

能否在同一台计算机上安装多个自托管代理?

是。 此方法适用于运行不占用许多共享资源的作业的代理。 例如,如果代理运行的发布主要用于协调部署,并且不会在代理本身上执行太多操作,则可尝试使用该方法。

你可能会发现,在其他情况下,通过在同一台计算机上运行多个代理,你不会获得很大的效率。 例如,运行消耗大量磁盘和 I/O 资源的生成的代理可能不值得。

如果并行生成作业使用相同的单一实例工具部署(例如 npm 包),则也可能遇到问题。 例如,一个生成可能会更新某个依赖项,而另一个生成正在使用该依赖项,这可能会导致结果不可靠并出现错误。

取消管道作业时代理的行为是什么?

对于 Microsoft 托管的代理,代理将被拆毁并返回到Azure Pipelines池。

对于自承载代理:

取消管道后,代理会将一系列命令发送到执行当前步骤的进程。 第一个命令的发送超时为 7.5 秒。 如果进程尚未终止,则会发送第二个命令,超时为 2.5 秒。 如果进程尚未终止,代理会发出命令来终止进程。 如果进程不遵循这两个初始终止请求,则会终止该请求。 从初始请求到终止大约需要 10 秒。

针对进程发出的命令因代理操作系统而异。

  • macOS 和 Linux - 发送的命令为 SIGINT,后跟 SIGTERM,后跟 SIGKILL。
  • Windows - 发送到进程的命令为 Ctrl+C,后跟 Ctrl+Break,后跟 Process.Kill。

如何以编程方式触发特定代理池的代理更新?

可以使用下一个 API 触发池的代理更新:

POST https://dev.azure.com/{organization}/_apis/distributedtask/pools/{poolId}/messages?agentId={agentId}&api-version=6.0

URI 参数

名称 必需 类型 描述
agentId query 错误 string 要更新的代理。 如果未指定 -将为所有代理触发更新。
organization path True 字符串 Azure DevOps 组织的名称。
poolId path True 整数 (int32) 要使用的代理池
api-version query 错误 string 要使用的 API 版本。 这应设置为“6.0”以使用此版本的 API。

若要触发代理更新 - 请求正文应为空。

注意

GitHub上开放源代码代理Azure Pipelines。

了解更多

有关代理的详细信息,请参阅生成应用程序中的以下模块,其中包含Azure DevOps学习路径。