Мы используем BuildHTTPClient, чтобы программно создать копию определения сборки, обновить переменные в памяти и затем сохранить обновленный объект как новое определение.
Я использую Microsoft.TeamFoundation.Build2.WebApi.BuildHTTPClient 16.141.Версия TFS - 17 обновление 3 (остальные api 3.x)
Этот вопрос похож на https://serverfault.com/questions/799607/tfs-buildhttpclient-updatedefinition-c-example, но я пытаюсь остаться в пределах с помощью библиотек BuildHttpClient и не переходить непосредственно кRestAPIs.
Проблема в том, что список «Шаги» всегда равен нулю вместе с другими свойствами, даже если они есть в определении сборки.
ОБНОВЛЕНИЕ Опубликовано в качестве ответа ниже
Посмотрев на попытку @Daniel Frosts ниже, мы начали рассматривать более старые версии пакета NuGet.Удивительно, но поддерживаемая версия 15.131.1 не поддерживает это, но мы обнаружили, что версия = "15.112.0-preview" поддерживает.После отката всех наших библиотек в соответствии с этой версией шаги были клонированы при сохранении новой копии сборки.
Все примеры кода, которые мы использовали, работают, когда вы используете этот пакет.Нам не удалось заставить пример Дэниела работать, но проблема была в версии 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, мы видим, что список шагов пуст.Похоже, что 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, может быть, это то, что "Full" означает, конечно, без какой-либо документации по этим библиотекам у меня нетidea.
var task2 = bdClient.GetFullDefinitionsAsync(DefinitionTypesDTO.teamProjectName, "MyBuildDefName","$/","TfsVersionControl");
task2.Wait();
Все равно не повезло, список шагов всегда пуст, хотя у нас есть шаги в определении сборки.
Четвертая попытка - сохранить как шаблон
var task2 = bdClient.GetTemplateAsync DefinitionTypesDTO.teamProjectName, "1_Batch_Dev");
task2.Wait();
Я попытался сохранить определение сборки как шаблон.Поэтому в веб-интерфейсе я выбрал «Сохранить как шаблон», но все равно никаких шагов.
Пятая попытка: Использование URL, как упомянуто в сообщении SteveSims:
Наконец я сказалХорошо, я попробую решение, которое использовал SteveSims, используя веб-клиент для получения объекта из 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), я вижу шаги.Но объект не загружен ими.
Я видел этот пост, который, кажется, добавляет Шаги к базовому определению, я пробовал это, но, честно говоря, у меня есть проблема с пониманием того, как он изменил объект BuildDefinition при обращении к нему через NuGet?
https://dennisdel.com/blog/getting-build-steps-with-visual-studio-team-services-.net-api/