2016-08-09 52 views
0

Ich möchte ein Arbeitselement an tfs an einen Build anhängen. Ich lese SVN-Protokolle, die die Arbeitsaufgabennummer enthalten, und versuche, den tatsächlichen Build zu aktualisieren, um sie anzuhängen.Arbeitselement anhängen, um über REST-API zu erstellen

workitems.Add(workItemStore.GetWorkItem(workitemid)); 
buildDetail.Information.AddAssociatedWorkItems(workitems.ToArray()); 

Wenn ich versuche, buildDetail.Information.Save(); oder buildDetail.Save(); zu treffen, erhalte ich eine AccessDeniedException.

Siehe another post.

Also wollte ich mit REST versuchen ... Nach vielen Seiten auf MSDN, habe ich festgestellt, dass es keine .NET Client Library, die Builds kümmert. Es sieht aus wie meine einzige Möglichkeit ist, ein json in die TFS zu patchen:

PATCH https: // {instance}/DefaultCollection/{Projekt}/_apis/build/Builds/{} buildID api-version = {version}

Wie füge ich die Arbeitselemente richtig hinzu?

EDIT: Ich habe eine old post gefunden, die eine DLL im TFS-Namensraum erwähnte, der die gleichen Fähigkeiten wie der Anruf von oben hat. Unglücklicherweise wird es in MSDN nicht erwähnt. Das gleiche Problem hier: keine Möglichkeit, Arbeitselemente hinzuzufügen.

Um das Problem zu verbreiten und Adresse es zu MS: Patrick has created a post on uservoice

UPDATE:

ich es geschafft, einen Build in dem Workitem zu verknüpfen. Hier ist ein Ansatz in :

var json = new JsonPatchDocument 
      { 
       new JsonPatchOperation() 
       { 
        Operation = Operation.Add, 
        Path = "/relations/-", 
        Value = new WorkItemRelation() 
          { 
           Rel = "ArtifactLink", 
           Url = build.Uri.ToString() 
          } 
       } 
      }; 

var client = new WebClient { UseDefaultCredentials = true }; 
client.Headers.Add(HttpRequestHeader.ContentType, "application/json-patch+json"); 
client.UploadData(
    options.CollectionUri + "/_apis/wit/workitems/" + workitemid + "?api-version=1.0", 
    "PATCH", 
    Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(json))); 

Aber es gibt immer noch keine direkte in der Build-Bindung: build

Und die Arbeit Artikel sagt unknown executable linktype work item

Nach der Nachricht in der gegebenen Workitem, ich nehme an, dass ich die falsche linktype verwende. Hat jemand eine Referenz für mich, welche Typen ich verwenden kann und sollte?

URI UPDATE: Ich bin schon mit den erwähnten uri: json

KLEINERE LÖSUNG:

Ich hatte den Namen "Build", um die Attribute des Patches hinzuzufügen. Ich erkenne es immer noch nicht im Build selbst, aber für den Moment kann ich mit dem Link als Build-Typ arbeiten.

var json = new JsonPatchDocument 
      { 
       new JsonPatchOperation() 
       { 
        Operation = Operation.Add, 
        Path = "/relations/-", 
        Value = new WorkItemRelation() 
          { 
           Rel = "ArtifactLink", 
           Url = build.Uri.ToString() 
           Attributes = new Dictionary<string, object>() 
           { 
            { "name", "Build" }, 
            { "comment", build.Result.ToString() } 
           } 
          } 
       } 
      }; 
+0

Was die Art der Build ist? XAML oder vNext? –

+0

@ Eddie-MSFT vNext – Greaka

+0

Siehe meine Antwort für Details. –

Antwort

1

Sie könnten einen workitem hinzufügen zu einem Build, indem das Workitem aktualisiert wird, um über die Rest-API einen Relation-Link zum Build hinzuzufügen. Details finden Sie unter diesem Link: Add a Link.

Nachdem Sie dem Build im Arbeitselement einen Link hinzugefügt haben, wird das Arbeitselement in der Buildzusammenfassung angezeigt.

Es folgt der Inhalt Probe des Körpers, Codebeispiel

[ 
    { 
     "op": "test", 
     "path": "/rev", 
     "value": "2" 
    }, 
    { 
     "op": "add", 
     "path": "/relations/-", 
     "value": 
     { 
      "rel": "ArtifactLink", 
      "url": "vstfs:///Build/Build/12351" 
     } 
    } 
] 

hinzufügen:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 
using System.Net.Http; 
using System.Net.Http.Headers; 

namespace AssociateWorkItemToBuild 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (HttpClient client = new HttpClient()) 
      { 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
       client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(
        ASCIIEncoding.ASCII.GetBytes(
         string.Format("{0}:{1}", "username", "password")))); 

       string Url = "https://xxxxxx.visualstudio.com/_apis/wit/workitems/149?api-version=1.0"; 
       StringBuilder body = new StringBuilder(); 
       body.Append("["); 
       body.Append("{"); 
       body.Append("\"op\":\"add\","); 
       body.Append(" \"path\":\"/relations/-\","); 
       body.Append("\"value\":"); 
       body.Append("{"); 
       body.Append("\"rel\": \"ArtifactLink\","); 
       body.Append("\"url\": \"vstfs:///Build/Build/12596\""); 
       body.Append("}"); 
       body.Append("}"); 
       body.Append("]"); 

       var method = new HttpMethod("PATCH"); 
       var request = new HttpRequestMessage(method, Url) 
       { 
        Content = new StringContent(body.ToString(), Encoding.UTF8, 
            "application/json-patch+json") 
       }; 

       using (HttpResponseMessage response = client.SendAsync(request).Result) 
       { 
        response.EnsureSuccessStatusCode(); 
        string responseBody = response.Content.ReadAsStringAsync().Result; 
       } 
      } 
     } 
    } 
} 
+0

Ich konnte den Link in der Arbeitsaufgabe binden, aber es gibt immer noch ein kleines Problem. Ich aktualisiere meine Frage. Vielen Dank so weit! – Greaka

+0

@Greaka Mein Code für Ihre Referenz hinzugefügt. –

+0

erkennt es immer noch nicht als verknüpfter Build – Greaka

1

aktualisieren

Wie Eddie antwortete: Sie durch die Aktualisierung der workitem eine workitem zu einem Build hinzufügen könnte eine Beziehung Link zu dem Build über REST-API hinzuzufügen.

Über link hat es Antwort in Eddies eine klare Demo gewesen. Sie müssen build uri verwenden.

Das Format mussvstfs:///Build/Build/8320

Die BuildUri für die TFS Build-Aufgaben ist eine Eigenschaft sein, die eingestellt werden muss, so dass diese Aufgaben mit dem Server über den Build kommunizieren können sie Aktionen für ausführen.


Sie auch $env:BUILD_BUILDURI in einem Powershell-Skript, mehr Detailinfo und Möglichkeiten, wie Sie diesen Blog von MSDN können auch beziehen können: Build association with work Items in vNext Schließlich erhalten:

enter image description here