首页 > 解决方案 > 如何在 Azure DevOps 中获取正在进行的管道的构建 ID

问题描述

我正在通过 API 调用从发布管道触发构建管道作为第一个任务,并且没有任何问题。

第二个任务- 管道需要等待,直到第一个任务触发的管道完成,然后转到第三个任务。我如何实现它?

我在下面的 powershell 任务中尝试从正在运行的管道中获取构建 ID,并尝试通过循环等待,但无法获取构建 ID

触发构建管道的第一个任务

curl -L -X POST 'https://dev.azure.com/Org/project/_apis/build/builds?definitionId-1549&api-version=6.1-preview.6' -H 'Authorization: $(ADO_BASIC_AUTH)' -H 'Content-Type: application/json' --data '{"definition": {"id": 1549}}'

您建议的第二个任务

   $B64Pat = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$(ADO_BASIC_AUTH)"))

$header = @{ Authorization = "Basic $B64Pat" }


$continueCurrent = $true
$uriGetActiveBuilds1 = "https://dev.azure.com/org/project/_apis/build/builds?definitions=1549&statusFilter=inProgress,notStarted&api-version=5.1"
    
do
{
    $continueCurrent = $true

    $resultStatus = Invoke-RestMethod -Uri $uriGetActiveBuilds1 -Method Get -ContentType "application/json" -Headers $header
    

    if ($resultStatus.count -gt 0)
    {
        $continueCurrent = $false
        Write-Host " . "
        Start-Sleep -s 10
    }

}while($continueCurrent -eq $false)

Write-Host "Continue task"

即使从第一个任务触发的构建管道完成,第二个也会继续等待

我的管道的输出

带有空构建 ID 的输出

标签: azure-devopsazure-pipelinesazure-devops-rest-api

解决方案


您可以使用另一种方式。在您的版本中添加一个新变量:

在此处输入图像描述

然后在脚本中使用它来定义构建 ID 并仅获取排队构建的状态。

运行构建并传递构建 ID:

$user = ""
$token = "<pat>"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

$orgUrl = "https://dev.azure.com/<org>"
$teamProject = "<team_project>"
$buildDefId = <build_definition_id>

$body = '{"definition":{"id":<dev_id>}}' -replace "<dev_id>", $buildDefId

$uriRunBuild = "$orgUrl/$teamProject/_apis/build/builds?api-version=5.1"

    
$resultQueue = Invoke-RestMethod -Uri $uriRunBuild -Method Post -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

$buildId = $resultQueue.Id

Write-Host "Build Id: $buildId"
Write-Host "##vso[task.setvariable variable=Custom.BuildId]$buildId"

然后使用构建 id 获取构建状态:

$user = ""
$token = "<pat>"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

$orgUrl = "https://dev.azure.com/<org>"
$teamProject = "<team_project>"

$uriGetBuild = "$orgUrl/$teamProject/_apis/build/builds/$(Custom.BuildId)?api-version=5.1"

$uriGetBuild

$buildStatus = ""
    
do
{
    $buildResult = Invoke-RestMethod -Uri $uriGetBuild -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

    $buildStatus = $buildResult.status

    if ($buildStatus -ne "completed")
    {
        Write-Host " . "
        Start-Sleep -s 2
    }

}while($buildStatus -ne "completed")

Write-Host "Continue task"

推荐阅读