TFS2015 REST API 构建定义更新
TFS2015 REST API Build definition update
我正在尝试使用 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
首先,我尝试了一个新的空定义,但出现了以下错误:
The collection must contain at least one element.Parameter name:
definition.Options.Inputs
所以我添加了一个额外的代码来从返回的 json:
中删除 "options" 部分
if($obj.options -ne $null){
$obj.options = $null }
并且更新有效。但是当我在生产中的 "real" 现有构建定义上使用代码时,我会收到另一个错误:
The collection must contain at least one element.
Parameter name: definition.RetentionRules.Rule.Branches.Filter
我正在使用 TFS2015 更新 3。
为什么不能通过 REST 对构建定义进行简单更新(不做任何修改)API?
行 $json = ConvertTo-Json $obj
需要更改以包含最小值为 3
的 -Depth
参数。默认值为 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
}
]
您会看到 branches
和 artifacts
值从字符串变为具有适当深度值的数组。
您的示例代码应该是什么
$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
我正在尝试使用 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
首先,我尝试了一个新的空定义,但出现了以下错误:
The collection must contain at least one element.Parameter name: definition.Options.Inputs
所以我添加了一个额外的代码来从返回的 json:
中删除 "options" 部分if($obj.options -ne $null){
$obj.options = $null }
并且更新有效。但是当我在生产中的 "real" 现有构建定义上使用代码时,我会收到另一个错误:
The collection must contain at least one element. Parameter name: definition.RetentionRules.Rule.Branches.Filter
我正在使用 TFS2015 更新 3。
为什么不能通过 REST 对构建定义进行简单更新(不做任何修改)API?
行 $json = ConvertTo-Json $obj
需要更改以包含最小值为 3
的 -Depth
参数。默认值为 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
}
]
您会看到 branches
和 artifacts
值从字符串变为具有适当深度值的数组。
您的示例代码应该是什么
$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