Обновление определения версии приводит к ошибке VS402903: указанное значение не преобразуется в тип ReleaseDefinition

#powershell #azure-devops #azure-pipelines #azure-devops-rest-api

#powershell #azure-devops #azure-конвейеры #azure-devops-rest-api

Вопрос:

Я обновляю определения версий с помощью onpremise 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)?amp;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}
 

Есть идеи, почему возникает эта ошибка?

Ответ №1:

REST API doc:

Получите список определений выпуска.

Получите определение выпуска.

Обновите определение выпуска.

Сценарий Power 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 параметром, и проблема должна быть Invoke-RestMethod : A positional parameter cannot be found that accepts argument 'System.Collections.Hashtable'.

введите описание изображения здесь

После добавления пробела перед параметром это работает, вы можете проверить рисунок ниже.

введите описание изображения здесь

Комментарии:

1. Спасибо! Но я все еще получаю ту же ошибку даже для определений версий, которые не были обновлены

2. Привет, @doorman, я обновил свой ответ, пожалуйста, проверьте его, а затем любезно поделитесь результатом здесь. Если проблема все еще возникает, не могли бы вы поделиться скриншотом здесь? Например, как указано выше. Спасибо

3. Привет, @doorman, просто проверяю, блокирует ли вас эта проблема сейчас? Какие-либо обновления для этой проблемы?

4. Привет @VitoLiu-MSFT спасибо за вашу помощь, я все еще получал ту же ошибку, поэтому решил пока обновить ее вручную. Использование API кажется чем-то вроде взлома, и я чувствую, что это может внести неожиданные изменения в релизы. Поэтому я обновил все свои выпуски до версии 2 task group в каждой среде. Мне нравится простой способ редактирования групп задач с помощью метода черновик-> предварительный просмотр-> публикация, но в нем отсутствует поддержка публикации последней версии в нескольких выпусках. Вероятно, мы просто обновим ту же версию, пока в пользовательском интерфейсе DevOps не будет поддерживаться функция множественного обновления.

5. Привет @doorman, я нашел эту проблему, и я обновил ответ, вы можете проверить обновление, оно должно работать, пожалуйста, проверьте его, а затем любезно поделитесь результатом здесь.