У меня есть сборка, в которой несколько параллельных этапов начинаются с восстановления 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, хотя решения с участием любого из них будут приветствоваться.
Я рассмотрел добавление небольшой задержки на один из этапов, поэтому вероятность одновременного выполнения двух восстановлений меньше, но я бы предпочел более надежное решение. Ограничение числа исполнителей одним агентом также невозможно.