【问题标题】:TFS2015 REST API Build definition updateTFS2015 REST API 构建定义更新
【发布时间】:2016-11-17 15:16:28
【问题描述】:

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

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

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

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

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

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

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

我正在使用 TFS2015 更新 3。

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

【问题讨论】:

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


    【解决方案1】:

    $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
    

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 2018-02-12
      • 2018-10-07
      • 2017-08-03
      • 2020-03-30
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      相关资源
      最近更新 更多