如何使用自定义Azure Devops扩展index.ts中的连接服务?

时间:2019-05-29 23:40:06

标签: typescript azure tfs azure-devops azure-pipelines

我为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

1 个答案:

答案 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 的第二个参数传递的值会发生变化:

ms.vss-endpoint.endpoint-auth-scheme-token

附带一个标准输入:

  1. apitoken

ms.vss-endpoint.endpoint-auth-scheme-basic

带有两个输入的发货:

  1. username
  2. 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

我发现有用/创建的示例