Azure devops 如何在Devops/VSTS中自动启动以前的成功版本

Azure devops 如何在Devops/VSTS中自动启动以前的成功版本,azure-devops,azure-pipelines,devops,azure-devops-extensions,devops-services,Azure Devops,Azure Pipelines,Devops,Azure Devops Extensions,Devops Services,如果当前版本失败,如何自动运行上一个成功版本 例如:如果当前发布失败,则自动触发上一次成功发布。从另一个版本定义触发。实现这一点没有简单的方法,您需要使用RESTAPI 首先,您需要获得最后一次成功的部署。为此,您应该使用。 您需要在powershell中解析响应,以获取发布id和其他详细信息 一旦您从上述端点获得了详细信息,您就需要使用这些详细信息创建一个新版本。到目前为止,我还没有找到一个端点来再次运行已经创建的版本 要创建发行版,您需要调用: 下面是一个例子 { "defin

如果当前版本失败,如何自动运行上一个成功版本


例如:如果当前发布失败,则自动触发上一次成功发布。从另一个版本定义触发。

实现这一点没有简单的方法,您需要使用RESTAPI

首先,您需要获得最后一次成功的部署。为此,您应该使用。 您需要在powershell中解析响应,以获取发布id和其他详细信息

一旦您从上述端点获得了详细信息,您就需要使用这些详细信息创建一个新版本。到目前为止,我还没有找到一个端点来再次运行已经创建的版本 要创建发行版,您需要调用: 下面是一个例子

{
  "definitionId": 1,
  "description": "Creating Sample release",
  "artifacts": [
    {
      "alias": "Fabrikam.CI",
      "instanceReference": {
        "id": "2",
        "name": null
      }
    }
  ],
  "isDraft": false,
  "reason": "none",
  "manualEnvironments": null
}
您将在响应第一个端点时找到的工件的详细信息

下面是一个如何从任务调用RESTAPI的示例

$uri=https://dev.azure.com/thecodemanual/DevOps 手动/_api/build/builds/$build.BuildId/timeline?api版本=5.1 写入主机$uri 调用REST调用 $build=Invoke RestMethod-Uri$Uri-Method Get-Headers@{Authorization=Bearer$System.AccessToken}-ContentType应用程序/json $taskResult=$build.records |其中对象{$\ux.name-eq ConditionalStep}|选择对象结果 写入主机$taskResult.result
使用powershell调用api不需要如此复杂。我们的内置功能可以满足您的要求。由于发布管道由一个或多个阶段组成,重新部署发布管道可以被视为重新运行的阶段

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

见实际执行结果:

这是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

我使用了上面的powershell脚本,但$build响应显示为空,如@{count=0;value=System.Object[]}您是否更改了我的定义id definitionId=7?是更改了定义id,但未触发上次成功release@Suresh,重新运行发布管道,是不是重新运行管道中的阶段作业?@Suresh。欢迎真的希望这能解决你的难题。如果您对这种方法还有任何疑问,请随时发表评论:-如何为上次成功部署触发一个版本到另一个版本定义?@Suresh此触发版本是特定版本吗?有固定的定义id吗?是的,触发特定的定义id,但不触发上次成功发布现在,我们有两个发布定义,一个是DefiniA,另一个是DefiniB。现在,您希望在A失败后触发DefiniB的上一个成功版本,对吗?是的,正确@Merlin Liang-msfta这将非常复杂,但可以实现。还有一个问题,为什么要寻找这样复杂的方法来触发B?您有什么担心吗?第一个部署web应用程序管道、第二个web API和最后一个是DB脚本的方法。所以最后一个DB脚本失败意味着回滚Web应用程序和Web API部署中的最后一个成功版本。复制该脚本。那么web应用、web api和DB脚本部署是独立的管道定义吗?或者它们部署在一个版本定义的不同阶段?我希望为您的场景找到一种更简单的方法。
{
  "definitionId": 1,
  "description": "Creating Sample release",
  "artifacts": [
    {
      "alias": "Fabrikam.CI",
      "instanceReference": {
        "id": "2",
        "name": null
      }
    }
  ],
  "isDraft": false,
  "reason": "none",
  "manualEnvironments": null
}
$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