如何在 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)?
Azure devops Server 2019中的Analytics Widget-寻找Rest api和class libraby用于Analytics Widget