У меня есть сборка, в которой несколько параллельных этапов начинаются с восстановления 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's NuGetRestore(), но я могу воспроизвести, используя только "nuget restore" с двух отдельных терминалов одновременно, поэтому я предполагаю, что ошибка не связана с Дженкинсом или Cake, хотя решения, связанные с любым из них, будут приветствоваться.
Я подумал о добавлении небольшой задержки к одному из этапов, чтобы уменьшить вероятность одновременного выполнения двух восстановлений, но я бы предпочел более надежное решение. Ограничение числа исполнителей до одного на агента также нецелесообразно.