3

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

最初に新しい空の定義を試してみましたが、以下のエラーが発生しました:

コレクションには少なくとも 1 つの要素が含まれている必要があります。パラメータ名: definition.Options.Inputs

そこで、返された json から「オプション」部分を削除するコードを追加しました。

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

そして更新は機能しました。しかし、本番環境にある「実際の」既存のビルド定義でコードを使用すると、別のエラーが発生します。

コレクションには、少なくとも 1 つの要素が含まれている必要があります。パラメーター名: definition.RetentionRules.Rule.Branches.Filter

TFS2015 Update 3 を使用しています。

REST API を介したビルド定義の単純な更新 (変更なし) が機能しないのはなぜですか?

4

1 に答える 1

5

行を変更して、最小値が$json = ConvertTo-Json $objの引数を含める必要があります。デフォルトは 2 で、入れ子になっているため、オブジェクトから Json に変換されると値が失われます。具体的には、値が配列から単純な文字列に変換されます。-Depth3

これが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
于 2016-07-20T18:43:34.913 に答える