Обновление определения сборки 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
Другие вопросы по тегам