Azure DevOps: конвейер не может использовать пакет NuGet из артефакта - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь использовать проект Azure DevOps Server 2019 (далее TFS) несколькими способами:

  • Репозит для сохранения кода,
  • функция Артефакты для добавления некоторых приватных пакетов,
  • Конвейеры для CI (в основном это просто извлечение пакетов, сборка из кода, публикация sh к промежуточному серверу)

(Предположительно, такого рода интеграция - это целая точка.)

Мой конвейер имеет . NET Восстановление ядра * Шаг 1020 *, для которого Путь к 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. Я явно добавил, что права доступа в качестве соавтора (хотя читателя, по-видимому, достаточно).
  • Я изменил его с локального пользователя на одного в домене Active Directory, в случае, если локальные пользователи не работают должным образом.
  • Я обновил с 2019 до 2019.1.1, чтобы не быть ошибкой.
  • Я попытался добавить подключение к службе Учетные данные для каналов за пределами этого поля организации / коллекции . Но этот канал не снаружи. Это тот же самый проект!

Я думаю, мне нужно рассказать ему, как проходить аутентификацию (просто использовать текущие Windows учетные данные), но я не могу понять из исключения, что он даже пытается и терпит неудачу в.

1 Ответ

1 голос
/ 04 марта 2020

Похоже, что-то не так с dotnet restore задачей в Azure DevOps Server 2019. Это все еще одна открытая проблема в github / azure -pipelines-tasks .

В качестве обходного пути: Вы можете использовать задачу командной строки для непосредственного вызова dotnet / nuget (latest nuget.exe) cli для восстановления пакетов nuget для вашего решения. (На вашем сервере сборки восстановите эти пакеты успешно, прежде чем сделать это на Azure Devops Server)

Дополнительные сведения и более доступные обходные пути вы можете сослаться на предложения этого инженера Microsoft .

...