TFS2015 vNext Build + PowerShell自定义 - 异常调用保存:TF215070:构建URI无效

时间:2017-12-18 19:58:54

标签: powershell tfs

以前使用过TFS2013和基于XAML的版本。已经为C#中的XAML构建创建了许多自定义任务,包括通过TFS .NET客户端API库(而不是REST API)以编程方式设置构建号。现在已转移到TFS2015并尝试转移到基于vNext的构建。尝试通过重新编码为PowerShell脚本,将基于C#的自定义项转换为新的构建过程。我正在尝试使用以下脚本以编程方式设置内部版本号(正如我们之前通过C#所做的那样):

# Step 1: load the TFS assemblies
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Common")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client")

# Step 2: get the collection
$collection=[Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)

# Step 3: get the build server
$buildServer=$collection.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])

# Step 4: get the details for the currently running build
$buildDetail = $buildServer.GetBuild($env:BUILD_BUILDURI)

# Step 5: update the build number
$buildDetail.BuildNumber = "1.2.3.4-MyBuild"

# Step 6: save the changes to the build details
$buildDetail.Save()

在我尝试保存对buildDetail.BuildNumber所做的更改之前,一切似乎都工作正常,直到第6步。当" Save()"调用方法时,会生成以下错误:

Exception calling "Save" with "0" argument(s): "TF215070: The build URI vstfs:///Build/Build/40177 is not valid. Make sure that this build exists and has not been deleted.

我可以说,第4步是返回一个实现Microsoft.TeamFoundation.Build.Client.IBuildDetail接口的实例(正如我预期的那样)。此外,显然构建URI是有效的,因为它专门用于在同一步骤中加载构建信息。同样,这个逻辑模仿了我们在基于C#的XAML自定义中使用的相同逻辑,只是在PowerShell下重写。

在互联网上搜索,我找不到任何与此错误有关的内容,也无法弄清楚为什么我会收到它。我确实找到了一个(更复杂的)我在这里尝试做的版本:https://github.com/voice4net/build-scripts/blob/master/ApplyVersionFromSourceControl.ps1。虽然我没有尝试直接使用这个脚本,但它似乎做了基本相同的事情,并且可能对其作者有效。

有没有人可以帮助我理解这个错误,为什么我会得到它,理想情况下,如何修复它?

SIDE NOTE:这不是微软托管的TFS;这是我们公司内部安装的传统TFS系统。

2 个答案:

答案 0 :(得分:0)

TFS SOAP对象模型中的方法(例如Microsoft.TeamFoundation.Build.Common)仅适用于XAML构建系统。您定位错误的构建系统,这就是您遇到问题的原因。

使用适当的对象模型(REST APIs directlyC# REST API wrappers)。

答案 1 :(得分:0)

您似乎正在尝试使用不正确的API来更新您的内部版本号。您应该使用客户端DLL的WebAPI / REST部分。

这就是说我强烈建议你在纯PowerShell或TypeScript中创建一个自定义任务,以实现你的目标。

以下是在TypeScript中执行此操作的示例:

console.log(`##vso[build.updatebuildnumber]${newBuildNumber}`);

或在PowerShell中:

Write-VstsUpdateBuildNumber -Value $newBuildNumber

您可以在此处查看有关如何创建构建任务的参考: https://github.com/Microsoft/vsts-task-lib