Как запустить сборку в TFS 2015 с помощью REST API

У меня есть TFS 2015 RC2, установленный на месте. Я пытаюсь использовать REST API для очереди сборки в определении vNext.

Я использую образец кода из ВСО С небольшими изменениями (в основном изменение URL и метода аутентификации для работы с локальными TFS).

есть два вызова REST API, которые я использую.

первый: ПОЛУЧИТЬ http://mytfssrv:8080/tfs/DefaultCollection/myproject/_apis/build/definitions/

который возвращает все указанные определения сборки проекта: определение сборки с идентификатором 1, которое является определением сборки XAML, в котором я не заинтересован в очереди и определение построения с id 2, что определение vNext строить - вот где я хочу, чтобы моя очередь строить

обратите внимание, что я опустил ?api-версия=1.0 часть-это потому, что если я этого не делаю, я получаю только сборку XAML определение.

второй вызов-очередь новой сборки в определении сборки vNext:

в должности http://mytfssrv:8080/tfs/DefaultCollection/myptoject/_apis/build/requests?api-версия=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, изменение данных post различными способами, но никогда не удавалось.

любая идея, как вылечить TFS от его сделал?

3 ответов


TFS 2015 RC2 использует новый API (версия 2.0-предварительный просмотр.2). Образец VSO, который я упомянул в вопросе, устарел и не актуален, когда вы хотите поставить в очередь новую сборку.

В настоящее время нет документации, но веб-портал использует REST API, поэтому просто скрипач прочь.

вот код:

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; }
}

Это "пример примера кода", который я требовал в bounty.

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);
    }
}

Это работает как шарм без отдыха

var tfsurl = новый Uri ("http://localhost:8080/tfs/имя_проекта>/");

var ttpc = новая коллекция TfsTeamProjectCollection (tfsurl);

var bhc = ttpc.GetClient();

var строит = bhc.GetBuildsAsync ("имя_проекта>").Результат;

var build = строит.Где (x => x != недействительный && X. Определение.Имя.Равно("buildDefinitionName>")).OrderByDescending(y => y.LastChangedDate).FirstOrDefault ();

bhc.QueueBuildAsync(сборка);