当两个并行线程尝试还原相同的包时,NuGet还原包会崩溃

问题描述 投票:1回答:1

我有一个构建,其中多个并行阶段每个都开始与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分配代理并协调构建,并使用Cake的NuGetRestore()方法调用NuGet Restore,但我能够同时使用来自两个独立终端的'nuget restore'进行重现,所以我我假设错误不在于Jenkins或Cake,尽管欢迎涉及其中任何一个的解决方案。

我考虑过在其中一个阶段添加一个小延迟,因此两个恢复同时执行的可能性较小,但我更喜欢更强大的解决方案。将执行者的数量限制为每个代理一个也是不可行的。

jenkins nuget nuget-package-restore cakebuild
1个回答
0
投票

对于它的价值,我已经初步成功告诉nuget / msbuild为其缓存使用不同的路径。有关环境变量,请参阅https://docs.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders

我正在寻找一个干净的方法 - 也许说服Jenkins为每个执行程序使用不同的主目录,这样我就不必在每个作业中运行额外的代码,但我还没弄清楚如何做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.