首页 > 解决方案 > 如果阶段 A 或阶段 B 成功,经典管道如何部署到阶段?

问题描述

我有阶段 A、B 和 C。如果阶段 A 或阶段 B 成功,我希望部署阶段 C。但是当我对阶段 C 使用“阶段后”部署触发器时,它只允许我在阶段 A 和阶段 B 成功时触发部署。(这是一个经典的管道)有没有办法做到这一点?

我曾考虑过简单地拥有两个相同的阶段 C(一个在 A 之后,一个在 B 之后),但这很快就会导致我需要大量重复的阶段并产生技术债务。

标签: azure-devops

解决方案


如果阶段 A 或阶段 B 成功,经典管道如何部署到阶段?

直接的方法是添加两个相同的阶段C,(一个在A之后,一个在B之后)。

但如果这不是你的选择。还有一种解决方法是在阶段 B 成功时使用Update Release Environment rest api来触发阶段 C。请参见以下步骤:

1、设置C阶段仅在A阶段后自动触发。

在此处输入图像描述

2、进入你的发布编辑页面的安全页面。 在此处输入图像描述

设置管理部署允许帐户yourProjectname Build Service(Your Organization)。此权限将允许您更新发布管道中的发布环境。

在此处输入图像描述

3、进入B阶段-->在代理工作部分-->检查Allow scripts to access the OAuth token。此设置将允许您在发布管道中使用访问令牌。

在此处输入图像描述

4、经过以上准备,现在可以在B阶段的末尾添加一个脚本任务来调用release rest api。请参见以下 powershell 任务中的示例:

#Get releaseresponse
$Releaseurl= "https://vsrm.dev.azure.com/{yourOrg}/$(System.TeamProject)/_apis/Release/releases/$(Release.ReleaseId)?api-version=6.0-preview.8" 

$releaseresponse = Invoke-RestMethod -Method Get -Headers @{Authorization = "Bearer $(system.accesstoken)"} -ContentType application/json -Uri $Releaseurl

#Get the environment ID of C stage from the release response:
$id = $releaseresponse.environments |  Where-Object{$_.name -match "API-Test"} | select id

#Create the JSON body for the deployment:
$deploymentbody = @" 
{"status": "inprogress"} 
"@
#Invoke the REST method to trigger the deployment to C stage:
$DeployUrl = "https://vsrm.dev.azure.com/{yourOrg}/$(System.TeamProject)/_apis/release/releases/$(Release.ReleaseId)/environments/$($id.id)?api-version=6.0-preview.7" 

$DeployRelease = Invoke-RestMethod -Method Patch -ContentType application/json -Uri $DeployUrl -Headers @{Authorization = "Bearer $(system.accesstoken)"} -Body $deploymentbody

以上脚本首先调用get Release rest api获取C阶段的环境id。然后调用更新发布环境rest api触发部署到C。

这样上面的脚本就可以实现B阶段成功后触发C阶段。


推荐阅读