Azure DevOps:流水线无法使用来自构件的 NuGet 包

3
我正在尝试以多种方式使用Azure DevOps Server 2019(原名TFS)项目,包括:
  • 使用 Repos 功能来保存代码,
  • 使用 Artifacts 功能添加一些私有包,
  • 使用 Pipelines 功能进行CI(主要是从代码中拉取软件包,构建并发布到暂存服务器)。

(这种整合显然是整个过程的重点。)

我的流水线有一个.NET Core Restore步骤,其中 Path to NuGet.config 设置为存储库内部自定义配置。 到目前为止还不错。

该配置如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <clear />

    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
    <add key="(some private server)" value="http://nuget.example/NuGet" /> <!-- (this one works fine!) -->
    <add key="(the actual private feed in question)" value="https://azure-devops.example/MyCollection/_packaging/MyProject/nuget/v3/index.json" />
  </packageSources>
</configuration>

在构建日志中,我看到该配置得到了尊重,即上述三个来源都被使用。然而,第三个来源由于错误而失败:
         NuGet.Protocol.Core.Types.FatalProtocolException: Unable to load the service index for source https://azure-devops.example/MyCollection/_packaging/MyProject/nuget/v3/index.json.
          ---> System.ComponentModel.Win32Exception (0x8009030E): No credentials are available in the security package.
            at System.Net.NTAuthentication.GetOutgoingBlob(Byte[] incomingBlob, Boolean throwOnError, SecurityStatusPal& statusCode)
            at System.Net.NTAuthentication.GetOutgoingBlob(String incomingBlob)
            at System.Net.Http.AuthenticationHelper.SendWithNtAuthAsync(HttpRequestMessage request, Uri authUri, ICredentials credentials, Boolean isProxyAuth, HttpConnection connection, HttpConnectionPool connectionPool, CancellationToken cancellationToken)
            at System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection connection, HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
            at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
            at System.Net.Http.AuthenticationHelper.SendWithAuthAsync(HttpRequestMessage request, Uri authUri, ICredentials credentials, Boolean preAuthenticate, Boolean isProxyAuth, Boolean doRequestAuth, HttpConnectionPool pool, CancellationToken cancellationToken)
            at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            at NuGet.Protocol.ServerWarningLogHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            at NuGet.Protocol.HttpSourceAuthenticationHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
            at NuGet.Protocol.TimeoutUtility.StartWithTimeout[T](Func`2 getTask, TimeSpan timeout, String timeoutMessage, CancellationToken token)
            at NuGet.Protocol.HttpRetryHandler.SendAsync(HttpRetryHandlerRequest request, ILogger log, CancellationToken cancellationToken)
            at NuGet.Protocol.HttpSource.GetThrottledResponse(Func`1 requestFactory, TimeSpan requestTimeout, TimeSpan downloadTimeout, Int32 maxTries, Guid sessionId, ILogger log, CancellationToken cancellationToken)
            at NuGet.Protocol.HttpSource.<>c__DisplayClass14_0`1.<<GetAsync>b__0>d.MoveNext()

看起来像是某些认证问题,但它似乎实际上并没有尝试进行认证。

我已经排除了可能的原因:

  • 生成代理在其自己的用户tfsbuildagent下运行。我已明确将其添加为feed权限的贡献者(即使只读取也足够了)。
  • 我已将其从本地用户更改为活动目录域中的用户,以防本地用户无法正常工作。
  • 我已升级从2019到2019.1.1,以防它是一个错误。
  • 我已尝试向用于组织/集合外部源的凭据字段添加服务连接。 但是,此源并不在外部。 它就是同一项目!

我猜我需要告诉它如何进行身份验证(只需使用当前Windows凭据),但我无法根据异常辨别它实际上正在尝试和失败的是什么。


以为可能是代理版本(在2.131.0),但在2.165.1中没有任何区别。 - Sören Kuklau
看起来答案应该是NuGetAuthenticate任务,但这在“本地”TFS中实际上不可用。所以目前这不是一个受支持的场景? - Sören Kuklau
1个回答

2
看起来在Azure DevOps Server 2019中,dotnet restore任务出现了问题。在github/azure-pipelines-tasks上仍有一个未解决的问题。 解决方法:您可以使用命令行任务直接调用dotnet/nuget(最新的nuget.exe)cli来为您的解决方案还原nuget包。(在构建服务器上,在在Azure Devops Server中执行此操作之前,请成功还原这些包)
更多详细信息和可用的解决方法,您可以参考这位微软工程师的建议

我看到了,我猜DotNetAuthenticate被重命名为NuGetAuthenticate(而且还没有在本地部署中发布)?无论如何,谢谢——我首先尝试了切换到NuGet任务的变体,但是以其他方式失败了。相反,我已经采用了一个命令行任务,只需调用dotnet restore——这似乎可以自动正确地完成所有事情。 - Sören Kuklau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接