Azure devops 如何在部署新版本之前检查以前的版本是否已完成

Azure devops 如何在部署新版本之前检查以前的版本是否已完成,azure-devops,azure-pipelines,azure-pipelines-release-pipeline,Azure Devops,Azure Pipelines,Azure Pipelines Release Pipeline,作为发布管道的一部分,我们有一个任务(最后一个任务)将发布分支合并回主版本 我想知道在允许新版本排队之前,是否有方法检查此任务或以前的版本是否已完成。门可以用来做这个吗 理想情况下,发布管理器将能够决定是继续发布还是取消发布。您不能将调用Rest API门与Azure DevOps API url一起使用,因为要检查上次发布状态,您需要检查环境(阶段)状态,为此,您需要输入发布id(因此,您无法知道它将是什么并将其放入RESTAPI门URL中) 但是,您可以使用PowerShell检查上一个版本

作为发布管道的一部分,我们有一个任务(最后一个任务)将发布分支合并回主版本

我想知道在允许新版本排队之前,是否有方法检查此任务或以前的版本是否已完成。门可以用来做这个吗


理想情况下,发布管理器将能够决定是继续发布还是取消发布。

您不能将调用Rest API门与Azure DevOps API url一起使用,因为要检查上次发布状态,您需要检查环境(阶段)状态,为此,您需要输入发布id(因此,您无法知道它将是什么并将其放入RESTAPI门URL中)

但是,您可以使用PowerShell检查上一个版本,如果没有成功,只需使该阶段失败

在您的版本中添加PowerShell任务以检查上一版本:

$headers = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"  }

# Replace {org} with your organization
# Replace {project} with your project
# Replace {defId} with your release definition id

$url = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases?definitionId={defId}&api-version=5.1"
$releases = Invoke-RestMethod -Method Get -Uri $url -Headers $headers -ContentType 'application/json'

$releaseUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases/$($releases.value[1].id)?api-version=5.1"
$releaseInfo = Invoke-RestMethod -Method Get -Uri $releaseUrl -Headers $headers -ContentType 'application/json'

$releaseEvnriomentId =  $releaseInfo.environments.Where({ $_.name -eq 'THE STAGE NAME WHERE YOU DO MERGE' }).id

$envUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/Release/releases/$($releases.value[1].id)/environments/$($releaseEvnriomentId)?api-version=5.1-preview.1"
$environment = Invoke-RestMethod -Method Get -Uri $envUrl -Headers $headers -ContentType 'application/json'

$envStatus = $environment.status

if($envStatus -ne "succeeded")
{
    Write-Error "Previous release not succeeded!"
}
else
{
    Write-Host "Previous release succeeded :)" 
}
在代理作业选项中,您需要允许脚本访问OAuth令牌:

Azure函数还支持PowerShell,因此您也可以使用Azure函数门:

1) 使用VS代码创建一个新的Azure函数,如所述

2) 在
run.ps1
文件中,将代码替换为此代码:

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

$defnitionId = $Request.Query.DefinitionId

# Generate PAT and put it in the {YOUR PAT}
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,"{YOUR PAT}")))
$headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}

# Replace {org} with your organization
# Replace {project} with your project

$url = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases?definitionId=$($defnitionId)&api-version=5.1"
$releases = Invoke-RestMethod -Method Get -Uri $url -Headers $headers -ContentType 'application/json'
Write-Debug $releases

$releaseUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases/$($releases.value[1].id)?api-version=5.1"
$releaseInfo = Invoke-RestMethod -Method Get -Uri $releaseUrl -Headers $headers -ContentType 'application/json'
Write-Debug $releaseInfo

$releaseEvnriomentId =  $releaseInfo.environments.Where({ $_.name -eq 'THE STAGE NAME WHERE YOU DO MERGE' }).id

$envUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/Release/releases/$($releases.value[1].id)/environments/$($releaseEvnriomentId)?api-version=5.1-preview.1"
$environment = Invoke-RestMethod -Method Get -Uri $envUrl -Headers $headers -ContentType 'application/json'
Write-Debug $environment

$envStatus = $environment.status
Write-Debug $envStatus

if($envStatus -ne "succeeded")
{
    $status = [HttpStatusCode]::BadRequest
    $body = "failed"
}
else
{
    $status = [HttpStatusCode]::OK
    $body = "success"
}


# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
    Body = $body
})
3) 将函数发布到Azure

4) 在您的版本中创建Invoke Azure函数门:


另一个选项,使用上面的代码,将他转换为C#或其他语言,使用Rest API,部署到it web服务器并使用调用Rest API门。

从技术上讲,这是可能的,发布门的选项之一-调用azure函数。然后你需要编写函数来检查它,并根据结果返回ok或error。嗨,事情进展如何?下面的答案是否有助于你回答问题?如果是,您可以接受答案,这样其他用户就可以看到解决方案是否有效。如果您仍然面临一些问题,请随时在此处留言:-)