2017-01-30 23 views
0

Есть ли способ показать родительский PBI для элемента Task Work в разделе Release в списке под TFS2017?Управление выпуском TFS 2017: как отобразить родительский PBI для задач в разделе Release

На скриншоте ниже показаны две задачи, связанные с Release-3. Здесь я хочу иметь возможность отображать родительский PBI для каждого из них. Либо путем их расширения или просто показывая дополнительный столбец с ссылкой на родительский PBI enter image description here

Я ценю вашу помощь

Edit: Я знаю, что есть возможность создать запрос на TFS. Проблема в том, что мне нужно отобразить информацию о родительском элементе Work, который связан с конкретной версией, чтобы пользователь мог использовать их для отчетности. Я попытался создать запрос для этой цели, но я не смог найти параметр фильтрации на основе Release, поэтому я подумал, что возможно включить некоторые дополнительные столбцы или может быть расширение для этого, но я не мог понять, как чтобы сделать это ..

+0

Кажется, там ISN 't способ отображения родительского PBI здесь, но вы можете запросить их с помощью связанного с ним идентификатора рабочего элемента. –

+0

Да, это правда, но пользователь хочет иметь возможность запросить задачи и их родительский PBI на основе выбранного выпуска для выполнения отчетности. у вас есть идея, как это сделать? Я разместил еще одно сообщение специально для этого здесь: http://stackoverflow.com/questions/41934425/tfs-2017-release-management-how-to-display-parent-pbi-for-tasks-under-release – Sam00

+0

Вы можете попытаться достичь этого путем расширения. Шаги: 1. Получить определенный выпуск (https://www.visualstudio.com/en-us/docs/integrate/api/rm/releases#get-a-release), чтобы получить идентификатор сборки 2. Получить рабочие элементы этой сборки для каждого идентификатора сборки (https://www.visualstudio.com/en-us/docs/integrate/api/build/builds#work-items). О том, как создать расширение, вы можете обратиться к https://www.visualstudio.com/en-us/docs/integrate/extensions/develop/add-dashboard-widget –

ответ

1

шагов, чтобы добиться того, что с расширением:

  1. Получить указать релиз, чтобы построить ID
  2. Получить рабочие элементы этого построить на сборку ID
  3. Получить связанные элементы работы

Существует простой код расширения для получения элементов работы конкретного выпуска, что вы можете обратиться к:

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> 

ВСС-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

Привет, этот код по-прежнему действителен? Я могу получить список определений выпусков и последующих выпусков, но при выборе конкретного выпуска, который, как я знаю, связан с ним, я вижу только «none workitem». Я не уверен, что API сборки/рабочих элементов остается в силе. Спасибо за помощь – Soccerjoshj07

+0

Выяснил это :). "url: releaseRestAPIPrex + '/ release/релизы /'" должен быть "url: releaseRestAPIPrex + '/ релизы /'"; у нас уже есть часть «/ release» URL-адреса в префиксе. – Soccerjoshj07