【问题标题】:Azure Devops: Agent Jumping Around Different BuildsAzure Devops:代理在不同的构建中跳跃
【发布时间】:2021-07-01 20:25:03
【问题描述】:
我注意到,每当我将阶段或作业添加到我的管道中并在队列中有多个构建时,都会发生这样的情况:image
在图片的情况下:
- 第 1 阶段为底部提交运行
- 第 1 阶段为最高提交运行
- 第 2 阶段为底部提交运行
- 第 2 阶段运行最高提交等...
作业似乎正在尝试以伪并行格式运行,但我只有 1 个构建代理。这导致构建时间超长,因为它为每个工作做一项工作,有效地使第一个工作完成的时间增加了一倍。有什么方法可以关闭它,让管道在进入下一个构建之前完全完成一个构建?
谢谢????
【问题讨论】:
标签:
azure-devops
continuous-integration
【解决方案1】:
经过测试我们发现multi-stages yaml pipeline在不同的构建中触发阶段的顺序是失控的,这就是你遇到这个问题的原因。但是,如果您使用发布管道,则有Deployment queue settings,因此您可以指定“Deploy all in sequence”。
此外,我们发现了这个thread,它提供了一种开发自定义扩展的方法,使管道在进入下一个构建之前完全完成一个构建。
顺便说一句,您可以使用 PowerShell 任务取消其他后面的 notStarted 构建,这是每个阶段的最后一步,因此后面的构建将被取消,然后当前构建可以完全完成。以下是示例PowerShell脚本,需要create a PAT with full access。
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
Write-Host "Start checking."
$url = "https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitionId}&statusFilter=inProgress,notStarted&api-version=6.0"
$connectionToken="PAT here"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
do
{
$pipelines = Invoke-RestMethod -Uri $url -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get
$count = $pipelines.count
if ($count -gt 1)
{
$lastestBuildId = $pipelines.value[-1].id
$urlCancel = "https://dev.azure.com/{organization}/{project}/_apis/build/builds/" + $lastestBuildId + "?api-version=6.0"
$body = @{status="cancelling"} | ConvertTo-Json -Compress
Write-Host $urlCancel
$result= Invoke-RestMethod -Uri $urlCancel -Body $body -ContentType "application/json" -Headers @{authorization = "Basic $base64AuthInfo"} -Method Patch #cancel the latter noStarted builds
}
} while($count -gt 1)
Write-Host "It's my turn now."
另一种解决方法是,您可以将create an environment 命名为approval-check 和define approvals and checks,然后将以下check 阶段添加为yaml 管道的第一阶段,因此必须批准新构建然后才能启动.
- stage: check
jobs:
- deployment: DeployWeb
displayName: deploy Web App
pool:
vmImage: 'Ubuntu-latest'
# creates an environment if it doesn't exist
environment: 'approval-check'
strategy:
runOnce:
deploy:
steps:
- script: echo Hello world