#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, я нашел эту проблему, и я обновил ответ, вы можете проверить обновление, оно должно работать, пожалуйста, проверьте его, а затем любезно поделитесь результатом здесь.