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

时间:2018-06-29 05:12:24

标签: azure-devops azure-pipelines-release-pipeline ms-release-management

我使用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;

这有什么问题吗?

2 个答案:

答案 0 :(得分:1)

这个问题已经以不同的形式被报道过两次,并且主要与问题中的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方法。请注意,发布定义具有多层嵌套对象,定义->环境->步骤/批准等,并且默认情况下 ConvertTo-JSON仅深入两个级别以形成JSON对象您在调用VSTS API时缺少了一些重要属性。解决方法是为 -Depth 参数指定一个较大的值,以使调用服务时不会丢失任何属性。

例如 ConvertTo-Json-深度100

有关该问题及其在脚本中的解决方式的更多详细信息,请参见here

答案 1 :(得分:0)

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

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