NuGet восстанавливает пакеты восстановления, когда два параллельных потока пытаются восстановить один и тот же пакет - PullRequest
0 голосов
/ 02 мая 2018

У меня есть сборка, в которой несколько параллельных этапов начинаются с восстановления NuGet, а затем выполняются разные вещи (сборка и запуск тестов, сборка для iOS, сборка для Android). Восстановление выполняется на каждом этапе, поскольку они могут выполняться на разных агентах сборки. Однако, поскольку в нашей настройке CI есть два исполнителя на каждого агента, они также могут в конечном итоге выполняться на одном и том же агенте, и именно здесь возникает моя проблема.

Когда NuGet сталкивается с пакетом, который не находится в каталоге глобальных пакетов (~ / .nuget / packages, так как я собираюсь на Mac), он попытается установить его, и это обычно происходит одновременно в двух параллельные этапы, вызывая ошибку на одном или обоих этапах. Сообщение об ошибке будет выглядеть следующим образом:

[Stage1] Installing BtDriver 1.0.0. 
[Stage1] WARNING: Error downloading 'BtDriver.1.0.0' from 'https://MyArtifactory/api/nuget/BtDriver/1.0.0'.
[Stage1] Directory /Users/MyUser/.nuget/packages/btdriver/1.0.0/lib is not empty

Или с другой стадии:

[Stage2] Installing BtDriver 1.0.0.
[Stage2] WARNING: Error downloading 'BtDriver.1.0.0' from 'https://MyArtifactory/api/nuget/BtDriver/1.0.0'.
[Stage2] /Users/MyUser/.nuget/packages/btdriver/1.0.0/g45y07q7.6ap does not exist

Я много раз искал решение этой проблемы, но до сих пор я не смог найти никого, кто сталкивался бы с той же проблемой, что привело меня к мысли, что я, возможно, упустил что-то очевидное, поэтому я надеюсь, что кто-то может привести я в правильном направлении.

Информация о бонусе: я использую Jenkins, чтобы назначить агентов и организовать сборку, и NuGet Restore вызывается с использованием метода Cake NuGetRestore () , но я могу воспроизвести с использованием только 'восстановления nuget' из двух отдельных терминалов одновременно, поэтому я предполагаю, что ошибка не связана с Дженкинсом или Cake, хотя решения с участием любого из них будут приветствоваться.

Я рассмотрел добавление небольшой задержки на один из этапов, поэтому вероятность одновременного выполнения двух восстановлений меньше, но я бы предпочел более надежное решение. Ограничение числа исполнителей одним агентом также невозможно.

1 Ответ

0 голосов
/ 29 марта 2019

Что бы это ни стоило, у меня был первый успех, когда я велел nuget / msbuild использовать разные пути для своих кешей. См. https://docs.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders для переменных среды.

Я ищу чистый подход - возможно, убедить Дженкинса использовать разные домашние каталоги для каждого исполнителя, чтобы мне не нужно было запускать дополнительный код в каждом задании, но я не понял, как это сделать еще.

...