Microsoft 托管代理

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

Microsoft 托管的代理仅适用于云中托管的 Azure DevOps Services。 不能将 Microsoft 托管的代理或 Azure Pipelines 代理池与本地 TFS 或Azure DevOps Server配合使用。 使用这些本地版本时,必须使用 自承载代理

重要

从 Azure DevOps 内容版本选择器中选择一个版本。

若要查看可用于你的平台的内容,请确保从目录上方的版本选择器中选择本文的正确版本。 功能支持会有所不同,具体取决于你使用的是 Azure DevOps Services 还是本地版本的 Azure DevOps Server(之前称为 Team Foundation Server (TFS))。
若要了解正在使用哪个本地版本,请查看我使用的是哪个平台/版本?

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

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

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

提示

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

软件

Azure Pipelines 代理池提供了多个虚拟机映像可供选择,每个映像包括各种工具和软件。

映像 经典编辑器代理规范 YAML VM 映像标签 包含的软件
带 Visual Studio 2022 的 Windows Server 2022 windows-2022 windows-latestwindows-2022 链接
带 Visual Studio 2019 的 Windows Server 2019 windows-2019 windows-2019 链接
Ubuntu 22.04 预览版 ubuntu-22.04 ubuntu-22.04 链接
Ubuntu 20.04 ubuntu-20.04 ubuntu-latestubuntu-20.04 链接
Ubuntu 18.04 ubuntu-18.04 ubuntu-18.04 链接
macOS 12 Monterey macOS-12 macOS-12 链接
macOS 11 Big Sur macOS-11 macOS-latestmacOS-11 链接
macOS X Catalina 10.15 macOS-10.15 macOS-10.15 链接

经典生成管道的默认代理映像为 windows-2019,YAML 生成管道的默认代理映像为 ubuntu-latest。 有关详细信息,请参阅 指定管道中的池

通过选择表中 的“包含的软件 ”链接,可以查看每个托管代理的已安装软件。 使用 macOS 映像时,可以从工具版本手动选择。 请参阅下面的内容

注意

windows-latest 工作流将使用 windows-2022

macOS-latest 工作流将使用 macOS-11

Ubuntu 16.04 托管映像已删除 2021 年 9 月

Visual Studio 2017 映像的Windows Server 2016已弃用,将于 2022 年 6 月 30 日停用。 阅读 此博客文章 ,了解如何使用已弃用映像标识管道。

2021 年 12 月,我们删除了以下 Azure Pipelines 托管映像:

  • macOS X Mojave 10.14 () macOS-10.14

2020 年 3 月,我们删除了以下 Azure Pipelines 托管映像:

  • Windows Server 2012R2 与 Visual Studio 2015 () vs2015-win2012r2
  • macOS X High Sierra 10.13 () macOS-10.13
  • Windows Server Core 1803 (win1803)

建议客户迁移到较新版本或 自承载代理

有关如何更新使用这些映像的管道的详细信息和说明,请参阅 删除 Azure Pipelines 托管池中的旧映像

注意

Azure Pipelines 托管池将替换以前托管的池,这些池的名称映射到相应的映像。 以前托管池中的任何作业都会自动重定向到新的 Azure Pipelines 托管池中的正确映像。 在某些情况下,你仍可能会看到旧的池名称,但在后台,托管作业使用 Azure Pipelines 池运行。 有关此更新的详细信息,请参阅 2019 年 7 月 1 日 - Sprint 154 发行说明中的单个托管池发行说明。

重要

若要请求在 Microsoft 托管的代理上安装的其他软件,请不要在此文档上创建反馈请求或打开支持票证。 相反,请在 存储库上提出问题,在其中管理脚本以生成各种映像。

使用 Microsoft 托管的代理

在 YAML 管道中,如果未指定池,管道将默认为 Azure Pipelines 代理池。 只需指定要使用的虚拟机映像。

jobs:
- job: Linux
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: echo hello from Linux
- job: macOS
  pool:
    vmImage: 'macOS-latest'
  steps:
  - script: echo hello from macOS
- job: Windows
  pool:
    vmImage: 'windows-latest'
  steps:
  - script: echo hello from Windows

注意

池的规范可以在 YAML 文件中的多个级别完成。 如果注意到管道未在预期的映像上运行,请确保在管道、阶段和作业级别验证池规范。

避免硬编码引用

