2017-01-30 96 views
0

下显示任务的父级PBI是否有任何方法在TFS2017下的列表中的发布下显示任务工作项目的父级PBI?TFS 2017发布管理:如何在版本

下面的截图显示了与Release-3相关的两项任务。在这里,我希望能够为他们每个人显示父PBI。无论是通过扩大他们或只是通过显示链接附加列于母公司PBI enter image description here

我感谢你的帮助

编辑: 我知道这有可能创造TFS上查询。问题是我需要显示与特定版本相关的父工作项的信息,以便用户可以使用它们进行报告。我试图为这个目的创建一个查询,但我找不到基于Release的过滤选项,所以我认为可以启用一些额外的列或可能有一个扩展名,但我无法弄清楚如何做到这一点..

+0

似乎有ISN在这里没有显示父级PBI的方法,但是您可以通过关联的子工作项ID来查询它们。 –

+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)以获取构建ID 2.获取构建的工作项每个版本ID(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. 获取每构建构建标识的工作项目
  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> 

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

嗨,这段代码仍然有效吗?我可以得到发布定义和后续版本的列表,但是当选择我知道的具有与其链接的工作项目的特定版本时,我只会看到:“没有任何工作项目”。我不确定构建/工作项API是否仍然有效。感谢您的帮助 – Soccerjoshj07

+0

想通了:)。 “url:releaseRestAPIPrex +'/ release/releases /'”应该是 “url:releaseRestAPIPrex +'/ releases /'”;我们已经在前缀中包含URL的“/ release”部分。 – Soccerjoshj07