Как запустить сборку в TFS 2015 с помощью REST API
У меня TFS 2015 RC2 установлен на месте. Я пытаюсь использовать REST API для очереди сборки в определении vNext.
Я использую образец кода из VSO с небольшими изменениями (в основном изменение метода URL и аутентификации для работы с локальным TFS).
Есть два вызова API REST, которые я использую.
Первое:
GET http://mytfssrv:8080/tfs/DefaultCollection/myproject/_apis/build/definitions/
Возвращает все указанные определения сборки проекта:
построить определение с идентификатором 1, который является определением сборки XAML. Мне не интересно стоять в очереди
и построить определение с идентификатором 2, который является определением сборки vNext, - где я хочу поставить в очередь мою сборку
Заметьте, что я пропустил часть api-version = 1.0 - потому что, если я этого не сделаю, я получаю только определение сборки XAML.
Второй вызов заключается в очереди новой сборки в определении сборки vNext:
POST http://mytfssrv:8080/tfs/DefaultCollection/myptoject/_apis/build/requests?api-version=1.0
со следующими данными:
{"definition":{"id":**2**},"reason":"Manual","priority":"Normal","queuePosition":0,"queueTime":"0001-01-01T00:00:00","requestedBy":null,"id":0,"status":null,"url":null,"builds":null}
Ответ, который я получаю с сервера:
TF215016: определение сборки 2 не существует. Укажите правильное определение сборки и повторите попытку.
Я попытался изменить версию API, изменив почтовые данные различными способами, но никогда не преуспевая.
Любая идея, как вылечить TFS из своего DID?
Ответы
Ответ 1
TFS 2015 RC2 использует новый API (версия 2.0-preview2). Образец VSO, который я упомянул в вопросе, устарел и не имеет значения, если вы хотите поставить в очередь новую сборку.
В настоящее время нет документации, но веб-портал использует REST API, поэтому просто Fiddler прочь.
Вот код:
var buildRequestPOSTData =
new BuildRequest()
{
Definition = new Definition()
{
Id = firstBuildDefinition.Id
},
Project = new Project { Id = "project guid" },
Queue = new Queue { Id = 1 },
Reason = 1,
sourceBranch = "$Branch"
};
responseBody = await QueueBuildAsync(client, buildRequestPOSTData, _baseUrl + "build/Builds");
И вот класс с новыми параметрами для запросов на создание:
public class BuildRequest
{
[JsonProperty(PropertyName = "definition")]
public Definition Definition { get; set; }
[JsonProperty(PropertyName = "demands")]
public string Demands { get; set; }
[JsonProperty(PropertyName = "parameters")]
public IEnumerable<string> Parameters { get; set; }
[JsonProperty(PropertyName = "project")]
public Project Project { get; set; }
[JsonProperty(PropertyName = "queue")]
public Queue Queue { get; set; }
[JsonProperty(PropertyName = "reason")]
public int Reason { get; set; }
[JsonProperty(PropertyName = "sourceBranch")]
public string sourceBranch { get; set; }
[JsonProperty(PropertyName = "sourceVersion")]
public string RequestedBy { get; set; }
}
public class Definition
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
}
public class Queue
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
}
public class Project
{
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
}
Ответ 2
Это "пример примера кода", который мне нужен в награде.
using Microsoft.TeamFoundation.Build.WebApi;
using Microsoft.VisualStudio.Services.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
internal class TfsBuildHelper
{
private readonly VssConnection connection;
private readonly BuildHttpClient client;
internal TfsBuildHelper(Uri tpcUrl)
{
this.connection = new VssConnection(tpcUrl, new VssClientCredentials(true));
this.client = connection.GetClient<BuildHttpClient>();
}
/// <summary>
/// Returns the build definitions for a specific team project.
/// </summary>
public async Task<IEnumerable<DefinitionReference>> GetBuildDefinitionsFromTeamProject(string teamProject)
{
return await this.client.GetDefinitionsAsync(project: teamProject, type: DefinitionType.Build);
}
/// <summary>
/// Return build numbers for specific team project and build definition.
/// </summary>
public async Task<IEnumerable<string>> GetAvailableBuildNumbers(string teamProject, string buildDefinition)
{
var builds = await this.client.GetBuildsAsync(project: teamProject, type: DefinitionType.Build);
return builds.Select(b => b.BuildNumber);
}
}