【问题标题】:TFS Build Agent Can't Connect to Package FeedTFS 构建代理无法连接到包源
【发布时间】:2019-03-21 12:18:51
【问题描述】:

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

  • 本地 TFS 2018 更新 2(作为域服务帐户 A 运行)
  • 独立的 Win2k16 VM 托管构建代理(使用域服务帐户 B 运行代理)
  • 托管在 TFS 上的集合中的包源

所以这已经工作了几个月(新的部分是我们自己开发的 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 身份验证。两者都不起作用。

所以我不知道问题可能来自我尝试/调查的所有内容。

【问题讨论】:

  • 根据报错信息401 - Unauthorized,应该是权限问题,需要仔细检查权限设置...
  • @AndyLi-MSFT 权限“似乎”在某些方面是正确的,因为我可以使用 Build Agent 作为服务帐户远程进入 VM,打开浏览器,然后导航到 Package Feed没有错误。但是,尝试在虚拟机本身上运行“nuget restore”,也会出错(它只说“找不到版本包”)。通过 Visual Studio 恢复工作正常。

标签: tfs nuget azure-devops authorization tfsbuild


【解决方案1】:

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

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

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

nuget.exe update -self

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

【讨论】:

  • “全局”nuget 版本是“agent\externals\nuget”目录中的那个吗?
  • 好问题,告诉我我错了。 “全局”nuget 对我来说不存在,但 3rdparty 文件夹中的版本是旧的(2.8.x)。 'nuget.exe update -self' 实际上是从 nuget.org 获取当前版本 (4.9.x) 并将其放入 %localappdata%\nuget 文件夹中。
【解决方案2】:

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

解决方法

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

工作解决方案

但是,在 Microsoft 的 VS 社区的帮助下找到了解决方案。 NuGet 还原任务需要使用更新的凭据提供程序。

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

据微软代表称,这将在 ADOS 2019.1 更新中默认启用。

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

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2011-02-18
    • 2018-04-08
    • 2017-07-04
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多