Создание тела JSON-версии работает в Postman, но не в сценарии PowerShell

#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.