2016-07-14 76 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