TFS 生成代理无法连接到程序包源

TFS Build Agent Can't Connect to Package Feed

关于我们设置的一些信息:

所以这已经工作了几个月(新的部分是我们自己开发的 NuGet 包的包提要)。在使用我们的构建服务器的 MVC 项目中,NuGet 还原任务在尝试连接到我们的包提要时失败。失败时,消息为:

http://TFS_URL:8080/tfs/Development/_packaging/CustomNuGetFeed/nuget/v3/index.json: Unable to load the service index for source http://TFS_URL:8080/tfs/Development/_packaging/CustomNuGetFeed/nuget/v3/index.json.
Response status code does not indicate success: 401 (Unauthorized).

这就是构建日志吐出的所有信息;我深入研究并启动 WireShark 并得到以下信息:

请求

GET /tfs/Development/_packaging/CustomNuGetFeed/nuget/v3/index.json HTTP/1.1
user-agent: NuGet Command Line/4.4.1 (Microsoft Windows NT 6.2.9200.0)
X-NuGet-Client-Version: 4.4.1
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Authorization: Basic <base64_token>
Host: tfs:8080

回应

HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/8.5
X-TFS-ProcessId: d9a45aba-cc82-4f2c-98a3-e4441bfa456f
ActivityId: e780f2d6-1216-46ac-8c66-cb89379c7811
X-TFS-Session: e780f2d6-1216-46ac-8c66-cb89379c7811
X-VSS-E2EID: e780f2d6-1216-46ac-8c66-cb89379c7811
X-FRAME-OPTIONS: SAMEORIGIN
WWW-Authenticate: Bearer
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic realm="tfs"
X-Powered-By: ASP.NET
P3P: CP="CAO DSP COR ADMa DEV CONo TELo CUR PSA PSD TAI IVDo OUR SAMi BUS DEM NAV STA UNI COM INT PHY ONL FIN PUR LOC CNT"
Lfs-Authenticate: NTLM
X-Content-Type-Options: nosniff
Date: Tue, 16 Oct 2018 19:57:17 GMT
Content-Length: 1293

响应页面消息

401 - Unauthorized: Access is denied due to invalid credentials.
You do not have permission to view this directory or page using the credentials that you supplied.

但是,据我所知,有一个 .NET Core 应用程序仍然可以很好地恢复包(除非它只是从缓存中检索包)。

服务帐户的凭据根本没有更改。根据这些文档,我已确保服务帐户可以访问提要:https://docs.microsoft.com/en-us/azure/devops/artifacts/feeds/feed-permissions?view=vsts&tabs=previous-nav

我还尝试在 IIS 中为 TFS 服务器上的 TFS 站点禁用基本身份验证,并启用 Windows 身份验证。两者都不起作用。

因此,我对 tried/looked 所涉及的所有问题可能是什么一无所知。

TL;DR; nuget 太老了。更新它有帮助。

我们在 Windows 2019 年为 TFS 2018 设置新的构建代理机器后遇到了同样的问题。但是,我们没有使用 wireshark 检查流量,所以这可能是无关的。但症状相同:一种解决方案有效(使用 paket),其他 无效(使用 nuget)。

问题是 other 解决方案使用了来自已提交的第三方目录的 nuget(版本 2.x)。 Nuget 旨在使用来自 %localappdata%\nuget 的 'global' nuget(如果可用)。那个全球 nuget 版本不存在。以构建代理用户身份更新 nuget 解决了该问题,并将最新的 nuget 版本放入 %localappdata%:

nuget.exe update -self

我认为 TFS 2018 需要 NTLM 身份验证而不是基本身份验证(TFS 2017 似乎仍然支持)。安装的 VS 2017.9.5 没有更新 nuget 仍然让我觉得很奇怪。

即使在升级到 Azure DevOps Server 2019.0.1 之后,我在尝试对托管在同一集合中的包源进行身份验证时仍然收到 401 Unauthorized。

解决方法

我使用的解决方法是将包二进制文件放入构建服务器的包缓存文件夹中,该文件夹位于此处: C:\用户\.nuget\packages

工作解决方案

不过,在 Microsoft 的 VS 社区的帮助下找到了解决方案。更新的 cred 提供程序需要与 NuGet 还原任务一起使用。

需要使用 Nuget 4.8+ 才能工作,然后需要将 2 个构建变量添加到构建定义中: NuGet_ForceEnableCredentialProviderV2 = 真 NuGet.ForceEnableCredentialProvider = 假

根据 Microsoft 代表的说法,这将在 ADOS 2019.1 更新中默认启用。

您可以在此处查看完整主题: https://developercommunity.visualstudio.com/content/problem/360323/tfs-build-agent-cant-connect-to-package-feed.html