繁体   English   中英

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

[英]NuGet restore packages crashes when two parallel threads attempt to restore same package

我有一个构建,其中多个并行阶段每个都从 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,尽管涉及任何一个的解决方案都会受到欢迎。

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

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

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

但是,一旦解决了该问题,我有时会看到并行运行的 nuget 恢复出现套接字错误。 我相信每个 nuget 进程都在争取访问远程服务器并导致超时。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM