我有一个在 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"
}
但是,只有当运行此脚本的任务被取消或超时时,构建才会开始。我已经重复了好几次了。
有人遇到过这个问题吗?为什么排队构建会在我取消此任务后立即开始?我是否缺少某些设置?
由于您正在对当前构建的另一个构建进行排队,请确保您的组织上有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"
}