Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins 当两个并行线程尝试还原同一个包时,NuGet restore包崩溃_Jenkins_Nuget_Nuget Package Restore_Cakebuild - Fatal编程技术网

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

Jenkins 当两个并行线程尝试还原同一个包时,NuGet restore包崩溃,jenkins,nuget,nuget-package-restore,cakebuild,Jenkins,Nuget,Nuget Package Restore,Cakebuild,我有一个构建,在做不同的事情(构建和运行测试、针对iOS的构建、针对Android的构建)之前,多个并行阶段都以NuGet恢复开始。恢复在每个阶段执行,因为它们可以在不同的生成代理上运行。但是,由于我们的CI设置在每个代理上有两个执行器,因此它们也可以在同一个代理上执行,这就是我的问题所在 当NuGet遇到一个不在global packages目录下的包(~/.NuGet/packages,因为我是在Mac上构建的),它将尝试安装它,这往往会在两个并行阶段中同时发生,导致在其中一个或两个阶段中发

我有一个构建,在做不同的事情(构建和运行测试、针对iOS的构建、针对Android的构建)之前,多个并行阶段都以NuGet恢复开始。恢复在每个阶段执行,因为它们可以在不同的生成代理上运行。但是,由于我们的CI设置在每个代理上有两个执行器,因此它们也可以在同一个代理上执行,这就是我的问题所在

当NuGet遇到一个不在global packages目录下的包(~/.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的方法调用,但我可以同时使用两个不同的终端上的“NuGet Restore”进行复制,因此我假设错误不在Jenkins或Cake身上,尽管涉及其中任何一个的解决方案都是受欢迎的


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

无论如何,我告诉nuget/msbuild为其缓存使用不同的路径取得了部分成功。有关环境变量,请参见

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


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

我们有许多CI代理在同一台主机上运行。 我们最终通过自定义MSBuildWithMutex任务解决了这个问题。

为什么不先恢复软件包,然后再构建它们呢。如果你能分享一下你的建筑是如何components@liam:我需要在生成之前直接还原,因为这三个阶段可能在三个不同的代理上执行。我没有添加构建信息,因为错误发生在构建开始之前,但如果有帮助,我可以添加更多信息。