【发布时间】:2018-02-16 09:52:31
【问题描述】:
我们给自己买了一个 Lametric 时钟 (www.lametric.com),它支持显示通过 Web-API 发送给它的消息。我们希望将其集成到我们的 CI/CD 队列中。为此,我们编写了一个 Powershell 脚本,它将发送指定的通知。该脚本在本地执行时工作正常。从(本地)VSTS Build Agent 执行时,它会失败并返回状态码 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
【问题讨论】:
-
回到调试,我想……如果您从脚本中删除各种变量并执行最基本的脚本版本会发生什么?
-
另外,你的标题是
Invoke-WebRequest,但你的代码使用的是Invoke-RestMethod...仅供参考;-) -
@gvee 感谢您了解这一点;)
-
错误响应中有详细信息吗? 417 是期望失败,因此您可以随时尝试调整
Expect标头。但是服务器可能完全(ab)将该代码用于其他目的。 -
感谢@gvee 关于
Invoke-WebRequest与Invoke-RestMethod的初步意见。我在下面发布了我的工作解决方案。
标签: powershell azure-pipelines-build-task lametric