【问题标题】:How to clean sources on multiple build agents如何清理多个构建代理上的源
【发布时间】:2017-09-12 17:27:01
【问题描述】:

假设您配置了多个构建代理,并且您在构建代理上有一个文件夹,其中包含一些不是来自 TFS 的内容(即使指定输出,也可能会在项目中生成一些中间内容,例如 obj 文件夹例如文件夹),您删除了 TFS 中的文件夹。

下次构建时,您会收到 cannot be deleted because it is not empty. 错误。触发构建时,您可以将Build.Clean 变量作为allsource 添加到您的下一个构建中以修复它。但是,由于您有多个代理,因此只有下一个正在运行的代理会接收该命令并进行清理,并且您创建的任何其他构建在另一个代理上的任何其他构建都将再次失败,因为它们仍然拥有该文件夹。

编辑整个构建定义以便他们对每个构建都进行全面清理将是矫枉过正。

我当然在寻找“进入实际文件夹并手动删除文件夹”以外的其他内容。如果它改变了任何东西,代理不是托管的,而是本地的。

编辑:来自构建服务器的日志,从最后一个 cannot be deleted 警告开始:

2017-03-14T20:23:24.2384009Z d:\vso\b1\_work\32\s\[Obfuscated] cannot be deleted because it is not empty.
2017-03-14T20:23:24.4964210Z ##[error]Exit code 1 returned from process: file name 'tf', arguments 'vc get /version:24617 /recursive /overwrite d:\vso\b1\_work\32\s /loginType:OAuth /login:.,******** /noprompt'.
2017-03-14T20:23:24.5124180Z ##[debug]Microsoft.VisualStudio.Services.Agent.ProcessExitCodeException: Exit code 1 returned from process: file name 'tf', arguments 'vc get /version:24617 /recursive /overwrite d:\vso\b1\_work\32\s /loginType:OAuth /login:.,******** /noprompt'.
   at Microsoft.VisualStudio.Services.Agent.ProcessInvoker.<ExecuteAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.Agent.Worker.Build.TfsVCCommandManager.<RunCommandAsync>d__26.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.Agent.Worker.Build.TFCommandManager.<GetAsync>d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.Agent.Worker.Build.TfsVCSourceProvider.<GetSourceAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.Agent.Worker.Build.BuildJobExtension.<PrepareAsync>d__23.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.Agent.Worker.JobExtensionRunner.<RunAsync>d__30.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.Agent.Worker.StepsRunner.<RunAsync>d__0.MoveNext()
2017-03-14T20:23:24.5174212Z ##[section]Finishing: Get Sources

【问题讨论】:

  • 只有其中一个人会收到该命令并清理的详细情况是什么?据我所知,如果您将存储库的 clean 设置为 true(源),则文件在构建之前将是干净的。另一方面,您可以检查 Visual Studio Build 步骤/任务的 Clean 选项。
  • @starain-MSFT 当您在触发构建时设置变量时,该变量仅针对当前构建设置,对吗?如果是这样,其他未处理下一个构建的代理将不会收到它,并且不会在他们的文件夹上进行清理。
  • 您的意思是在构建队列时设置变量值吗?您可以在构建定义的 Repository 选项卡中将 clean 设置为 true。另一方面,它抛出的细节场景是什么,因为它不是空的,所以不能删除?能否提供详细步骤?
  • 我可以将构建定义(在构建选项卡中)设置为 Clean,但这意味着每个构建都会这样做,直到我将其更改回来。重现它的步骤是构建一些解决方案/项目,然后从 TFS 中删除该项目。 TFS 不知道以前构建的项目(如 obj),无法删除文件夹。
  • 我用VSTS做了一个测试,我得到无法删除,因为它不是空战(黄色)而不是错误。你的 TFS 版本是多少?在构建过程中是否还有其他错误?你能在这里分享详细的构建日志吗?

标签: tfs azure-devops azure-pipelines


【解决方案1】:

通过谷歌进入这个话题。 我们有同样的场景,我也试着解释一下here

基本上,我们现在修复它的方式是创建一个新的构建定义,我们用它来使用 Build.Clean = all 参数对新构建进行排队。

所以我们有一个 PowerShell 脚本,它循环遍历我们想要清理的所有 AgentsName,并将新的清理构建排队并添加需求“Agent.Name -equals agentName”。 这样,您的干净构建就会在您要清理的所有代理上排队。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多