我为Azure Devops编写了一个自定义扩展,其中包含一个自定义的Connected Service和Build任务。通过管道可视设计器配置任务时,可以使用Connected Service选择服务,然后使用该服务用我的API中的数据填充选择列表。
但是,执行任务时如何使用所选服务。我需要从index.ts访问该服务。该服务会告诉我端点和API密钥。
在index.ts中,我可以使用以下代码访问服务的Guid,但可以使用Guid获取服务或其详细信息吗?
import tl = require('azure-pipelines-task-lib/task');
async function run() {
try {
const serviceString: string = tl.getInput('TestService', true);
if (serviceString == 'bad') {
tl.setResult(tl.TaskResult.Failed, 'Bad input was given');
return;
} ...
我已经进行了很多搜索和阅读(包括以下文章),但是找不到任何示例。
https://docs.microsoft.com/en-us/azure/devops/extend/develop/add-build-task?view=azure-devops
https://docs.microsoft.com/en-us/azure/devops/extend/develop/service-endpoints?view=azure-devops
答案 0 :(得分:1)
诀窍是使用 azure-pipelines-task-lib/task
中的更多函数(在您的情况下为 tl
):
如果您的自定义连接服务添加了 ms.vss-endpoint.endpoint-auth-scheme-token
类型的身份验证方案,那么令牌输入的 id
将是 apitoken
,并且您需要添加的代码看起来有些像像下面这样:
const endpoint = tl.getEndpointUrl(serviceString, true);
// The second parameter here is the name of the associated input
// value(s) of the specific authenticationSchemes type (more on that later).
const token = tl.getEndpointAuthorizationParameter(serviceString, "apitoken", false)
我怎么知道这个? Experimentation。
我目前的经验与过去的 others' 相呼应:Azure DevOps 与完全自定义的连接服务不能很好地配合。它确实附带了一些涵盖大多数基地的产品。根据您使用的是哪一个,您为 tl.getEndpointAuthorizationParameter
的第二个参数传递的值会发生变化:
附带一个标准输入:
apitoken
带有两个输入的发货:
username
password
建议优先:为了让您的代码更清晰,将您的 serviceString
变量重命名为 connectedServiceId
(或一些变体以明确表示您连接的服务的 ID) .
import tl = require('azure-pipelines-task-lib/task');
async function run() {
try {
const connectedServiceId = tl.getInput('TestService', true);
if (connectedServiceId == 'bad' || connectedServiceId == undefined) {
tl.setResult(tl.TaskResult.Failed, 'Bad input was given');
return;
}
const endpoint = tl.getEndpointUrl(connectedServiceId, true);
const token = tl.getEndpointAuthorizationParameter(connectedServiceId, "apitoken", false)
}
finally {
// Probably report some failure here, right?
}
}
此外,添加 connectedServiceId == undefined
检查允许在以后的函数调用中安全使用 connectedServiceId
。