Обновление определения сборки API REST TFS2015
Я пытаюсь обновить определение сборки через REST API с помощью PowerShell.
Используемый скрипт:
$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" из возвращенного json:
if($obj.options -ne $null){
$obj.options = $null }
и обновление сработало. Но когда я использую код в "реальном" существующем определении сборки, которое находится в производстве, я получаю другую ошибку:
Коллекция должна содержать хотя бы один элемент. Имя параметра: определение.RetentionRules.Rule.Branches.Filter
Я использую TFS2015 Update 3.
Почему не работает простое обновление (без каких-либо изменений) определения сборки через 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
}
]
Вы увидите, что 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