当新构建排队时,如何取消所有以前的构建?

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)

此外,您需要授予构建用户“停止构建”权限:

  1. 编辑您的构建管道

构建管道 编辑

  1. Triggers

管道触发器

  1. Security

管道安全

  1. 向下滚动经过Groups左侧的部分,然后从该Users部分中选择您的构建用户。
  2. 更改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 次

最近记录:

4 年,10 月 前