2016-07-14 9 views
2

REST APIからPowerShellを使用してビルド定義を更新しようとしています。TFS2015 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の「オプション」部分:

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

このアップデートは機能しました。私がなぜ機能していないTFS2015アップデート3.

を使用してい

The collection must contain at least one element. Parameter name: definition.RetentionRules.Rule.Branches.Filter

:私は生産である「本物の」既存のビルド定義上のコードを使用していたときにしかし、私は別のエラーが出ますREST API経由でのビルド定義の単純な更新(変更なし)?

答えて

4

$json = ConvertTo-Json $objの行には、3という最小値の-Depth引数が含まれている必要があります。デフォルトは2で、ネストされているため、オブジェクトから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 
          } 
         ] 

なければJSON

で起こっているあなたは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 
関連する問題