从 powershell 更新 VSTS 版本定义时出错

Error while updating VSTS release definition from powershell

我使用 VSTS API 文档 here 中列出的 API。在修改变量并保存定义时,我从服务器得到的错误是 VS402982: Retention policy is not set for the environment 'environmentName'.

执行更新的 PS 脚本部分是 -

$c = Invoke-WebRequest 'https://accountname.vsrm.visualstudio.com/projectname/_apis/release/definitions/definitionId' -Method Get -Headers @{Authorization = 'Bearer ' + $authtoken} 
$jsonObj = $c | ConvertFrom-Json
$url3 = "https://accountname.vsrm.visualstudio.com/projectname/_apis/release/definitions/definitionId?api-version=4.1-preview.3";

$contentType3 = "application/json"      
$headers3 = @{
    Authorization = 'Bearer ' + $authtoken
};

$d = $jsonObj | ConvertTo-Json;
Invoke-RestMethod -Method PUT -Uri $url3 -ContentType $contentType3 -Headers $headers3 -Body $d;

这里可能有什么问题?

此问题已以不同形式报告过几次,主要与问题中 powershell 代码的一个小问题有关。

如果您看到问题中提到的错误或此错误 - VS402903: The specified value is not convertible to type ReleaseDefinition. Make sure it is convertible to type ReleaseDefinition and try again 这意味着您要发布到服务器的 JSON 对象存在问题。最简单的问题是捕获请求负载并分析它是否存在问题。

但是问题中提到的代码中,问题出在powershell的ConvertTo-JSON方法上。请注意,发布定义具有多层嵌套对象,定义 -> 环境 -> steps/approvals 等,并且 ConvertTo-JSON 默认情况下仅深入 2 层以形成 JSON object,这意味着您在调用 VSTS API 时缺少一些重要属性。解决方法是为 -Depth 参数指定一个较大的值,这样您就不会在调用服务时错过任何属性。

例如。 ConvertTo-Json-深度 100

可以查看有关该问题的更多详细信息以及它在脚本中的修复方式here

除 divyanshm 的解决方案外,请确保编码正确:

$d = [Text.Encoding]::UTF8.GetBytes($d)