BuildHTTPClient не может получить шаги определения сборки? - PullRequest
0 голосов
/ 19 октября 2018

Мы используем 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/

Ответы [ 4 ]

0 голосов
/ 30 июня 2019
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!
0 голосов
/ 28 октября 2018

Посмотрев на попытку @Daniel Frosts ниже, мы начали смотреть на использование старых версий пакета NuGet.Удивительно, но поддерживаемая версия 15.131.1 не поддерживает это, но мы обнаружили, что version = "15.112.0-preview" делает это.
После отката всех наших DLL-файлов в соответствии с этой версией шаги были клонированы при сохраненииновая копия сборки.

Все приведенные выше примеры кода работают, когда вы используете этот пакет.Нам не удалось заставить пример Дэниела работать, но мы не старались, потому что у нас был рабочий код.

Для этого нам нужно создать проблему GitHub.

0 голосов
/ 04 июня 2019

С новыми клиентами Шаги будут всегда пустыми.В более новых api-версиях (которые используются новыми клиентами) шаги перешли на этапы.Если вы используете GetDefinitions или GetFullDefinitions и посмотрите в

definition.Process.Phases[0].Steps

, вы найдете их.(GetDefinitions получает поверхностные ссылки, поэтому процесс не будет включен.)

Коллекция Steps по-прежнему существует по причинам совместимости (мы не хотим, чтобы приложения зависали с такими вещами, как MethodNotFoundExceptions), но она не будет заполнена.

0 голосов
/ 23 октября 2018

Нашел это в моем коде, который работает.

Используйте этот пакет, не уверен, что он может оказать влияние (шутка).... 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);
}
...