#azure-devops-rest-api
#azure-devops-rest-api
Вопрос:
Используя Azure DevOps REST API и PowerShell, я пытаюсь создать очень простой конвейер выпуска. Мое тело JSON отлично работает в Postman, но выдает ошибки при запуске с помощью Invoke-RestMethod в PowerShell.
Я следую документации из https://learn.microsoft.com/en-us/rest/api/azure/devops/build/definitions/create?view=azure-devops-rest-5.0.
Используя Postman, я создал тело JSON, которое работает отлично и многократно (при условии, что я либо изменю имя конвейера выпуска, либо удалю ранее созданное). Я скопировал содержимое JSON дословно в свой сценарий PowerShell, установив переменную $RequestBody равной содержимому JSON. Когда я запускаю скрипт, я получаю сообщение об ошибке (содержимое ошибки см. Ниже).
Ниже приведен мой тестовый сценарий (прошу прощения за длину, но я подумал, что важно включить весь JSON.
$organization = "ORGNAME"
$token = "6-OBFUSCATED_TOKEN-a"
$project = "PROJECTNAME"
# Base64-encode the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $token)))
$uri = "https://dev.azure.com/$($organization)/$($project)/_apis/build/definitions?api-version=5.0"
$requestBody = '{
"source": "restAPI",
"revision": 1,
"description": null,
"name": "RepoName-CD",
"path": "\",
"projectReference": null,
"properties": {},
"environments": [
{
"name": "Stage 1",
"variables": {},
"variableGroups": [],
"preDeployApprovals": {
"approvals": [
{
"rank": 1,
"isAutomated": true,
"isNotificationOn": false
}
],
"approvalOptions": {
"requiredApproverCount": null,
"releaseCreatorCanBeApprover": false,
"autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
"enforceIdentityRevalidation": false,
"timeoutInMinutes": 0,
"executionOrder": "beforeGates"
}
},
"postDeployApprovals": {
"approvals": [
{
"rank": 1,
"isAutomated": true,
"isNotificationOn": false
}
],
"approvalOptions": {
"requiredApproverCount": null,
"releaseCreatorCanBeApprover": false,
"autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
"enforceIdentityRevalidation": false,
"timeoutInMinutes": 0,
"executionOrder": "afterSuccessfulGates"
}
},
"deployPhases": [
{
"deploymentInput": {
"parallelExecution": {
"parallelExecutionType": "none"
},
"skipArtifactsDownload": false,
"artifactsDownloadInput": {
"downloadInputs": []
},
"demands": [],
"enableAccessToken": false,
"timeoutInMinutes": 0,
"jobCancelTimeoutInMinutes": 1,
"condition": "succeeded()",
"overrideInputs": {}
},
"rank": 1,
"phaseType": "agentBasedDeployment",
"name": "Agent job",
"refName": null,
"workflowTasks": []
}
],
"environmentOptions": {
"emailNotificationType": "OnlyOnFailure",
"emailRecipients": "release.environment.owner;release.creator",
"skipArtifactsDownload": false,
"timeoutInMinutes": 0,
"enableAccessToken": false,
"publishDeploymentStatus": true,
"badgeEnabled": false,
"autoLinkWorkItems": false,
"pullRequestDeploymentEnabled": false
},
"executionPolicy": {
"concurrencyCount": 1,
"queueDepthCount": 0
},
"schedules": [],
"retentionPolicy": {
"daysToKeep": 30,
"releasesToKeep": 3,
"retainBuild": true
},
"processParameters": {},
"properties": {},
"environmentTriggers": []
}
]
}'
Invoke-RestMethod -Uri $uri -Method POST -ContentType "application/json" -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo) } -Body $requestBody
Когда я запускаю скрипт, я ожидал получить обратно JSON, подтверждающий, что конвейер выпуска был создан, но вместо этого я получаю следующую ошибку от PowerShell.
Invoke-RestMethod : {«$id»:»1″,»InnerException»: null,»message»:»Значение не может быть нулевым.rNpпараметрическое имя: определение.Репозиторий»,»Имя типа»:»Система.ArgumentNullException, mscorlib»,»TypeKey»:»ArgumentNullException»,»ErrorCode»: 0,»EventID»: 0} В C:GitHublandingzoneAzureDevOpsApiDevtestmule.ps1:113 символ: 1 Invoke-RestMethod -Uri $uri -Метод POST -ContentType «приложение / js … ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Информация о категории: Недопустимая операция: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException FullyQualifiedErrorId: WebCmdletWebResponseException, Microsoft.PowerShell.Команды.InvokeRestMethodCommand
Любая помощь или рекомендации будут высоко оценены.
Комментарии:
1. Я уверен, что первое, на что следует обратить внимание, это то, что у меня нет идентификатора, указанного в JSON. Это правильно. Я пытаюсь понять, почему это кажется нормальным в Postman, но не в моем сценарии PowerShell. Очень странно.
Ответ №1:
Похоже, вы создаете сообщение в API определения создания сборки. Если вы пытаетесь создать определение выпуска, вам, вероятно, потребуется опубликовать URL, подобный этому
POST https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/definitions?api-version=5.0
Ответ №2:
Что ж, урок здесь заключается в том, чтобы не копировать и не вставлять код из ранее работающего скрипта БЕЗ ЕГО ДВОЙНОЙ ПРОВЕРКИ.
Mea Culpa.