【问题标题】:Azure DevOps: pipeline can't use NuGet package from artifactAzure DevOps:管道无法使用来自工件的 NuGet 包
【发布时间】:2020-03-03 18:53:12
【问题描述】:

我正在尝试以多种方式使用 Azure DevOps Server 2019 (née TFS) 项目:

  • Repos 功能保留代码,
  • Artifacts 功能可添加一些私有包,
  • Pipelines 功能来执行 CI(主要只是拉包、从代码构建、发布到暂存服务器)

(大概这种整合才是重点。)

我的管道有一个 .NET Core 恢复 步骤,其中 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 permissions 作为贡献者(尽管读者可能已经足够了)。
  • 我已将其从本地用户更改为 Active Directory 域中的用户,以防本地用户无法正常工作。
  • 我已经从 2019 升级到 2019.1.1,以免它是一个错误。
  • 我已尝试将服务连接添加到 此组织/集合之外的订阅源的凭据 字段。但是这个提要不在外面。这是同一个项目!

我的猜测是我需要告诉它如何进行身份验证(只需使用当前的 Windows 凭据),但我无法从异常中找出它甚至尝试和失败的原因。

【问题讨论】:

  • 以为可能是代理版本(2.131.0),但2.165.1没有区别。
  • 看起来答案是 supposedNuGetAuthenticate task,但这实际上在“本地”TFS 中不可用。所以这……目前不是受支持的场景吗?

标签: azure-devops nuget


【解决方案1】:

Azure DevOps Server 2019 中的 dotnet restore 任务似乎有问题。这仍然是 github/azure-pipelines-tasks 中的一个未解决问题。

解决方法:您可以使用命令行任务直接调用 dotnet/nuget(latest nuget.exe) cli 来为您的解决方案恢复 nuget 包。 (在您的构建服务器中,在 Azure Devops Server 中成功还原这些包之前)

更多详细信息和更多可用的解决方法,您可以参考此 Microsoft 工程师的suggestions

【讨论】:

  • 我看到了,我猜 DotNetAuthenticate 已重命名为 NuGetAuthenticate(并且还没有为内部部署发货)?无论如何,谢谢 — 我首先尝试了切换到 NuGet 任务的变体,但在其他方面失败了。相反,我选择了一个命令行任务,它只调用dotnet restore——这似乎自动完成所有事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2020-01-09
  • 2021-12-28
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
相关资源
最近更新 更多