VSTS 构建步骤中的 Powershell Invoke-RestMethod 失败并出现错误 417
Powershell Invoke-RestMethod from VSTS build step fails with error 417
我们给自己买了一个 Lametric 时钟 (www.lametric.com) which supports displaying messages sent to it through a Web-API。我们想将它集成到我们的 CI/CD 队列中。为此我们编写了一个 Powershell 脚本,它将发送指定的通知。这脚本在本地执行时工作正常。当从(本地)VSTS 构建代理执行时,它失败并显示状态代码 417。
这是 powershell 脚本:
Param (
[Parameter(mandatory=$true)]
[string] $BuildName,
[Parameter(mandatory=$false)]
[string] $Message
)
$Payload = '{"priority":"critical","icon_type":"alert","lifeTime":2000,"model":{"frames":[{"icon":"555","text":"' + $BuildName + ' BUILD FAILED! ' + $Message + '"}],"sound":{"category":"alarms","id":"alarm6","repeat":2},"cycles":0}}'
$request = @{uri = 'http://<ip-address>:8080/api/v2/device/notifications';
Method = 'POST';
Headers = @{Authorization = 'Basic <base64-encoded-credentials>='; "Content-Type" = 'application/json' }
Body = $Payload
}
invoke-restmethod @request
有人可以为我们指出正确的方向,说明为什么我们在构建步骤中遇到此问题,而不是在本地遇到此问题吗?
更新 1:
如果我删除所有变量,它仍然失败。
更新 2:
- 将
Invoke-RestMethod
更改为 Invoke-WebRequest
没有区别。
- 调用
GET
请求有效
- 调用
POST
请求失败并出现错误 417
看来我找到了解决问题的方法。看到发送带有选项 -UseBasicParsing
的 GET
请求效果很好,我尝试一个接一个地组合这两个请求。如果它们在两个单独的构建步骤中,这不起作用。
然而,一旦我发送了一个 GET
请求并跟进了上面提到的 POST
请求,它就神奇地起作用了。我不知道为什么会这样,但这是我们当前的解决方案:
Param (
[Parameter(mandatory=$true)]
[string] $BuildName,
[Parameter(mandatory=$false)]
[string] $Message
)
$request = @{uri = 'http://<ip-address>:8080/api/v2';
Method = 'GET';
Headers = @{Authorization = 'Basic <base64-encoded-credentials>'; }
}
invoke-webrequest -UseBasicParsing @request
$Payload = '{"priority":"critical","icon_type":"alert","lifeTime":2000,"model":{"frames":[{"icon":"555","text":"' + $BuildName + ' BUILD FAILED! ' + $Message + '"}],"sound":{"category":"alarms","id":"alarm6","repeat":2},"cycles":0}}'
$request = @{uri = 'http://<ip-address>:8080/api/v2/device/notifications';
Method = 'POST';
Headers = @{Authorization = 'Basic <base64-encoded-credentials>'; "Content-Type" = 'application/json' }
Body = $Payload
}
invoke-webrequest -UseBasicParsing @request
我们给自己买了一个 Lametric 时钟 (www.lametric.com) which supports displaying messages sent to it through a Web-API。我们想将它集成到我们的 CI/CD 队列中。为此我们编写了一个 Powershell 脚本,它将发送指定的通知。这脚本在本地执行时工作正常。当从(本地)VSTS 构建代理执行时,它失败并显示状态代码 417。
这是 powershell 脚本:
Param (
[Parameter(mandatory=$true)]
[string] $BuildName,
[Parameter(mandatory=$false)]
[string] $Message
)
$Payload = '{"priority":"critical","icon_type":"alert","lifeTime":2000,"model":{"frames":[{"icon":"555","text":"' + $BuildName + ' BUILD FAILED! ' + $Message + '"}],"sound":{"category":"alarms","id":"alarm6","repeat":2},"cycles":0}}'
$request = @{uri = 'http://<ip-address>:8080/api/v2/device/notifications';
Method = 'POST';
Headers = @{Authorization = 'Basic <base64-encoded-credentials>='; "Content-Type" = 'application/json' }
Body = $Payload
}
invoke-restmethod @request
有人可以为我们指出正确的方向,说明为什么我们在构建步骤中遇到此问题,而不是在本地遇到此问题吗?
更新 1:
如果我删除所有变量,它仍然失败。
更新 2:
- 将
Invoke-RestMethod
更改为Invoke-WebRequest
没有区别。 - 调用
GET
请求有效 - 调用
POST
请求失败并出现错误 417
看来我找到了解决问题的方法。看到发送带有选项 -UseBasicParsing
的 GET
请求效果很好,我尝试一个接一个地组合这两个请求。如果它们在两个单独的构建步骤中,这不起作用。
然而,一旦我发送了一个 GET
请求并跟进了上面提到的 POST
请求,它就神奇地起作用了。我不知道为什么会这样,但这是我们当前的解决方案:
Param (
[Parameter(mandatory=$true)]
[string] $BuildName,
[Parameter(mandatory=$false)]
[string] $Message
)
$request = @{uri = 'http://<ip-address>:8080/api/v2';
Method = 'GET';
Headers = @{Authorization = 'Basic <base64-encoded-credentials>'; }
}
invoke-webrequest -UseBasicParsing @request
$Payload = '{"priority":"critical","icon_type":"alert","lifeTime":2000,"model":{"frames":[{"icon":"555","text":"' + $BuildName + ' BUILD FAILED! ' + $Message + '"}],"sound":{"category":"alarms","id":"alarm6","repeat":2},"cycles":0}}'
$request = @{uri = 'http://<ip-address>:8080/api/v2/device/notifications';
Method = 'POST';
Headers = @{Authorization = 'Basic <base64-encoded-credentials>'; "Content-Type" = 'application/json' }
Body = $Payload
}
invoke-webrequest -UseBasicParsing @request