Azure DevOps 自动将多个版本更新为最新发布的任务组版本

Posted

技术标签:

【中文标题】Azure DevOps 自动将多个版本更新为最新发布的任务组版本【英文标题】:Azure DevOps automatically update multiple releases to the latest published task group version 【发布时间】:2020-11-26 16:42:29 【问题描述】:

使用 Azure Devops 更新任务组的推荐方法是首先创建一个草稿并在几个版本上对其进行测试。接下来通过发布任务组,创建一个包含最新更改的新版本。 这是文档: https://docs.microsoft.com/en-us/azure/devops/pipelines/library/task-groups?view=azure-devops

由于我有超过 100 个发布管道使用同一个任务组,我想知道是否有一种方法可以自动将所有发布管道更新到任务组的最新发布版本。目前我需要通过选择任务组的最新版本来手动更新每个版本。

有没有办法在发布新版本时自动执行此操作?

【问题讨论】:

您可以使用API​​或az devops cli获取发布定义的json,搜索并替换版本并将其推回 【参考方案1】:

您可能需要使用 rest api 来更新发布管道中的任务组版本。请参阅以下步骤:

1、调用Release Definitions - Listapi获取所有版本的id。

GET https://vsrm.dev.azure.com/organization/project/_apis/release/definitions?api-version=6.0

2、调用Release Definition - Getapi获取发布定义。

GET https://vsrm.dev.azure.com/organization/project/_apis/release/definitions/definitionId?api-version=6.0

3、更新请求正文中的任务组版本并调用Release definition update api。

PUT https://vsrm.dev.azure.com/organization/project/_apis/release/definitions?api-version=6.0

在 powershell 中查看以下完整脚本: 相应地更改 Taskid 及其版本。请参阅here 以获取个人访问令牌

$listurl="https://vsrm.dev.azure.com/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://vsrm.dev.azure.com/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://vsrm.dev.azure.com/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 20)

【讨论】:

感谢详细的回答和 powershell 的实现。由于我假设更多人面临这个问题,如果在发布预览或草稿时 UI 中有一个复选框以将所有版本更新到最新版本,那将是一个不错的功能。 @doorman 如果您提交用户语音in the developer community。

以上是关于Azure DevOps 自动将多个版本更新为最新发布的任务组版本的主要内容,如果未能解决你的问题,请参考以下文章

Azure DevOps on Premise,工作区映射真的很慢

Azure DevOps On-prem 2019 无法创建继承的进程

如何使用 Azure 自动化运行手册将 Azure devops 存储库下载为 zip 文件?

更新 Azure DevOps 版本的变量组快照

如何在 Azure DevOps Pipelines 上指定 Android SDK 构建工具版本

[Azure DevOps] 编译时自动修改版本号