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:

看来我找到了解决问题的方法。看到发送带有选项 -UseBasicParsingGET 请求效果很好,我尝试一个接一个地组合这两个请求。如果它们在两个单独的构建步骤中,这不起作用。

然而,一旦我发送了一个 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