【发布时间】: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