使用 Microsoft 托管代理时,请始终使用 变量 来引用生成环境和代理资源。 例如,不要对包含存储库的驱动器号或文件夹进行硬编码。 托管代理的精确布局可能会更改,而不会发出警告。

硬件

运行 Windows 和 Linux 映像的 Microsoft 托管代理在具有 2 核 CPU、7 GB RAM 和 14 GB SSD 磁盘空间的 Azure 常规用途虚拟机上预配。 这些虚拟机与 Azure DevOps 组织位于同一地理位置。

在 Mac 专业人员上预配运行 macOS 映像的代理,其核心 CPU 为 14 GB、14 GB RAM 和 14 GB SSD 磁盘空间。 无论 Azure DevOps 组织的位置如何,这些代理始终在美国运行。 如果数据主权对你很重要,如果你的组织不在美国,则不应使用 macOS 映像。 了解详细信息

所有这些计算机至少有 10 GB 可用磁盘空间,可供管道运行。 当管道签出源代码、下载包、拉取 docker 映像或生成中间文件时,将使用此可用空间。

重要

我们不能遵循请求来增加 Microsoft 托管代理上的磁盘空间,也不能预配更强大的计算机。 如果 Microsoft 托管代理的规范不符合你的需求,则应考虑 自承载代理规模集代理

网络

在某些设置中,可能需要知道部署代理的 IP 地址范围。 例如,如果需要通过防火墙授予托管代理访问权限,可能需要通过 IP 地址限制该访问。 由于 Azure DevOps 使用 Azure 全球网络,因此 IP 范围因时间而异。 我们每周发布一个 JSON 文件 ,列出 Azure 数据中心的 IP 范围,按区域划分。 此文件每周更新一次,其中包含新的计划 IP 范围。 新的 IP 范围在下周生效。 建议每周至少检查一次 () ,以确保保持最新列表。 如果代理作业开始失败,第一个故障排除步骤是确保配置与最新的 IP 地址列表匹配。 托管代理的 IP 地址范围列在每周文件中 AzureCloud.<region>,例如 AzureCloud.westus 美国西部区域。

托管代理在组织的同一 Azure 地理位置 运行。 每个地理位置都包含一个或多个区域。 虽然代理可能与组织在同一区域中运行,但不能保证这样做。 若要获取代理可能 IP 范围的完整列表,必须使用地理位置中包含的所有区域的 IP 范围。 例如,如果你的组织位于美国地理位置,则必须在该地理位置中的所有区域使用 IP 范围。

若要确定地理位置,请导航到 https://dev.azure.com/<your_organization>/_settings/organizationOverview、获取区域,并从 Azure 地理 表中查找关联的地理位置。 确定地理位置后,请针对该地理位置中的所有区域使用 每周文件中 的 IP 范围。

重要

不能使用 ExpressRoute 或 VPN 等专用连接将 Microsoft 托管的代理连接到企业网络。 Microsoft 托管代理与服务器之间的流量将通过公用网络进行。

标识 Microsoft 托管代理的可能 IP 范围

  1. “组织”设置中标识组织的区域
  2. 确定组织的区域的 Azure Geography
  3. 将地理位置中区域的名称映射到每周文件中使用的格式, AzureCloud.<region>格式如下 AzureCloud.westus。 可以通过从适用于 .NET 的 Azure 管理库查看传递到区域类源代码中定义的区域的构造函数的区域名称,将 Azure Geography 列表中的区域名称映射到每周文件中使用的格式。

    注意

    由于 .NET 的 Azure 管理库 中没有用于列出地理区域的 API,因此必须手动列出它们,如以下示例所示。

  4. 每周文件检索地理位置中所有区域的 IP 地址。 如果区域是 巴西南部西欧,则必须根据回退地理位置包含其他 IP 范围,如以下说明中所述。

注意

由于容量限制, 巴西南部西欧 区域的某些组织偶尔可能会看到其托管的代理位于预期地理位置之外。 在这些情况下,除了包括地理区域的所有区域的 IP 范围,如上一部分所述,还必须为容量回退地理位置中的区域包含其他 IP 范围。

如果组织位于巴西南部区域,则容量回退地理位置美国

如果你的组织位于 西欧 区域,则容量回退地理位置为 法国

我们的 Mac IP 范围不包括在上面的 Azure IP 中,因为它们托管在 GitHub 的 macOS 云中。 可以使用此处提供的说明使用 GitHub 元数据 API 检索 IP 范围。

示例

