Azure devops 如何在Azure DevOps中获取正在进行的管道的构建ID

Azure devops 如何在Azure DevOps中获取正在进行的管道的构建ID,azure-devops,azure-pipelines,azure-devops-rest-api,Azure Devops,Azure Pipelines,Azure Devops Rest Api,我通过API调用从发布管道触发构建管道,作为第一个任务,这没有任何问题 第二个任务-管道需要等待,直到从第一个任务触发的管道完成,然后转到第三个任务。我如何做到这一点 我在下面的powershell任务中尝试从正在运行的管道获取构建ID,并尝试通过循环等待,但无法获取构建ID 触发生成管道的第一个任务 curl -L -X POST 'https://dev.azure.com/Org/project/_apis/build/builds?definitionId-1549&api-ve

我通过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"
即使从第一个任务触发的构建管道已完成,第二个任务也会一直等待

我的管道的输出

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}}'

单向

调用
Write Host$result.latestBuild.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

$continueCurrent = $true
$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)}

Write-Host "Build Id" $resultQueue.Id
$user=“”
$token=“”
$base64AuthInfo=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((“{0}:{1}”-f$user,$token)))
$orgUrl=”https://dev.azure.com/"
$teamProject=“”
$buildDefId=
$body='{“definition”:{“id”:}}'-替换“”,$buildDefId
$continueCurrent=$true
$uriRunBuild=“$orgUrl/$teamProject/_api/build/builds?api版本=5.1”
$resultQueue=Invoke RestMethod-Uri$uriRunBuild-Method Post-ContentType“application/json”-Body$Body-Headers@{Authorization=(“基本{0}”-f$base64AuthInfo)}
写入主机“生成Id”$resultQueue.Id
第二项任务。等待某个生成定义的生成

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

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

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

$continueCurrent = $true
$uriGetActiveBuilds = "$orgUrl/$teamProject/_apis/build/builds?definitions=$buildDefId&statusFilter=inProgress,notStarted&api-version=5.1"

    
do
{
    $continueCurrent = $true

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

    #$resultStatus.value

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

}while($continueCurrent -eq $false)

Write-Host "Continue task"
$user=“”
$token=“”
$base64AuthInfo=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((“{0}:{1}”-f$user,$token)))
$orgUrl=”https://dev.azure.com/"
$teamProject=“”
$buildDefId=
$continueCurrent=$true
$uriGetActiveBuilds=“$orgUrl/$teamProject/\u api/build/builds?定义=$buildDefId&statusFilter=inProgress,notStarted&api版本=5.1”
做
{
$continueCurrent=$true
$resultStatus=Invoke RestMethod-Uri$uriGetActiveBuilds-Method Get-ContentType“application/json”-Headers@{Authorization=(“基本{0}”-f$base64AuthInfo)}
#$resultStatus.value
如果($resultStatus.count-gt 0)
{
$continueCurrent=$false
写入主机“”
开始睡眠-s2
}
}while($continueCurrent-eq$false)
写入主机“继续任务”

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

然后在脚本中使用它来定义生成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"
$user=“”
$token=“”
$base64AuthInfo=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((“{0}:{1}”-f$user,$token)))
$orgUrl=”https://dev.azure.com/"
$teamProject=“”
$buildDefId=
$body='{“definition”:{“id”:}}'-替换“”,$buildDefId
$uriRunBuild=“$orgUrl/$teamProject/_api/build/builds?api版本=5.1”
$resultQueue=Invoke RestMethod-Uri$uriRunBuild-Method Post-ContentType“application/json”-Body$Body-Headers@{Authorization=(“基本{0}”-f$base64AuthInfo)}
$buildId=$resultQueue.Id
写入主机“构建Id:$buildId”
写入主机“##vso[task.setvariable=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"
$user=“”
$token=“”
$base64AuthInfo=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((“{0}:{1}”-f$user,$token)))
$orgUrl=”https://dev.azure.com/"
$teamProject=“”
$uriGetBuild=“$orgUrl/$teamProject/\u api/build/builds/$(Custom.BuildId)?api版本=5.1”
$uriGetBuild
$buildStatus=“”
做
{
$buildResult=Invoke RestMethod-Uri$uriGetBuild-Method Get-ContentType“application/json”-Headers@{Authorization=(“基本{0}”-f$base64AuthInfo)}
$buildStatus=$buildResult.status
如果($buildStatus-ne“已完成”)
{
写入主机“”
开始睡眠-s2
}
}而($buildStatus-ne“已完成”)
写入主机“继续任务”
如何在Azure DevOps中获取正在进行的管道的构建ID

