【问题标题】:BuildHTTPClient not able to get Build Definition Steps?BuildHTTPClient 无法获取构建定义步骤?
【发布时间】:2019-03-24 10:51:45
【问题描述】:

我们正在使用 BuildHTTPClient 以编程方式创建构建定义的副本,更新内存中的变量,然后将更新的对象保存为新定义。

我正在使用Microsoft.TeamFoundation.Build2.WebApi.BuildHTTPClient 16.141。 TFS 版本为 17 update 3 (rest api 3.x)

这是与https://serverfault.com/questions/799607/tfs-buildhttpclient-updatedefinition-c-example 类似的问题,但我试图继续使用 BuildHttpClient 库,而不是直接转到 RestAPI。

问题是 Steps 列表与其他属性一起始终为空,即使我们在构建定义中有它们。

更新在下面作为答案发布

查看下面的@Daniel Frosts 尝试后,我们开始研究使用旧版本的 NuGet 包。令人惊讶的是,受支持的版本 15.131.1 不支持此功能,但我们发现 version="15.112.0-preview" 支持。 在回滚我们所有的 Dll 以匹配该版本之后,在保存构建的新副本时克隆了这些步骤。

当您使用这个包时,我们使用的所有代码示例都有效。我们无法让 Daniel 的示例正常工作,但 Dll 的版本是问题所在。

我们需要创建一个 GitHub 问题并将其报告给 MS

第一次尝试 - GetDefinitionAsync:

VssConnection connection = new VssConnection(DefinitionTypesDTO.serverUrl, new VssCredentials());
BuildHttpClient bdClient = connection.GetClient<BuildHttpClient>();

Task <BuildDefinition> resultDef = bdClient.GetDefinitionAsync(DefinitionTypesDTO.teamProjectName, buildID);
resultDef.Wait();
BuildDefinition updatedDefinition = UpdateBuildDefinitionValues(resultDef.Result, dr, defName);
updatedTask = bdClient.CreateDefinitionAsync(updatedDefinition, DefinitionTypesDTO.teamProjectName);

更新适用于变量,我们可以将更新的定义保存回 TFS,但新创建的构建定义中没有任何任务。当我们查看从 GetDefinitionAsync 返回的对象时,我们看到 Steps 列表是空的。看起来 GetDefinitionAsync 只是没有获得完整的对象。

第二次尝试 - 特定修订:

int rev = 9;
Task <BuildDefinition> resultDef = bdClient.GetDefinitionAsync(DefinitionTypesDTO.teamProjectName, buildID, revision: rev);
resultDef.Wait();
BuildDefinition updatedDefinition = UpdateBuildDefinitionValues(resultDef.Result, dr, defName);

根据 SteveSims 的帖子,我们认为我们没有得到正确的修订。所以我们在请求中添加了修订。我在正确的修订版中看到了同样的问题。与 SteveSims 的帖子类似,我可以在浏览器中打开 DefinitionURL,我看到任务在浏览器的 JSON 中,但 BuildDefinition 对象没有填充它们。

第三次尝试 - GetFullDefinition:

然后我想尝试 getFullDefinition,也许这就是“完整”的意思,当然没有关于这些库的任何文档,我不知道。

var task2 = bdClient.GetFullDefinitionsAsync(DefinitionTypesDTO.teamProjectName, "MyBuildDefName","$/","TfsVersionControl");
task2.Wait();

仍然没有运气,即使我们在构建定义中有步骤,步骤列表也始终为空。

第四次尝试 - 另存为模板

var task2 = bdClient.GetTemplateAsync DefinitionTypesDTO.teamProjectName, "1_Batch_Dev");
task2.Wait();

我尝试将构建定义另存为模板。所以在Web UI中我选择了“另存为模板”,仍然没有步骤。

第五次尝试:使用 SteveSims 帖子中提到的 URL:

最后我说好的,我会尝试 SteveSims 使用的解决方案,使用 webclient 从 URL 获取对象。

var client = new WebClient();
client.UseDefaultCredentials = true;
var json = client.DownloadString(LastDefinitionUrl);

