Azure DevOps:如何使用 REST API 更新发布范围的变量

Azure DevOps: how to update release scoped variables using REST API

我正在尝试使用 API.

为现有版本更新版本范围变量

问题:在 API 调用时收到异常 (PUT https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/{releaseId}?api-version=5.1-preview.8)

Invoke-RestMethod : {"$id":"1","innerException":null,"message":"You are using an old copy of release. Refresh your copy and try
again.","typeName":"Microsoft.VisualStudio.Services.ReleaseManagement.Data.Exceptions.InvalidRequestException,
Microsoft.VisualStudio.Services.ReleaseManagement2.Data","typeKey":"InvalidRequestException","errorCode":0,"eventId":3000}

重建步骤:

  1. 从现有发布定义创建发布而不触发 Web 门户上的任何阶段:https://vsrm.dev.azure.com
  2. 通过调用获取发布详细信息: GET https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/{releaseId}?api-version=5.1-preview.8
  3. 使用发布范围变量的值更新第 2 步的响应,"allowOverride" 设置为 true
  4. 将第 2 步的响应更新为 "modifiedOn" 属性 设置为比现有值晚的日期
  5. 更新第 2 步的响应,将 "definitionSnapshotRevision" 属性 设置为现有值增加 1
  6. 通过调用更新版本: PUT https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/{releaseId}?api-version=5.1-preview.8 并提供在步骤 2-5 中生成的 json
  7. 观察上述异常

我更新了 2 个版本属性(modifiedOn 和 definitionSnapshotRevision),因为我发现如果我使用网站更新版本 (https://vsrm.dev.azure.com),这些值会发生变化。看来我还缺少一些东西。我在文档中找不到有关如何正确更新发布部署的任何指导。

我使用 "Invoke-RestMethod" powershell commandlet 来获取发布元数据。我随后更新的此命令行开关 returns 自定义 ps 对象,使用 "ConvertTo-Json" 命令行开关转换为 json 并在 PUT HTTP 请求的正文中提供给 DevOps更新版本。问题是 json 的 Powershell serialization/de-serialization 进程不会导致原始 json。 例如这个 json 属性:

"preDeploymentGatesSnapshot": {
    "id": 0,
    "gatesOptions": null,
    "gates": []
},

变为:

"preDeploymentGatesSnapshot": "@{id=0; gatesOptions=; gates=System.Object[]}"

在 API 调用的 PUT 请求正文中使用正确的 json 后:

https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/{releaseId}?api-version=5.1-preview.8

版本已成功更新。