如何在 VSTS 仪表板小部件中使用 REST API 从 TFS 获取构建定义?

Posted

技术标签:

【中文标题】如何在 VSTS 仪表板小部件中使用 REST API 从 TFS 获取构建定义?【英文标题】:How to get build definitions from TFS using REST API in a VSTS dashboard widget? 【发布时间】:2016-12-28 21:07:40 【问题描述】:

我正在尝试使用仪表板小部件中 Microsoft VSTS SDK 的 REST API 在 TFS 2015 Update 3 服务器上获取所有现有构建定义:

VSS.init(                        
    explicitNotifyLoaded: true,
    usePlatformStyles: true
);

VSS.require("TFS/Dashboards/WidgetHelpers", "TFS/Build/RestClient", "VSS/Authentication/Services"],
    function (WidgetHelpers, TFS_Build_Api) 
    VSS.register("BuildStatusMonitor.Configuration", function () 

        return 
            load: function (widgetSettings, widgetConfigurationContext) 
                var buildClient = TFS_Build_Api.getClient();
                buildClient.getDefinitions().then(function(definition) 
                    //
                , function(reason) 
                    // 401
                );
            ,
        
    );
    VSS.notifyLoadSucceeded();
);

不幸的是,我总是得到一个

TFS.WebApi.Exception:TF400813:资源不可用于匿名访问。需要客户端身份验证。

我做错了什么?

当我在 chromes 开发者控制台上发送一个 get 请求时,我得到了正确的响应:=/

$.get("http://*****:8080/tfs/TestReporting/DashboardWidgets/_apis/build/definitions?api-version=2.2").success(function(res) console.log (res) )

【问题讨论】:

您是否在扩展清单中指定了范围:visualstudio.com/en-us/docs/integrate/extensions/develop/…? 好吧,这很尴尬。谢谢,Eddie,我真的忘了声明 vso.build 范围。你点燃了我的希望!虽然不幸的是添加范围并不能解决问题。我重新安装了扩展程序,但问题仍然存在。 发现我的错误。根本不允许请求 all 构建定义。调用 buildClient.getDefinitions("projectName") 效果很好。然而,非常感谢您的帮助,尤其是 Eddie 提醒我设置范围... ;) 【参考方案1】:

您可能需要启用备用凭据。见此链接:https://binary-stuff.com/post/how-to-enable-alternate-credentials-in-visual-studio-online-vso

此外,此链接对于以正确的方式设置身份验证非常有帮助:https://www.visualstudio.com/en-us/docs/integrate/get-started/auth/overview

【讨论】:

感谢您的帮助,但我正在尝试让扩展程序在自己的 TFS 服务器上工作,而不是在 VS Online 上。在 VS online 上也会出现问题,所以我认为是我的扩展本身导致了问题。我的个人访问令牌设置为“所有范围”。 =/【参考方案2】:

根据错误信息,您可能需要对 TFS REST API 进行身份验证。

VSTS和TFS有不同的认证方式,都可以通过PowerShell实现。

为了在脚本中使用 TFS 进行身份验证,您可以通过 PowerShell 将 用户名密码(掩蔽为秘密变量)传递到 PSCredential 对象并在调用 REST 方法时使用 -Credential 开关。一个例子如下:

$securePassword = $Password | ConvertTo-SecureString -AsPlainText -Force   $credential = New-Object System.Management.Automation.PSCredential($User, $securePassword)       
$releaseresponse = Invoke-RestMethod -Method Get -Credential $credential -ContentType application/json -Uri $Uri

【讨论】:

【参考方案3】:

当用户没有访问构建 rest-client 的权限时,替代方法是使用 PAT 身份验证。在使用 VSS-SDK 和 Typescript/javascript 时,您可以使用以下技术来设置 PAT 身份验证。按照here 的步骤生成的 PAT 直接粘贴到“PAT”中,没有“:”。

import service = require("VSS/Service");
import buildRestClient = require("TFS/Build/RestClient");
import  BuildHttpClient  from "TFS/Build/RestClient";
import  VssHttpClient  from "VSS/WebApi/RestClient";
import  BasicAuthTokenManager  from "VSS/Authentication/Services";

...

const buildClient: BuildHttpClient = 
                   service.getClient(buildRestClient.BuildHttpClient);
(buildClient as VssHttpClient).authTokenManager = 
                   new BasicAuthTokenManager("", "PAT");

// Subsequent calls will now use PAT authentication
const builds: Build[] = await buildClient.getBuilds(projectId);

【讨论】:

以上是关于如何在 VSTS 仪表板小部件中使用 REST API 从 TFS 获取构建定义?的主要内容,如果未能解决你的问题,请参考以下文章

如何检索在 VSTS 中触发构建时使用的构建参数(使用 REST API)?

GA 在仪表板小部件中使用 2 维

如何在 WordPress 中创建自定义可拖动小部件

如何阻止 Dashing 在视口之外更新小部件

Azure devops Server 2019中的Analytics Widget-寻找Rest api和class libraby用于Analytics Widget

如何使用flutter Dropdown小部件从Django REST API端点填充数据