【发布时间】:2019-04-08 16:00:16
【问题描述】:
使用 Azure DevOps REST API 和 PowerShell,我正在尝试创建一个非常基本的发布管道。我的 JSON 正文在 Postman 中运行良好,但在 PowerShell 中使用 Invoke-RestMethod 运行时出错。
我正在关注来自https://docs.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":"值不能为空。\r\n参数名称:define.Repository","typeName":"系统.ArgumentNullException, mscorlib","typeKey":"ArgumentNullException","errorCode":0,"eventId":0} 在 C:\GitHub\landingzone\AzureDevOpsApiDev\testmule.ps1:113 char:1 + Invoke-RestMethod -Uri $uri -Method POST -ContentType "application/js ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
我们将不胜感激任何帮助或指导。
【问题讨论】:
-
我确定首先要指出的是我没有在 JSON 中指定 ID。那是对的。我试图弄清楚为什么这在 Postman 中似乎很好,但在我的 PowerShell 脚本中却没有。很奇怪。