web-dev-qa-db-fra.com

Comment déclencher une construction dans TFS 2015 en utilisant REST API

J'ai TFS 2015 RC2 installé sur site. J'essaie d'utiliser REST API pour mettre en file d'attente une construction dans une définition vNext.

J'utilise l'exemple de code de VSO avec de légères modifications (principalement modification de l'URL et de la méthode d'authentification pour fonctionner avec TFS sur site).

J'utilise _ REST API appels.

La première est: GET http: // mytfssrv: 8080/tfs/DefaultCollection/myproject/_apis/build/definitions/

Ce qui retourne toutes les définitions de construction de projet spécifiées: Définition de construction avec l'ID 1, qui est une définition de construction XAML que je ne suis pas intéressée à mettre en file d'attente dans Et une définition de construction avec l'ID 2, qui est la définition de construction vNext - c'est là que je veux faire la queue pour mon build

Notez que j'ai omis la partie? Api-version = 1.0 - c'est parce que si je ne le fais pas, je ne reçois que la définition de construction XAML.

Le deuxième appel consiste à mettre en file d'attente une nouvelle construction dans la définition de construction vNext:

POST http: // mytfssrv: 8080/tfs/DefaultCollection/myptoject/_apis/build/request? Api-version = 1.0

avec les données suivantes:

{"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}

La réponse que je reçois du serveur est la suivante:

TF215016: La définition de construction 2 n'existe pas. Spécifiez une définition de construction valide et réessayez.

J'ai essayé de changer la version de l'API, en modifiant les données de publication de différentes manières, mais sans succès.

Une idée de comment guérir le TFS de son DID?

13
kDar

TFS 2015 RC2 utilise une nouvelle API (version 2.0-preview.2). L'exemple VSO que j'ai mentionné dans la question est obsolète et n'est pas pertinent lorsque vous souhaitez mettre en file d'attente une nouvelle génération.

Actuellement, il n'y a pas de documentation, mais le portail Web utilise REST API, donc éloignez Fiddler.

Voici le code:

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

Et voici la classe avec de nouveaux paramètres pour les demandes de construction:

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

Cela fonctionne comme un charme sans repos

var tfsurl = new Uri (" http: // localhost: 8080/tfs/ <nom du projet> /");

var ttpc = new TfsTeamProjectCollection (tfsurl);

var bhc = ttpc.GetClient ();

var builds = bhc.GetBuildsAsync ("<nom du projet>"). Résultat;

var build = builds.Where (x => x! = null && x.Definition.Name.Equals ("buildDefinitionName>")). OrderByDescending (y => y.LastChangedDate ) .FirstOrDefault ();

bhc.QueueBuildAsync (build);

1
Phil Landolt

C’est «exemple d’exemple de code» dont j’avais besoin dans 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);
    }
}
0
Raskolnikov