首页 > 解决方案 > 当两个并行线程尝试还原同一个包时,NuGet 还原包崩溃

问题描述

我有一个构建,其中多个并行阶段每个都以 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”进行复制,所以我假设错误不在于詹金斯或蛋糕,尽管涉及任何一个的解决方案都会受到欢迎。

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

标签: jenkinsnugetnuget-package-restorecakebuild

解决方案


我们有许多 CI 代理在同一主机上运行。我们最终通过自定义 MSBuildWithMutex 任务解决了这个问题。 https://gist.github.com/dedale/675ec80313f2a70266deb0ab78a0e2c6


推荐阅读