如何在Devops / VSTS中自动启动先前成功发布的版本

时间:2020-09-24 09:30:26

标签: azure-devops azure-pipelines devops azure-devops-extensions devops-services

如果当前版本失败,以及如何自动运行先前成功的版本?

enter image description here

Ex:如果A(当前发行版)失败,则自动触发B(先前成功发行版)发行。从另一个版本定义触发。

2 个答案:

答案 0 :(得分:3)

使用powershell调用api不需要那么复杂。我们具有内置功能可以满足您的要求。由于发布管道包含一个或多个阶段,因此重新部署发布管道可以视为重新运行阶段。

因此,首先打开发布管道定义。然后导航到该阶段的部署后条件 =>启用自动重新部署触发器 =>选择事件操作< / strong>:

enter image description here

查看实际执行结果:

enter image description here

这是Azure Devops的优势,因此您不必担心在Prod部署过程中是否出了什么问题,因为该工具将自动通过其自身自动撤消上一次成功的部署。

已更新:

$connectionToken="{PAT}" 

$url="https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases?api-version=6.0"

$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
    
$Body=@"
{
  "definitionId": {specific release definition id},
  "description": "Creating release from powershell",
  "artifacts": [
    {
      "alias": "{artifact name}",
      "instanceReference": {
        "id": "{buildid}",
        "name": null
      }
    }
  ],
  "isDraft": false,
  "reason": "none",
  "manualEnvironments": null
}
"@
Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -Body $Body -ContentType application/json

答案 1 :(得分:1)

没有简单的方法可以实现此目的,您需要使用REST API。

  1. 首先,您需要获得最后成功的部署。为此,您应该使用this endpoint
GET https://vsrm.dev.azure.com/{{organization}}/{{project}}/_apis/release/deployments?definitionId=7&api-version=6.1-preview.2

您需要在powershell中解析响应以获取您的发行版ID和其他详细信息。

  1. 一旦您从上述端点获得了详细信息,就需要使用这些详细信息创建一个新版本。 (到目前为止,我还没有找到可以再次运行的端点(已创建的发行版)) 要创建发布,您需要致电this endpoint
POST https://vsrm.dev.azure.com/fabrikam/MyFirstProject/_apis/release/releases?api-version=6.0

这是一个示例身体

{
  "definitionId": 1,
  "description": "Creating Sample release",
  "artifacts": [
    {
      "alias": "Fabrikam.CI",
      "instanceReference": {
        "id": "2",
        "name": null
      }
    }
  ],
  "isDraft": false,
  "reason": "none",
  "manualEnvironments": null
}

您将在第一个端点的响应中找到工件的详细信息。

这是一个示例,您可以如何从任务中调用REST API

$uri = "https://dev.azure.com/thecodemanual/DevOps Manual/_apis/build/builds/$(Build.BuildId)/timeline?api-version=5.1"

Write-Host $uri

# Invoke the REST call
$build = Invoke-RestMethod -Uri $uri -Method Get -Headers @{Authorization = "Bearer $(System.AccessToken)"} -ContentType "application/json"

$taskResult = $build.records | Where-Object {$_.name -eq "ConditionalStep" } | Select-Object result

Write-Host $taskResult.result