TFS2015 REST API构建定义更新

时间:2016-07-14 15:46:48

标签: tfs2015 tfs-sdk azure-devops-rest-api

我正在尝试使用PowerShell通过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

首先我尝试了一个新的空定义,但我得到了以下错误:

  

该集合必须至少包含一个元素。参数名称:   definition.Options.Inputs

所以我添加了一个额外的代码来从返回的json中删除“options”部分:

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

并且更新有效。但是,当我在生产中的“真实”现有构建定义上使用代码时,我得到另一个错误:

  

该集合必须至少包含一个元素。   参数名称:definition.RetentionRules.Rule.Branches.Filter

我正在使用TFS2015 Update 3.

为什么不通过REST API对构建定义进行简单的更新(不做任何修改)?

1 个答案:

答案 0 :(得分:5)

$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