【问题标题】:TeamCity NuGet Installer step failsTeamCity NuGet 安装程序步骤失败
【发布时间】:2016-05-09 18:23:27
【问题描述】:

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

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

[恢复] 进程无法访问文件 'C:\BuildAgent\work...\packages\Microsoft.Bcl.Build.1.0.21\Microsoft.Bcl.Build.1.0.21.nupkg' 因为它是正在被另一个进程使用。

[恢复] 进程以代码 1 退出

【问题讨论】:

    标签: c# .net nuget teamcity nuget-package-restore


    【解决方案1】:

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

    【讨论】:

    • 是的,我有 2 个 AWS EC2 云构建代理,它们都作为单个构建代理安装在不同的实例上。 (+1 提及)
    • 好吧,我会使用诸如进程资源管理器之类的锁检查工具来确定在构建失败时谁拥有该文件。但是您必须有权访问该服务器。
    【解决方案2】:

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

    您可以做几件事,具体取决于根本原因:

    • 您使用 MSBuild 的并行构建功能: 根据他的 blog,它似乎不适用于 NuGet 包还原,因为它可以为每个项目运行并行包还原(如果有多个项目需要 Microsoft.Bcl.Build...Boom!)。禁用并行构建或在解决方案之外执行包还原(在命令行步骤中)。顺便说一句,这不是good practice to do NuGet restore with solution MSBuild

    • 还有另一个进程:
      使用进程监视器/资源管理器查找 出哪个进程持有文件的锁。它可能是一个防病毒、文件索引工具、一个在后台继续运行的附加构建代理实例。由于锁定不是永久性的,而且十分之一对于这类问题来说相当多,我不敢打赌这是根本原因。

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

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

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

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

    【讨论】:

      【解决方案3】:

      试试这个:

      1. 在 TeamCity 中添加一个特殊的构建步骤,如果 “即使之前的某些步骤失败”,它也会运行。 (https://confluence.jetbrains.com/display/TCDL/Configuring+Build+Steps)
      2. 在此构建步骤中,找出哪个进程正在锁定文件并将其打印在日志中。 (How do I find out which process is locking a file using .NET?)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-13
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多