更新 release def 导致错误 VS402903: The specified value is not convertible to type ReleaseDefinition

Updating release def results in error VS402903: The specified value is not convertible to type ReleaseDefinition

我正在使用内部部署的 Azure DevOps API 使用以下 powershell 脚本更新发布定义:

$listurl="https://onpremdomain/{ogr}/{proj}/_apis/release/definitions?api-version=6.0"

$PAT="Personal access token"

$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($PAT)"))

#get the releases' ids.
$result = Invoke-RestMethod -Uri $listurl -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get

#loop the ids to get each release's definition
foreach($release in $result.value){
 
#get each release's definition
 $definitionurl="https://onpremdomain/{ogr}/{proj}/_apis/release/definitions/$($release.id)?&api-version=6.0"
   
  $releaseDefinition = Invoke-RestMethod -Uri $definitionurl-Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get

  #loop through each stage 
  foreach( $environment in $releaseDefinition.environments){
   
     #loop through each tasks to find the task group
     foreach($task in $environment.deployPhases.workflowTasks){
      
       # change the 'taskId'  to the taskId of your task group
        if($task.taskId -eq "{taskId}"){
           
            $task.version = "2.*"  # update the taskgroup version to the newest version
       }
     }
  }

    $updateurl="https://onpremdomain/{ogr}/{proj}/_apis/release/definitions?api-version=6.0"
   
    # update the release definition 
    Invoke-RestMethod -Uri $updateurl -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -ContentType "application/json" -Method PUT -Body (convertto-json $releaseDefinition -Depth 100)
}

当调用最后一行中的 Invoke-RestMethod 时,出现以下错误:

 Invoke-RestMethod : {"$id":"1","innerException":null,"message":"VS402903: The specified value is not convertible to type ReleaseDefinition. Make sure it is convertible to type ReleaseDefinition and 
try again.","typeName":"Microsoft.VisualStudio.Services.ReleaseManagement.Data.Exceptions.InvalidRequestException, Microsoft.VisualStudio.Services.ReleaseManagement2.Data","typeKey":"InvalidRequestE
xception","errorCode":0,"eventId":3000}

知道为什么会出现这个错误吗?

REST API 文档:

Get a list of release definitions.

Get a release definition.

Update a release definition.

电源shell脚本

$listurl="https://vsrm.dev.azure.com/{Org name}/{Project name}/_apis/release/definitions?api-version=6.0"
$PAT="{PAT}"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($PAT)"))

#get the releases' ids.
$result = Invoke-RestMethod -Uri $listurl -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get

write-host $result.value.id

#loop the ids to get each release's definition
foreach($release in $result.value){
 
#get each release's definition
$definitionurl="https://vsrm.dev.azure.com/{Org name}/{Project name}/_apis/release/definitions/$($release.id)?api-version=6.0"
#write-host $definitionurl
$releaseDefinition = Invoke-RestMethod -Uri $definitionurl -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get

  #loop through each stage 
  foreach( $environment in $releaseDefinition.environments){
   
     #loop through each tasks to find the task group
     foreach($task in $environment.deployPhases.workflowTasks){
     write-host $task.taskId 
       # change the 'taskId'  to the taskId of your task group
        if($task.taskId -eq "e213ff0f-5d5c-4791-802d-52ea3e7be1f1"){
            write-host $task.version
            $task.version = "1.*"  # update the taskgroup version to the newest version
            write-host $task.version
       }
     }
  }
    $updateurl="https://vsrm.dev.azure.com/{Org name}/{project name}/_apis/release/definitions?api-version=6.0"
   
    # update the release definition 
    Invoke-RestMethod -Uri $updateurl -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -ContentType "application/json" -Method PUT -Body (convertto-json $releaseDefinition -Depth 100)
}

更新

我发现了问题,第二个Invoke-RestMethod方法在-Headers参数之前缺少space,问题应该是Invoke-RestMethod : A positional parameter cannot be found that accepts argument 'System.Collections.Hashtable'.

在参数前加一个space就可以了,大家可以看下图