Bas*_*mme 7 azure-devops azure-pipelines
使用 Azure DevOps,如何在启动新构建时取消当前构建?
我想节省我的构建时间。在我的主分支上,有时我进行合并,然后另一位开发人员进行一次,另一位开发人员再次进行一次。我不需要逐个构建。我只能保留最新版本。所以当一个新的构建排队时,这个可以取消所有以前的构建。
是否可以设置他的构建定义来这样做?
Dav*_*A-W 11
已接受答案中的 Powershell包含一些拼写错误,并且在 2021 年末不再适用于 Azure DevOps。以下是 Azure DevOps API 6.0 版本(包括 YAML)的当前示例:
parameters:
- name: cancelPriorDeployments
displayName: Cancel prior deployments
type: boolean
default: true
variables:
cancelPriorDeployments: '${{ parameters.cancelPriorDeployments }}'
devOpsApiVersion: 6.0
stages:
- stage: CancelPriorDeploymentsStage
displayName: Cancel prior deployments
condition: eq(variables.cancelPriorDeployments, 'true')
jobs:
- job: CancelPriorDeploymentsJob
displayName: List builds, cancel prior in progress
pool:
vmImage: 'windows-latest'
steps:
- checkout: none
- task: PowerShell@2
displayName: Powershell AzDO Invoke-RestMethod
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
inputs:
targetType: inline
script: |
$header = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
$buildsUrl = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?api-version=$(devOpsApiVersion)"
Write-Host "GET $buildsUrl"
$builds = Invoke-RestMethod -Uri $buildsUrl -Method Get -Header $header
$buildsToStop = $builds.value.Where({ ($_.status -eq 'inProgress') -and ($_.definition.name -eq "$(Build.DefinitionName)") -and ($_.id -lt $(Build.BuildId)) })
ForEach($build in $buildsToStop)
{
$urlToCancel = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$($build.id)?api-version=$(devOpsApiVersion)"
$body = @{ status = "cancelling" } | ConvertTo-Json
Write-Host "PATCH $urlToCancel"
Invoke-RestMethod -Uri $urlToCancel -Method Patch -Header $header -ContentType application/json -Body $body
}
Run Code Online (Sandbox Code Playgroud)
此外,您需要授予构建用户“停止构建”权限:
TriggersSecurityGroups左侧的部分,然后从该Users部分中选择您的构建用户。Stop builds为:Not setAllow如果没有此权限,您将看到类似以下内容的错误消息:
拒绝访问。{您的项目} 构建服务({您的组织})需要团队项目 {您的项目} 中 vstfs:///Build/Build/12345 的停止构建权限才能执行该操作。
Sha*_*zyk 10
Azure DevOps 中没有这样的功能。
最接近的是使用“批处理 CI 构建”——当构建运行时,系统等待构建完成,然后将尚未构建的所有更改的另一个构建排队。
您可以在 yaml build 中启用它,在该trigger部分中添加以下内容:
batch: true
Run Code Online (Sandbox Code Playgroud)
在 calssic 编辑器中,转到“触发器”选项卡并选中“在构建过程中进行批量更改”复选框。
编辑:
您可以在构建的开头运行 PowerShell 脚本,以取消相同定义中正在运行的构建:
$header = @{ Authorization = "Bearer $env:System_AccessToken" }
$buildsUrl = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/builds/builds"
$builds = Invoke-RestMethod -Uri $url -Method Get -Header $header
$buildsToStop = $builds.value.Where({ ($.status -eq 'inProgress') -and ($_.definition.name -eq $(Build.DefinitionName)) -and ($_.id -ne $(Build.BuildId)) })
ForEach($build in $buildsToStop)
{
$build.status = "Cancelling"
$body = $build | ConvertTo-Json -Depth 10
$urlToCancel = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$(builds.id)"
Invoke-RestMethod -Uri $urlToCancel -Method Patch -ContentType application/json -Body $body -Header $header
}
Run Code Online (Sandbox Code Playgroud)
我使用 OAuth 令牌进行授权(在作业选项上启用它)和内联脚本($(varName)而不是$env:varName)。
现在,如果您有一个正在运行的构建,而其他人触发了另一个开始运行的构建,则在此步骤中,第一个构建将被取消。
| 归档时间: |
|
| 查看次数: |
2917 次 |
| 最近记录: |