2016-07-14 58 views
2

我试图通过REST API使用PowerShell更新构建定义。TFS2015 REST API构建定义更新

使用的脚本是:

$url = "http://tfs:8080/tfs/collection/project/_apis/build/definitions/$($buildId)?api-version=2.0" 
$obj = Invoke-RestMethod -Uri $url2 -Method Get -ContentType "application/json" -UseDefaultCredentials 
$json = ConvertTo-Json $obj 
Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -UseDefaultCredentials 

我第一次与一个新的空定义试过,我已经得到了以下错误:

The collection must contain at least one element.Parameter name: definition.Options.Inputs

所以我增加了一个额外的代码删除返回的json中的“选项”部分:

if($obj.options -ne $null){ 
    $obj.options = $null } 

并且更新正常工作。但是,当我使用一个“真实”的现有构建定义是生产中的代码,然后我得到另一个错误:

The collection must contain at least one element. Parameter name: definition.RetentionRules.Rule.Branches.Filter

我使用TFS2015更新3

为什么不工作一通过REST API简单更新(没有任何修改)的构建定义?

回答

4

$json = ConvertTo-Json $obj需要更改为包含-Depth参数,最小值为3。缺省值是2,并且由于嵌套,从对象转换为Json时,这些值会丢失。更具体地说,会发生什么是值从数组转换为简单的字符串。

如何分辨这是在JSON

发生没有深度参数

"retentionRules": [ 
          { 
           "branches": "+refs/heads/*", 
           "artifacts": "build.SourceLabel", 
           "daysToKeep": 10, 
           "minimumToKeep": 1, 
           "deleteBuildRecord": true, 
           "deleteTestResults": true 
          } 
         ] 

随着深度参数

"retentionRules": [ 
          { 
           "branches": [ 
               "+refs/heads/*" 
              ], 
           "artifacts": [ 
               "build.SourceLabel" 
              ], 
           "daysToKeep": 10, 
           "minimumToKeep": 1, 
           "deleteBuildRecord": true, 
           "deleteTestResults": true 
          } 
         ] 

您将看到的branchesartifacts值的变化从字符串转换为具有适当深度值的数组。

你的示例代码应该是

$url = "http://tfs:8080/tfs/collection/project/_apis/build/definitions/$($buildId)?api-version=2.0" 
$obj = Invoke-RestMethod -Uri $url2 -Method Get -ContentType "application/json" -UseDefaultCredentials 
$json = ConvertTo-Json $obj -Depth 3 
Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -UseDefaultCredentials