Можно ли использовать ExtensionDataService из задачи сборки VSTS на основе PowerShell?

Я создал задачу сборки на основе PowerShell для Visual Studio Team Services (ранее Visual Studio Online). Я реализовал большую часть необходимой мне функциональности, но для последней части функциональности мне нужно иметь возможность сохранять небольшой объем данных между сборками.

ExtensionDataService кажется именно тем, что мне нужно (в частности, методы setValue и getValue), но документация и примеры, которые я нашел, относятся к задачам сборки на основе node.js:

    VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
    // Set a user-scoped preference
    dataService.setValue("pref1", 12345, {scopeType: "User"}).then(function(value) {
        console.log("User preference value is " + value);
    });

На предыдущей странице также есть частичный пример вызова REST API, но я получил 404 ошибки при попытке использовать его для сохранения или извлечения значений:

GET _apis/ExtensionManagement/InstalledExtensions/{publisherName}/{extensionName}/Data/Scopes/User/Me/Collections/%24settings/Documents
{
    "id": "myKey",
    "__etag": -1,
    "value": "myValue"
}

Можно ли использовать PowerShell для доступа к ExtensionDataService либо с помощью библиотеки, либо путем прямого вызова REST API?


comment
Как вы отправляете запрос REST? Через инструмент или код? Не могли бы вы установить значение, вызвав метод dataService.setValue в вашем расширении? Если это так, вы можете получить URL-адрес запроса с помощью инструмента разработчика (msdn.microsoft.com/en-us/library/dn255004(v=vs.85).aspx)   -  person starian chen-MSFT    schedule 26.12.2016
comment
Я не могу вызвать dataService.setValue из своего расширения, потому что я использую PowerShell, и инструмент разработчика сейчас бесполезен, потому что мое расширение — это просто задача сборки, в которой нет компонентов на основе браузера. Я дал URL-адрес запроса в ответ на один из ваших других комментариев.   -  person Chris    schedule 02.01.2017


Ответы (1)


Вы можете вызывать REST API через PowerShell.

Установить значение (запрос Put):

 https://[vsts name].extmgmt.visualstudio.com/_apis/ExtensionManagement/InstalledExtensions/{publisherName}/{extension id}/Data/Scopes/User/Me/Collections/%24settings/Documents?api-version=3.1-preview.1

Тело (тип содержимого: application/json)

{
  "id": "myKey",
  "__etag": -1,
  "value": "myValue"
}

Получить значение (запрос Get):

https://[vsts name].extmgmt.visualstudio.com/_apis/ExtensionManagement/InstalledExtensions/{publisherName}/{extension id}/Data/Scopes/User/Me/Collections/%24settings/Documents/mykey?api-version=3.1-preview.1

Имя издателя и идентификатор расширения можно получить в файле пакета json (например, vss-extension.json).

Относительно вызова REST API через PowerShell вы можете обратиться к этой статье: Вызов VSTS API с помощью PowerShell

Простой пример вызова REST API:

Param(
   [string]$vstsAccount = "<VSTS-ACCOUNT-NAME>",
   [string]$projectName = "<PROJECT-NAME>",
   [string]$buildNumber = "<BUILD-NUMBER>",
   [string]$keepForever = "true",
   [string]$user = "",
   [string]$token = "<PERSONAL-ACCESS-TOKEN>"
)

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

$uri = "https://$($vstsAccount).visualstudio.com/DefaultCollection/$($projectName)/_apis/build/builds?api-version=2.0&buildNumber=$($buildNumber)"

$result = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

Сценарий PowerShell для получения базового URL-адреса:

Function GetURL{
param([string]$url)
$regex=New-Object System.Text.RegularExpressions.Regex("https:\/\/(.*).visualstudio.com")
$match=$regex.Match($url)
 if($match.Success)
    {
        $vstsAccount=$match.Groups[1]
        $resultURL="https://$vstsAccount.extmgmt.visualstudio.com"
    }
}
GetURL "https://codetiger.visualstudio.com/"
person starian chen-MSFT    schedule 21.12.2016
comment
Для {publisherName} я использовал значение издателя в vss-extension.json, а для {extension id} я использовал значение id в vss-extension.json. Я получаю ответ об ошибке TF400898: An Internal Error Occurred. для обоих запросов PUT и GET к указанным вами URL-адресам. - person Chris; 21.12.2016
comment
@Chris Какой подробный URL вы использовали? Как отправить запрос? Не могли бы вы загрузить и установить расширение в VSTS? - person starian chen-MSFT; 22.12.2016
comment
Я отправлял запросы с помощью Postman, и пример URL-адреса для PUT — https://codetiger.extmgmt.visualstudio.com/_apis/ExtensionManagement/InstalledExtensions/csdahlberg/CodeTigerVersionStamper/Data/Scopes/User/Me/Collections/%24settings/Documents?api-version=3.1-preview.1. Я могу загрузить его в VSTS с помощью команды tfx build tasks upload и использовать тот код, который у меня есть. Я не понял, как упаковать расширение PowerShell в файл VSIX для загрузки на рынок, но я создам для этого новый вопрос. - person Chris; 02.01.2017
comment
@Chris Итак, вы загрузили расширение в свой VSTS, вы можете перехватывать запросы для функции dataService.setValue. msdn.microsoft.com/en-us/library /dn255004(v=vs.85).aspx - person starian chen-MSFT; 03.01.2017
comment
В одном из других моих комментариев я упомянул, что мое расширение содержит только задачу сборки PowerShell, поэтому я не могу перехватывать запросы с помощью своего браузера, потому что у меня нет ничего, что запускается в браузере. Я действительно предпочел бы не выяснять, как добавить часть пользовательского интерфейса на основе node.js в мое расширение только для того, чтобы перепроектировать что-то, что должно быть лучше задокументировано. - person Chris; 03.01.2017
comment
@Chris Вы можете сделать это в расширении другого типа, таком как веб-хаб, виджет панели инструментов. (Я изменил расширение виджета для вызова функции dataService.setValue) (visualstudio.com/en-us/docs/integrate/extensions/develop/) Получив URL-адрес API, я провел тест в Postman. - person starian chen-MSFT; 04.01.2017
comment
После исправления еще одной проблемы в моем расширении я, наконец, смог заставить запросы работать, жестко закодировав https://codetiger.extmgmt.visualstudio.com/ в качестве базового URL-адреса, но похоже, что это должно быть доступно с использованием переменных среды. Переменная SYSTEM_TEAMFOUNDATIONSERVERURI возвращает https://codetiger.visualstudio.com/, но я не могу найти ничего, что дало бы мне URL-адрес, включающий extmgmt, или только codetiger сам по себе. Вы знаете какие-нибудь, которые делают? - person Chris; 13.01.2017
comment
@Chris Вы можете использовать учетную запись vsts и снова объединить URL-адрес. Я добавил код в свой ответ, вы можете проверить его. - person starian chen-MSFT; 13.01.2017
comment
Мне не особенно нравится это решение (оно кажется хрупким и никогда не сможет работать с локальными установками TFS), но похоже, что это лучшее, что я могу сделать прямо сейчас. Спасибо за вашу помощь. - person Chris; 17.01.2017