2017-01-30 5 views
0

Gibt es eine Möglichkeit, die Eltern PBI für ein Task Work Element unter Release in der Liste unter TFS2017 anzeigen?TFS 2017 Release Management: Wie Eltern PBI für Aufgaben unter Release anzeigen

Der folgende Screenshot zeigt zwei Aufgaben im Zusammenhang mit Release-3. Hier möchte ich die Eltern-PBI für jeden von ihnen anzeigen können. Entweder indem man sie erweitern oder einfach nur durch eine zusätzliche Spalte mit Link zu der übergeordneten Anzeige PBI enter image description here

Ich schätze Ihre Hilfe

Edit: Ich weiß, daß es eine Möglichkeit gibt, eine Abfrage auf TFS zu erstellen. Das Problem besteht darin, dass ich die Informationen zum übergeordneten Workitem anzeigen muss, die sich auf ein bestimmtes Release beziehen, damit der Benutzer sie für die Berichterstellung verwenden kann. Ich habe versucht, eine Abfrage für diesen Zweck zu erstellen, aber ich konnte keine Filteroption basierend auf Release finden, so dachte ich, dass es möglich sein könnte, einige zusätzliche Spalten zu aktivieren, oder es könnte eine Erweiterung dafür sein, aber ich konnte nicht herausfinden, wie es zu tun ..

+0

Es scheint, es isn Sie können den übergeordneten PBI hier nicht anzeigen, Sie können ihn jedoch über die zugehörige untergeordnete Arbeitselement-ID abfragen. –

+0

Ja, das stimmt, aber der Benutzer möchte in der Lage sein, die Aufgaben und deren Eltern-PBI basierend auf dem ausgewählten Release abzufragen, um das Reporting durchzuführen. Hast du eine Idee, wie es geht? Ich habe einen anderen Beitrag speziell für diesen hier gepostet: http://stackoverflow.com/questions/41934425/tfs-2017-release-management-how-to-display-parent-pbi-for-tasks-under-release – Sam00

+0

