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

时间:2018-05-02 12:53:32

标签: jenkins nuget nuget-package-restore cakebuild

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

我正在寻找一种干净的方法-也许说服Jenkins为每个执行者使用不同的主目录,这样我就不必在每个工作中都运行额外的代码,但是我还没有弄清楚该怎么做