TFVC:在 vnext 构建期间删除工作区失败

Posted

技术标签:

【中文标题】TFVC:在 vnext 构建期间删除工作区失败【英文标题】:TFVC: Deleting workspace fails during vnext build 【发布时间】:2020-11-23 07:07:23 【问题描述】:

我们正在使用“Azure DevOps Server”2019 Update1 运行 TVFC。

在我们的 vnext 构建结束时,我们想要删除工作区。 我们使用 tf.exe 执行此操作。但是我们必须指定工作区所有者,因为运行构建的帐户(即在构建代理上为构建服务配置的帐户)与用于创建工作区的帐户不同。

工作区所有者是“项目集合构建服务(DefaultCollection)”。 因此,作为删除我们使用的工作区的命令,例如:

tf.exe workspace /delete /noprompt /collection:http://tfs.siplaceworld.net:8080/tfs/DefaultCollection/ ws_1749_167;Project Collection Build Service (DefaultCollection)

这在大多数情况下都有效。我们偶尔会收到一条错误消息:

TF14061: The workspace ws_1749_167;Project Collection Build Service (DefaultCollection) does not exist.

但是在查看构建计算机时工作区确实存在。因此,为了调试目的,在我们尝试删除之前,我添加了对“tf.exe 工作区”的调用以获取所有工作区的列表。

在错误情况下,您会看到工作区所有者不是英文,而是德文:

tf.exe workspaces /collection:http://tfs.siplaceworld.net:8080/tfs/DefaultCollection/
Collection: http://tfs.siplaceworld.net:8080/tfs/DefaultCollection
Workspace   Owner                                               Computer  Comment
----------- --------------------------------------------------- --------- -------
MCHC16074   ASM AS SW-Dev Build                                 MCHC16074 
ws_1678_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_1693_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_1695_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_1700_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_1719_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_1744_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_1747_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_1749_167 Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_461_169  Builddienst für Projektsammlung (DefaultCollection) MCHC16074 
ws_470_169  Builddienst für Projektsammlung (DefaultCollection) MCHC16074

这是零星的,我们不知道它取决于什么。工作区所有者怎么可能有时用德语列出,有时用英语列出?

任何帮助表示赞赏!

【问题讨论】:

你能使用Build.QueuedByBuild.Repository.Tfvc.Workspace变量吗? docs.microsoft.com/en-us/azure/devops/pipelines/build/… 是的,我可以。我已经使用变量 $(Build.Repository.Tfvc.Workspace) 来确定工作区,但这并没有给我所有者。并且工作区所有者不是排队构建的人... 如果是CI/scheduled builds,则Build.QueuedBy的值为系统标识,例如:[DefaultCollection]\Project Collection Service Accounts见页面底部docs.microsoft.com/en-us/azure/devops/pipelines/build/… 在我们的 vnext 构建结束时,我们想要删除工作区。 为什么?构建引擎会为您处理工作区映射。 为什么?因为有数百个构建定义会将其工作区留在构建计算机上。这就是为什么我们要在构建完成后进行清理。构建引擎只提供在构建开始时清理工作区,而不是在结束时:( 【参考方案1】:

要删除现有工作区,您必须是所有者或将全局“管理工作区”权限设置为“允许”。

您也可以尝试使用 onwer uniq ID 代替名称。获取所有者唯一 ID:

tf vc workspaces ws_1749_167 /computer:* /format:xml /collection:https://dev.azure.com/xxx/

在此之后它将返回所有者 uniq ID 的信息。然后删除具有所有者唯一 ID 的工作区:

tf workspace /delete ws_1749_167;owner uniq ID

详情请参考此ticket。

【讨论】:

谢谢。 OwnerAliases 之一与我在安全窗口中看到的用户名相同(请参阅我的其他答案)。 Build\beb2741f-e779-4a6f-a20e-033796fec5b7beb2741f-e779-4a6f-a20e-033796fec5b7项目集合构建服务(DefaultCollection) 所以我想我是使用第一个别名还是第二个别名来删除工作区并不重要......【参考方案2】:

“项目集合构建服务(DefaultCollection)”只是创建工作区的帐户的显示名称。不知道为什么有时是英语,有时是德语,但您可以使用“真实”用户名而不是显示名称。

我在“源代码管理资源管理器”的安全窗口中找到了此帐户的用户名。我选择“添加 Windows 用户或组”并搜索“构建”,结果如下:

显示名称:项目集合构建服务(DefaultCollection)

用户名:Build\beb2741f-e779-4a6f-a20e-033796fec5b7

所以我更改了清理构建代理的任务以在删除工作区时使用用户名:

tf.exe workspace /delete /noprompt /collection:http://tfs.siplaceworld.net:8080/tfs/DefaultCollection/ ws_1749_167;Build\beb2741f-e779-4a6f-a20e-033796fec5b7

效果很好:)

【讨论】:

以上是关于TFVC:在 vnext 构建期间删除工作区失败的主要内容,如果未能解决你的问题,请参考以下文章

构建工作,但发布期间的预编译失败

使用 vNext 构建后将内部版本号与 TFS 工作项相关联

结合CLR类库发布ASP.NET vNext/DNX

我怎样才能始终如一地自动化,使用 TFS vNext 构建步骤,构建我们的开发团队使用 Visual Studio 工作的任何解决方案文件?

是否能够忽略/禁用 vNext Build 中的第一步获取源代码?

Sonar vNext:未报告代码覆盖率,但找到了覆盖率文件