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

时间:2019-07-12 10:14:56

标签: azure-devops azure-pipelines

使用Azure DevOps,如何在启动新版本时取消当前版本?

我想节省构建时间。有时,在我的master分支上进行合并,然后由另一个开发人员进行一次合并,然后由另一个开发人员再次进行一次合并。我不需要逐个构建。我只能保留最新版本。因此,当一个新的构建排队时,它可以取消所有以前的构建。

是否可以设置他的构建定义?

2 个答案:

答案 0 :(得分:0)

Azure DevOps中没有此类功能。

最接近使用“批处理CI构建”的操作-运行构建时,系统等待构建完成,然后将尚未构建的所有更改的另一个构建排队。

要在yaml构建中启用它,请将其添加到trigger部分:

batch: true

在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
}

我使用OAuth令牌进行授权(在工作选项中启用它),并使用内联脚本($(varName)而非$env:varName)。

现在,如果您有一个正在运行的构建,而其他人触发了另一个开始运行的构建,则在此步骤中,第一个构建将被取消。

答案 1 :(得分:0)

在您的特定用例(构建主分支)中,batch the jobs似乎更好。通常,您不想在中间停止master build。

我来这里是在寻找一种新提交时取消分支构建的方法。最终,我发现您可以使用PR构建,而Github webhook会自动取消它。 PR是默认的并且是自动的,因此您只需要停止建立分支机构即可。

# will not build any branch, only PRs because PR are canceled
# automatically after new commit is pushed
trigger: none