在以下示例中,从每周文件中检索美国西部区域中组织的托管代理 IP 地址范围。 由于美国西部区域位于美国地理区域,因此包括美国地理位置中所有区域的 IP 地址。 在此示例中,IP 地址将写入控制台。

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace WeeklyFileIPRanges
{
    class Program
    {
        // Path to the locally saved weekly file
        const string weeklyFilePath = @"C:\MyPath\ServiceTags_Public_20210823.json";

        static void Main(string[] args)
        {
            // United States geography has the following regions:
            // Central US, East US, East US 2, North Central US, 
            // South Central US, West Central US, West US, West US 2
            // This list is accurate as of 8/26/2021
            List<string> USGeographyRegions = new List<string>
            {
                "centralus",
                "eastus",
                "eastus2",
                "northcentralus",
                "southcentralus",
                "westcentralus",
                "westus",
                "westus2"
            };

            // Load the weekly file
            JObject weeklyFile = JObject.Parse(File.ReadAllText(weeklyFilePath));
            JArray values = (JArray)weeklyFile["values"];

            foreach (string region in USGeographyRegions)
            {
                string azureCloudRegion = $"AzureCloud.{region}";
                Console.WriteLine(azureCloudRegion);

                var ipList =
                    from v in values
                    where (string)v["name"] == azureCloudRegion
                    select v["properties"]["addressPrefixes"];

                foreach (var ip in ipList.Children())
                {
                    Console.WriteLine(ip);
                }
            }
        }
    }
}

服务标记

服务标记无法列出 Microsoft 托管的代理。 如果尝试向托管代理授予对资源的访问权限,则需要遵循 IP 范围允许列表方法。

安全性

Microsoft 托管的代理在安全的 Azure 平台上运行。 但是,必须注意以下安全注意事项。

  • 尽管 Microsoft 托管的代理在 Azure 公共网络上运行,但它们未分配公共 IP 地址。 因此,外部实体不能面向 Microsoft 托管的代理。
  • Microsoft 托管的代理在单个 VM 中运行,每次运行后都会重新映像。 每个代理专用于单个组织,每个 VM 仅托管一个代理。
  • 从安全的角度来看,在 Microsoft 托管代理上运行管道有几种好处。 如果在管道中运行不受信任的代码(例如分叉的贡献),那么在 Microsoft 托管代理上运行管道比驻留在企业网络中自承载代理更安全。
  • 当管道需要访问防火墙后面的公司资源时,必须允许 Azure 地理位置的 IP 地址范围。 这会增加你的曝光率,因为 IP 地址范围相当大,因为此范围内的计算机也可以属于其他客户。 防止这种情况的最佳方法是避免需要访问内部资源。
  • 托管映像不符合 CIS 强化基准。 若要使用 CIS 强化的映像,必须创建自承载代理或规模集代理。

功能和限制

Microsoft 托管的代理:

  • 具有 上述软件。 还可以使用 工具安装程序任务在生成或发布期间添加软件。
    • 为管道中的每个作业获取全新映像代理。
  • 为源和生成输出提供 10 GB 的存储。
  • 提供免费层:
    • 公共项目:10 个免费的 Microsoft 托管并行作业,每次最多可以运行 360 分钟, (6 小时) ,每月没有总时间限制。 请与我们联系 ,获取提高免费层限制。
    • 专用项目:一个免费并行作业,每次最多可以运行 60 分钟,直到每月使用 1,800 分钟 (30 小时) 。 你可以为每个并行作业的额外容量付费。 付费并行作业将移除每月时间限制,并允许你运行每个作业最多 360 分钟(6 小时)。 购买 Microsoft 托管的并行作业
    • 创建新的 Azure DevOps 组织时,默认情况下不会授予这些免费授权。 若要请求公共或专用项目的免费授予,请提交 请求
  • 在 Microsoft Azure 常规用途虚拟机 上运行Standard_DS2_v2
  • 在 Windows 上以管理员身份运行,在 Linux 上以无密码 sudo 用户身份运行
  • (Linux 仅) 运行 cgroup 提供 6 GB 物理内存和 13 GB 总内存的步骤

Microsoft 托管的代理不提供:

  • 远程连接的功能。
  • 项目删除到 UNC 文件共享的功能。
  • 将计算机直接加入企业网络的功能。
  • 能够获取更大或更强大的生成计算机。
  • 预加载自定义软件的功能。 可以在管道运行期间安装软件,例如通过 工具安装程序任务 或在脚本中安装软件。
  • 使用可更快地启动和运行生成的自承载代理,可能获得的潜在性能优势。 了解详细信息
  • 能够运行 XAML 生成