Sie können versuchen, das durch Erweiterung zu erreichen. Schritte: 1. Erhalte eine bestimmte Version (https://www.visualstudio.com/en-us/docs/integrate/api/rm/releases#get-a-release), um die Build-ID 2 zu erhalten. Nutze Work Items dieses Builds pro Build-ID (https://www.visualstudio.com/en-us/docs/integrate/api/build/builds#work-items). Informationen zum Erstellen einer Erweiterung finden Sie unter https://www.visualstudio.com/en-us/docs/integrate/extensions/develop/add-dashboard-widget –

Antwort

1

die Schritte mit der Erweiterung zu erreichen, dass:

  1. Release angeben Get bauen
  2. id erhalten sie Artikel Arbeit zu bekommen, die von
  3. id pro Build bauen
  4. Get Artikel bezogene Arbeit

Es ist einfach Code der Erweiterung Workitems bestimmter Freisetzung zu erhalten, die Sie sich beziehen können:

HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Custom widget</title> 
    <meta charset="utf-8" /> 
    <script src="node_modules/vss-web-extension-sdk/lib/VSS.SDK.js"></script> 
    <script type="text/javascript"> 
     VSS.init({ 
      explicitNotifyLoaded: true, 
      usePlatformStyles:true 
     }); 
     VSS.require(["TFS/Dashboards/WidgetHelpers", "TFS/TestManagement/RestClient", "TFS/WorkItemTracking/RestClient", "TFS/Build/RestClient", "VSS/Service", "VSS/Identities/Contracts", "VSS/Identities/RestClient", "VSS/Authentication/Services"], function (WidgetHelpers, TFS_Test_WebApi, TFS_Work_WebApi, TFS_Build_Client, VSS_Service, idContracts, idRest, VSS_Auth_Service) { 
      WidgetHelpers.IncludeWidgetStyles(); 
      VSS.register("WidgetStarain", function() { 

       var authHeader = "none"; 
       var vstsAccount = "none"; 
       var projectName = "none"; 
       var releaseRestAPIPrex = "none" 
       var getReleaseWorkItems= function (widgetSettings) { 
        var c = VSS.getWebContext(); 
        vstsAccount = c.account.name; 
        projectName = c.project.name; 
        releaseRestAPIPrex="https://" + vstsAccount + ".vsrm.visualstudio.com/DefaultCollection/" + projectName + "/_apis/release" 
        VSS.getAccessToken().then(function (token) { 

         authHeader = VSS_Auth_Service.authTokenManager.getAuthorizationHeader(token); 

         $.ajax({ 
          type: 'GET', 
          url: releaseRestAPIPrex+'/definitions?api-version=3.0-preview.1', 
          cache: false, 
          dataType: 'json', 
          beforeSend: function (xhr) { 
           xhr.setRequestHeader("Authorization", authHeader); 
          }, 
         }).done(function (data) { 
          var v = data.value; 
          $("#releaseDefList").empty(); 
          $("#releaseDefList").append('<option value="select">select</option>'); 
          $.each(v, function (index, value) { 
           $("#releaseDefList").append('<option value="' + value.id + '">' + value.name + '</option>'); 
          }); 
         }).error(function (e) { 
          var s = "ss"; 
         }); 

        }); 

       }; 
       $("#releaseDefList").change(function() { 
        var str = ""; 
        $("#releaseList").empty(); 
        $("#releaseList").append('<option value="select">select</option>'); 
        $("#releaseDefList option:selected").each(function() { 

         var releaseDefId = $(this).val(); 
         if (releaseDefId != "select") { 
          $.ajax({ 
           type: 'GET', 
           url: releaseRestAPIPrex+'/releases?definitionId=' + releaseDefId + '&api-version=3.0-preview.2', 
           cache: false, 
           dataType: 'json', 
           beforeSend: function (xhr) { 
            xhr.setRequestHeader("Authorization", authHeader); 
           }, 
          }).done(function (data) { 
           var v = data.value; 

           $.each(v, function (index, value) { 
            $("#releaseList").append('<option value="' + value.id + '">' + value.name + '</option>'); 
           }); 
          }).error(function (e) { 
           var s = "ss"; 
          }); 
         } 

        }); 


       }); 
       $("#releaseList").change(function() { 
        var str = ""; 

        $("#releaseList option:selected").each(function() { 

         var releaseId = $(this).val(); 
         if (releaseId != "select") { 
          $.ajax({ 
           type: 'GET', 
           url: releaseRestAPIPrex+'/release/releases/' + releaseId + '?api-version=3.0-preview.2',         
           cache: false, 
           dataType: 'json', 
           beforeSend: function (xhr) { 
            xhr.setRequestHeader("Authorization", authHeader); 
           }, 
          }).done(function (data) { 
           var artifacts = data.artifacts; 
           $.each(artifacts, function (index, value) { 
            var buildId = value.definitionReference.version.id; 

            TFS_Build_Client.getClient().getBuildWorkItemsRefs(projectName, buildId).then(function (workitemRefs) { 
             var workItemIds = new Array(); 
             $.each(workitemRefs, function (index, value) { 
              workItemIds.push(value.id); 
             }); 
             var workitemString = ""; 
             TFS_Work_WebApi.getClient().getWorkItems(workItemIds,null,null,"All").then(function (workitems) { 
              $.each(workitems, function (index, value) { 
               workitemString += "ID: " + value.id + "; Title: " + value.fields["System.Title"]; 
              }); 
              $("#workitems").text(workitemString); 
             }); 

            }); 
           }); 

          }).error(function (e) { 
           var s = "ss"; 
          }); 
         } 

        }); 


       }); 
       return { 
        load: function (widgetSettings) { 
         getReleaseWorkItems(widgetSettings); 
         return WidgetHelpers.WidgetStatusHelper.Success(); 
        } 
       } 
      }); 
      VSS.notifyLoadSucceeded(); 
     }); 
    </script> 
</head> 
<body> 
    <div class="widget"> 
     <h2 class="title">widgets starain</h2> 
     <div class="token">none</div> 

     <select id="releaseDefList"> 
      <option id="select">select</option> 
     </select> 
     <select id="releaseList"> 
      <option id="select">select</option> 
     </select> 
     <div id="workitems"> 
      none workitem 
     </div> 


    </div> 
</body> 
</html> 

vss-extension.json:

{ 
    "manifestVersion": 1, 
    "id": "sample-extension", 
    "version": "0.5.34", 
    "name": "My test extension", 
    "description": "my test extension description", 
    "publisher": "Starain", 
    "targets": [ 
    { 
     "id": "Microsoft.VisualStudio.Services" 
    } 
    ], 
    "icons": { 
    "default": "Images/logo.png" 
    }, 
    "scopes": [ 
    "vso.work", 
    "vso.build", 
    "vso.build_execute", 
    "vso.test", 
    "vso.test_write", 
    "vso.release" 
    ], 
    "contributions": [ 
     { 
     "id": "WidgetStarain", 
     "type": "ms.vss-dashboards-web.widget", 
     "targets": [ "ms.vss-dashboards-web.widget-catalog", "Starain.sample-extension.WidgetStarainConfiguration" ], 
     "properties": { 
     "name": "widget starain", 
     "description": "custom widget", 
     "catelogIconUrl": "Images/iconProperty.png", 
     "previewImageUrl": "Images/iconProperty.png", 
     "uri": "WidgetStarain.html", 
     "supportedSizes": [ 
      { 
      "rowSpan": 1, 
      "columnSpan": 2 
      } 
     ], 
     "supportedScopes": [ "project_team" ] 
     } 
    } 
    ], 
    "files": [ 
    { 
     "path": "node_modules/vss-web-extension-sdk/lib", 
     "addressable": true 
    }, 
    { 
     "path": "Images", 
     "addressable": true 
    }, 
    { 
     "path": "Scripts", 
     "addressable": true 
    }, 
    { 
     "path": "WidgetStarain.html", 
     "addressable": true 

    } 
    ] 
} 
+0

Hallo, ist dieser Code noch gültig? Ich kann eine Liste mit den Release-Definitionen und den folgenden Releases erhalten, aber wenn ich das bestimmte Release auswähle, mit dem Arbeitselemente verknüpft sind, sehe ich nur: "kein Workitem". Ich bin mir nicht sicher, ob die Build/Workitems-API noch gültig ist. Danke für die Hilfe – Soccerjoshj07

+0

Ich habe es herausgefunden :). "url: releaseRestAPIPrex + '/ release/releases /'" sollte sein "url: releaseRestAPIPrex + '/ releases /'"; Wir haben bereits den "/ release" -Teil der URL im Präfix. – Soccerjoshj07

Verwandte Themen