//Convert the JSON to an actual builddefinition
BuildDefinition result = JsonConvert.DeserializeObject<BuildDefinition>(json);

这也不起作用。构建定义步骤为空。即使在查看 Json 对象(var json)时,我也会看到这些步骤。但是对象没有加载它们。

我看过这篇似乎将步骤添加到基本定义的帖子,我已经尝试过了,但老实说,我在理解他通过 NuGet 引用 BuildDefinition 对象时如何修改它时遇到了问题?

https://dennisdel.com/blog/getting-build-steps-with-visual-studio-team-services-.net-api/

【问题讨论】:

  • 您是否有机会获得一种新格式的构建定义,其中步骤在阶段下移动?检查Process.Phases[0].Steps value
  • 我正在使用 Microsoft.TeamFoundation 16.170.0 捆绑包.. 步骤仍然为空。它是一个 yml 进程。有人对此问题有新的更新吗?如何从 YAML 定义中获取所有任务步骤。

标签: tfs azure-devops tfsbuild azure-pipelines


【解决方案1】:

查看下面的@Daniel Frosts 尝试后,我们开始研究使用旧版本的 NuGet 包。令人惊讶的是,受支持的版本 15.131.1 不支持此功能,但我们发现 version="15.112.0-preview" 支持。
在回滚我们所有的 Dll 以匹配该版本之后,在保存构建的新副本时克隆了这些步骤。

当您使用此包时,上述所有代码示例均有效。我们无法让 Daniel 的示例正常工作,但我们没有努力,因为我们有工作代码。

我们需要为此创建一个 GitHub 问题。

【讨论】:

【解决方案2】:

在我的代码中找到了这个,它有效。

使用这个包,不确定它是否会产生影响(笑话)。 ...packages\Microsoft.TeamFoundationServer.Client.15.112.1\lib\net45\Microsoft.TeamFoundation.Build2.WebApi.dll

private Microsoft.TeamFoundation.Build.WebApi.BuildDefinition GetBuildDefinition(string projectName, string buildDefinitionName)
{
    var buildDefinitionReferences = _buildHttpClient.GetFullDefinitionsAsync(projectName, "*", null, null, DefinitionQueryOrder.DefinitionNameAscending, top: 1000).Result;
    return buildDefinitionReferences.SingleOrDefault(x => x.Name == buildDefinitionName && x.DefinitionQuality != DefinitionQuality.Draft);
}

【讨论】:

  • 你试过我指的那个包的版本了吗?
  • 是的..你成功得到不是nullSteps了吗?
  • 是的!但我也在想,也许您应该查看 V3.1 的 REST API 文档。查看请求时,请尝试使用 Fiddler 进行调试。我已经看到从 VSTS/TFS 返回的 JSON 没有 Steps 但它有一个 Task 节点。
  • 是的,它们是 Json 中的任务,但在被转换为对象时应该转换为 Steps in。
【解决方案3】:

对于新客户,步骤将始终为空。在较新的 api 版本(由较新的客户端使用)中,这些步骤已移至阶段。如果您使用 GetDefinitions 或 GetFullDefinitions 并查看

definition.Process.Phases[0].Steps

你会找到他们的。 (GetDefinitions 获取浅引用,因此不会包含该过程。)

出于兼容性原因,Steps 集合仍然存在(我们不希望应用因 MethodNotFoundExceptions 之类的东西而崩溃),但它不会被填充。

【讨论】:

  • 我必须尝试一下,要清楚你是说我需要将项目升级回 16.141 吗?如果是这样,那么我将如何使用 BuildHTTPClient 以编程方式创建构建定义的副本,更新内存中的变量,然后将更新的对象另存为新定义?
【解决方案4】:
I was having this problem, although I able to get Phases[0] information at runtime, but could not get it at design time. I solved this problem using dynamic type.

   dynamic process = buildDefTemplate.Process;                

   foreach (BuildDefinitionStep tempStep in process.Phases[0].Steps)
   {
        // do some work here            
   }

Not, it is working!

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2011-11-28
    • 2013-11-19
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多