TeamCity NuGet 安装程序步骤失败

TeamCity NuGet Installer step fails

这个错误有时会发生,通常这一步工作正常,但在大约 10% 的情况下会失败并显示以下消息。

Nuget 安装程序步骤是第一个构建步骤,并且在 TeamCity 中启用了“干净检出”,因此不应该有任何使用文件的进程。

[restore] The process cannot access the file 'C:\BuildAgent\work...\packages\Microsoft.Bcl.Build.1.0.21\Microsoft.Bcl.Build.1.0.21.nupkg' because it is being used by another process.

[restore] Process exited with code 1

每个构建代理都有单独的工作目录吗?否则两个并行构建可以同时执行。

我的文件正被另一个进程使用”的根本原因

根据根本原因,您可以做几件事:

  • 您使用 MSBuild 的并行构建功能: 根据他的 blog, It seems to not work well with NuGet package restore, because it could runs parallel package restore for each projects (and if several projects require Microsoft.Bcl.Build... Boom!). Either disable parallel build or do package restore outside of solution (in a command line step). By the way, it's not a good practice to do NuGet restore with solution MSBuild.

  • 还有一个进程:
    使用进程monitor/explorer查找 出哪个进程持有文件的锁。它可能是一个防病毒软件、文件索引工具、一个在后台保持 运行 的附加构建代理实例。由于锁定不是永久性的,而且这种问题十分之 1 是相当多的,我敢打赌这不是根本原因。

  • 没有其他进程:
    这是 Teamcity NuGet 安装程序中的一个错误,它执行某些操作。然后,您可以通过调用 nuget restore 的命令行步骤替换该步骤,并检查它是否解决了您的问题。

  • 用你喜欢的 nuget 插件诊断你自己:
    NuGet 插件代码可用 here。这意味着您可以编译自己的版本,并在发生此类问题时提供额外的调试信息(例如锁定文件的进程列表)。或者更有用的是,您可以添加一个重试步骤以防文件被锁定。

编辑:对于那些在 Unix 上使用 Teamcity 的人...

我尝试在 Unix 上安装 Teamcity,并使用 NuGet 插件在 mono 上进行构建。顺便说一下,NuGet 插件在 Unix 上根本不起作用(JetBrains 不支持它)。我什至尝试修复它,但用命令行替换它更容易。

试试这个:

  1. "Even if some of the previous steps failed" 时在 TeamCity 中添加一个特殊的构建步骤。 (https://confluence.jetbrains.com/display/TCDL/Configuring+Build+Steps)
  2. 在此构建步骤中找出哪个进程正在锁定文件并将其打印在日志中。 (How do I find out which process is locking a file using .NET?)