如果 Microsoft 托管的代理不符合你的需求,则可以部署自己的 自承载代理 或使用 规模集代理

常见问题解答

如何查看映像中包含的软件?

可以通过在软件表中选择“包含的软件”链接来查看每个托管代理的已安装软件。

Microsoft 如何选择要放入映像的软件和版本?

有关映像中包含的软件版本的详细信息,请参阅 安装内容指南

映像何时更新?

图像通常每周更新一次。 可以检查 状态锁屏提醒 ,其格式 20200113.x 为第一部分指示图像更新的日期。

如果需要的软件被删除或替换为较新版本,该怎么办?

可以通过在“使用 Microsoft 托管代理”表中选择“包含的软件”链接来告知我们。

还可以使用包含所需软件确切版本的自承载代理。 有关详细信息,请参阅 自承载代理

如果需要具有更多处理能力、内存或磁盘空间的更大计算机,该怎么办?

我们无法增加 Microsoft 托管代理的内存、处理能力或磁盘空间,但你可以使用具有所需规范的计算机上托管的 自承载代理规模集代理

我无法选择 Microsoft 托管的代理,无法对生成或部署进行排队。 应采取何种操作?

Microsoft 托管的代理仅在 Azure Pipelines 中可用,不适用于 TFS 或 Azure DevOps Server。

默认情况下,组织中的所有项目参与者都有权访问 Microsoft 托管的代理。 但是,组织管理员可能会限制 Microsoft 托管代理的访问,以选择用户或项目。 要求 Azure DevOps 组织的所有者授予使用 Microsoft 托管代理的权限。 请参阅 代理池安全性

在 Microsoft 托管代理上运行的管道需要更多时间才能完成。 如何加快速度?

如果管道最近变慢,请查看 状态页 了解任何中断。 我们可能有服务问题。 否则,请查看在应用程序代码或管道中所做的任何更改。 签出期间的存储库大小可能已增加,可能会上传更大的项目,或者可能运行更多测试。

如果只是设置管道并将 Microsoft 托管代理的性能与本地计算机或自承载代理进行比较,请记下用于运行作业的硬件 规格 。 我们无法为你提供更大的或强大的计算机。 如果无法接受此性能,则可以考虑使用 自承载代理规模集代理

我需要更多的代理。 我该怎么办?

所有 Azure DevOps 组织都为开源项目提供了多个免费并行作业,每个月为专用项目提供一个免费的并行作业和有限的分钟数。 如果需要为开源项目额外执行几分钟或并行作业,请联系 支持人员。 如果需要为专用项目额外执行几分钟或并行作业,可以 购买更多作业。

我的管道在自承载代理上成功,但在 Microsoft 托管的代理上失败。 应采取何种操作?

自承载代理可能安装了所有正确的依赖项,而 Microsoft 托管代理上未安装相同的依赖项、工具和软件。 首先,按照上表中包含的软件的链接,仔细查看 Microsoft 托管代理上安装 的软件 列表。 然后,将此与安装在自承载代理上的软件进行比较。 在某些情况下,Microsoft 托管的代理可能具有所需的工具 (,例如 Visual Studio) ,但可能尚未安装所有必要的可选组件。 如果发现差异,则有两个选项:

  • 可以在存储库上创建新问题,在此 存储库中跟踪对其他软件的请求。 联系支持人员将帮助你在 Microsoft 托管的代理上设置新软件。

  • 可以使用 自承载代理规模集代理。 使用这些代理,可以完全控制用于运行管道的映像。

我的内部版本在本地计算机上成功,但在 Microsoft 托管的代理上失败。 应采取何种操作?

本地计算机可能安装了所有正确的依赖项,而 Microsoft 托管代理上未安装相同的依赖项、工具和软件。 首先,按照上表中包含的软件的链接,仔细查看 Microsoft 托管代理上安装 的软件 列表。 然后,将此与在本地计算机上安装的软件进行比较。 在某些情况下,Microsoft 托管的代理可能具有所需的工具 (,例如 Visual Studio) ,但可能尚未安装所有必要的可选组件。 如果发现差异,则有两个选项:

  • 可以在存储库上创建新问题,在此 存储库中跟踪对其他软件的请求。 这是安装新软件的最佳选择。 联系支持人员将帮助你在 Microsoft 托管的代理上设置新软件。

  • 可以使用 自承载代理规模集代理。 使用这些代理,可以完全控制用于运行管道的映像。