解决此请求的想法可以是:

  • 添加任务以获取生成管道的最新生成id 发布管道的第一个任务(触发构建管道)
  • 然后在第二个任务中再次获取构建管道的最新Id 在执行第一个任务之后
  • 如果与上一个相同,则表示构建 管道尚未运行。等待30秒
  • 如果ID不同,则表示新触发的生成 管道已开始运行。我们只需要确定 最新管道的状态已完成
  • 在执行第一个任务之前获取最新生成id的REST API脚本:

    $connectionToken="$(PAT)"
    $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
    
    $BuildPipelineUrl = "https://dev.azure.com/<YourOrganization>/<YourProject>/_apis/build/builds?definitions=173&`$top=1&api-version=6.0" 
    
    Write-Host "URL: $BuildPipelineUrl"
    
    $BuildPipelineInfo = (Invoke-RestMethod -Uri $BuildPipelineUrl -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}) 
    
    
    $LatestBuldId = $BuildPipelineInfo.value.id
    
    Write-Host "LatestBuldId = $LatestBuldId"
    
    Write-Host "##vso[task.setvariable variable=OldBuldPipelineId]$LatestBuldId"
    
    $connectionToken=“$(PAT)”
    $base64AuthInfo=[System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(“:$($connectionToken)”)
    $BuildPipelineUrl=”https://dev.azure.com///_apis/build/builds?definitions=173&`$top=1&api版本=6.0“
    写入主机“URL:$BuildPipelineUrl”
    $BuildPipelineInfo=(调用RestMethod-Uri$BuildPipelineUrl-Method Get-UseDefaultCredential-Headers@{Authorization=(“基本{0}”-f$base64AuthInfo)})
    $LatestBuldId=$BuildPipelineInfo.value.id
    写入主机“LatestBuldId=$LatestBuldId”
    写入主机“##vso[task.setvariable=OldBuldPipelineId]$LatestBuldId”
    
    REST API脚本用于获取最新的生成id,并在执行第二个任务后检查生成状态:

        $connectionToken = "$(PAT)"
        $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
        $success = $false
        $count = 0
    do{
        try{
        $Secondurl = "https://dev.azure.com/<YourOrganization>/<YourProject>/_apis/build/builds?definitions=173&`$top=1&api-version=6.0"
        $NewBuildPipelineInfo = Invoke-RestMethod -Method Get -ContentType application/json -Uri $Secondurl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
      
        $NewBuildPipelineId = $NewBuildPipelineInfo.value.id
    
        $NewBuildPipelinestatus = $NewBuildPipelineInfo.value.status
    
        write-output $NewBuildPipelineId | ConvertTo-Json -Depth 100
    
        write-output $NewBuildPipelinestatus | ConvertTo-Json -Depth 100
    
        
     
           if($NewBuildPipelineId -eq '$(OldBuldPipelineId)') {           
                Write-output "Wait for new piepine trigger in 30 seconds"
                Start-sleep -Seconds 30         
          } else {           
                Write-Host "New Pipeline was triggered"
                if($NewBuildPipelinestatus -ne '"completed"') {
                Write-output "wait forpipeline complete,Next attempt in 30 seconds"
                Start-sleep -Seconds 30
                }
                else{
                write-output "Pipeline complete"
                $success = $true     
                }     
          }
    
    
        }
        catch{
            Write-output "catch - Next attempt in 30 seconds"
            write-output "1"
            Start-sleep -Seconds 30
        }
       
        $count++
       
    }until($count -eq 2000 -or $success)
    if(-not($success)){exit}
    
    $connectionToken=“$(PAT)”
    $base64AuthInfo=[System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(“:$($connectionToken)”)
    $success=$false
    $count=0
    做{
    试一试{
    $Secondurl=”https://dev.azure.com///_apis/build/builds?definitions=173&`$top=1&api版本=6.0“
    $NewBuildPipelineInfo=Invoke RestMethod-Method Get-ContentType a