为什么排队构建仅在任务取消/失败后运行?

问题描述 投票:0回答:1

我有一个在 Azure DevOps 管道中运行的 PowerShell 脚本。此脚本进行 API 调用以对构建进行排队:

$Uri = 'https://dev.azure.com/{MY ORG}/{MY PROJECT}/_apis/build/builds?api-version=5.0'
Invoke-RestMethod -Uri $Uri -ContentType "application/json" -Headers headers -Method POST -Body ($buildBody | ConvertTo-Json)

有一个循环每隔几秒进行一次 GET 调用来检查该构建的状态。直到构建成功或抛出错误,任务才会结束。

while($buildOutput.status -ne "completed")
{
    Start-Sleep -s 60
    $buildOutput = Invoke-RestMethod -Uri $url -Headers headers
    $url = $buildOutput.url
    Write-Host "Current status of build: $buildOutput.status"
}

但是,只有当运行此脚本的任务被取消或超时时,构建才会开始。我已经重复了好几次了。

有人遇到过这个问题吗?为什么排队构建会在我取消此任务后立即开始?我是否缺少某些设置?

powershell azure-devops azure-pipelines azure-devops-rest-api
1个回答
0
投票
首先,

由于您正在对当前构建的另一个构建进行排队,请确保您的组织上有enough parallel jobs,否则目标构建状态将显示为

notStarted
,因为该构建无法获得自由代理来运行。它导致循环无法完成,直到当前构建超时或取消。

其次,

您正在使用queue build

get build
rest api,
$Uri
$url
是不同的,而且,您在命令
$
中的
$headers
之前丢失了
$buildOutput = Invoke-RestMethod -Uri $url -Headers $headers
我修复了脚本(源构建)如下,它可以工作,请将构建信息替换为您的:

pool: vmImage: ubuntu-latest steps: - task: PowerShell@2 inputs: targetType: 'inline' script: | $body = ' { "definition": { "id": 603 } } ' $personalToken = "$(personalToken)" $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($personalToken)")) $header = @{authorization = "Basic $token"} $Uri = "https://dev.azure.com/{org}/{project}/_apis/build/builds?api-version=5.0" Write-Host $Uri $buildOutput = Invoke-RestMethod -Method Post -ContentType "application/json" -Uri $Uri -Body $body -Headers $header $buildid = $buildOutput.id $url = "https://dev.azure.com/{org}/{project}/_apis/build/builds/$buildid" +"?api-version=5.0" while($buildOutput.status -ne "completed") { Start-Sleep -s 10 $buildOutput = Invoke-RestMethod -Uri $url -Headers $header $status = $buildOutput.status Write-Host "Current status of build: $status" }

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.