我的管道失败,并出现错误:“设备上没有留下空间”。

Microsoft 托管的代理仅有 10 GB 的磁盘空间可用于运行作业。 签出源代码、下载包、下载 docker 映像或生成中间文件时,将使用此空间。 遗憾的是,我们无法增加 Microsoft 托管映像上可用的可用空间。 可以重构管道,使其适合此空间。 或者,可以考虑使用 自承载代理规模集代理

在 Microsoft 托管代理上运行的管道需要访问公司网络上的服务器。 如何获取防火墙中允许的 IP 地址列表?

请参阅“代理 IP 范围”部分

在 Microsoft 托管代理上运行的管道无法解析公司网络上的服务器的名称。 如何解决此问题?

如果按其 DNS 名称引用服务器,请确保服务器通过其 DNS 名称在 Internet 上公开访问。 如果按其 IP 地址引用服务器,请确保在 Internet 上公开访问该 IP 地址。 在这两种情况下,请确保代理与企业网络之间的任何防火墙都允许 代理 IP 范围

我从 Azure 存储帐户收到 SAS IP 授权错误

如果收到 SAS 错误代码,很可能是因为由于 Azure 存储规则不允许来自 Microsoft 托管代理的 IP 地址范围。 有一些解决方法:

  1. 管理 Azure 存储帐户的 IP 网络规则 ,并为 托管代理添加 IP 地址范围
  2. 在管道中,在访问存储之前,使用 Azure CLI 更新 Azure 存储帐户的网络规则集 ,然后还原以前的规则集。
  3. 使用 自承载代理规模集代理

如何在托管 macOS 代理上手动选择工具版本?

Xamarin

托管的 macOS 代理将 Xamarin SDK 版本和关联的 Mono 版本存储为一组符号链接,以单个捆绑符号链接提供的 Xamarin SDK 位置。

若要手动选择要在 托管 macOS 代理上使用的 Xamarin SDK 版本,请在 Xamarin 生成任务作为生成的一部分执行以下 bash 命令,指定所需的 Xamarin 版本捆绑包的符号链接。

/bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh <symlink>"

可以在代理文档中找到所有可用的 Xamarin SDK 版本和符号链接的列表:

此命令不会选择 Xamarin SDK 以外的 Mono 版本。 若要手动选择 Mono 版本,请参阅以下说明。

如果使用非默认版本的 Xcode 生成 Xamarin.iOS 或 Xamarin.Mac 应用,则应另外执行以下命令行:

/bin/bash -c "echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'$(xcodeRoot);sudo xcode-select --switch $(xcodeRoot)/Contents/Developer"

where $(xcodeRoot) = /Applications/Xcode_13.2.app

可在此处找到托管 macOS 代理池上的 Xcode 版本。

Xcode

如果使用 Azure Pipelines 和 TFS 附带的 Xcode 任务 ,则可以在该任务的属性中选择 Xcode 的版本。 否则,若要在生成任务之前xcodebuild手动将 Xcode 版本设置为在托管 macOS 代理池上使用,请在生成过程中执行此命令行,根据需要替换 Xcode 版本号 13.2:

/bin/bash -c "sudo xcode-select -s /Applications/Xcode_13.2.app/Contents/Developer"

可在此处找到托管 macOS 代理池上的 Xcode 版本。

此命令不适用于 Xamarin 应用。 若要手动选择用于生成 Xamarin 应用的 Xcode 版本,请参阅上面的说明。

Mono

若要在 托管 macOS 代理池上手动选择要使用的 Mono 版本,请在 Mono 生成任务之前在每个生成作业中执行此脚本,指定具有所需 Mono 版本 (列表的 Xamarin 部分) :

SYMLINK=<symlink>
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
echo "##vso[task.setvariable variable=DYLD_FALLBACK_LIBRARY_PATH;]$MONOPREFIX/lib:/lib:/usr/lib:$DYLD_LIBRARY_FALLBACK_PATH"
echo "##vso[task.setvariable variable=PKG_CONFIG_PATH;]$MONOPREFIX/lib/pkgconfig:$MONOPREFIX/share/pkgconfig:$PKG_CONFIG_PATH"
echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH"

视频