jenkins - 当两个并行线程尝试还原同一个包时,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”进行复制,所以我假设错误不在于詹金斯或蛋糕,尽管涉及任何一个的解决方案都会受到欢迎。
我已经考虑在其中一个阶段添加一个小的延迟,因此两个恢复同时执行的可能性较小,但我更喜欢更强大的解决方案。将执行者的数量限制为每个代理一个也不可行。
解决方案
我们有许多 CI 代理在同一主机上运行。我们最终通过自定义 MSBuildWithMutex 任务解决了这个问题。 https://gist.github.com/dedale/675ec80313f2a70266deb0ab78a0e2c6
推荐阅读
- javascript - 检查单选按钮值的语法
- python - 请求模块的结果在空闲和代码之间是不同的
- python - 在 python 中的 Keras 中加载 MNIST 数据,使用 mnist.load_data() 正在做什么
- c++ - glTF文件中步幅的属性?
- jax-rs - JAX-RS 在 Liberty 上抛出 URISyntaxException
- c# - 如何使用 YamlDotNet 反序列化静态属性?
- python - “For循环”没有创建现有数据帧的修改副本
- python - 如何使共享一个类别的所有帖子出现在 Django 的页面上
- apache - 使用 mod_auth_openidc 和 keycloak 进行 cURL 身份验证
- regex - 使用正则表达式识别 EQUIPMENTID 编号 - VBA