首页 > 解决方案 > 无论分支如何,只要一个或多个其他构建完成,Azure DevOps 中是否可以调用构建?

问题描述

我们有一个无法从外部访问的本地 Azure DevOps Server 2019。

据我现在所见,我的选择是:

使用内置功能在其他构建之后触发构建:

在此处输入图像描述

这种方法存在问题:

  1. 所有的构建,包括这个必须在同一个 TFS 项目中
  2. 我们被迫提供构建分支——如果我们想在 PR 验证构建之后触发,这是不可能的,它总是触发一个新分支。我想它可以通过创建一个垃圾分支并提供一个排除过滤器来解决。但它很蹩脚。

使用构建完成服务挂钩

在此处输入图像描述

此列表中没有 Azure DevOps!所以,我猜是Web Hook。现在,我不想为此维护我自己的 Web 服务,那么什么来托管这个钩子呢?我们不能使用 Azure Functions,因为我们的 Azure DevOps 服务器无法从外部访问。我可以做一些复杂的事情,服务钩子连接到 Azure 服务总线,然后定期安排 Azure DevOps 构建轮询。当它在队列中找到相关项目时,它将执行真正的“构建”逻辑。但这很蹩脚,现在?

使用预定的构建来轮询其他构建

在这里,我将有一个定期运行的构建(每 5 分钟一次?),并使用 Azure DevOps REST api 检查它应该运行的构建。这样的构建需要一个持久存储来跟踪它最后看到的内容。(Azure DevOps 是否为其构建提供持久存储?)。它也有点蹩脚。

我必须在这里遗漏一些明显的东西。不可能那么复杂。

编辑 1

排除分支过滤器需要一个分支:

在此处输入图像描述

但是在那里提供什么分支?如果没有没有人删除的特殊垃圾分支,我看不出如何解决它。

编辑 2

事实证明,可以*在分支过滤器中输入:

在此处输入图像描述

所以我用它来监控非 PR 验证版本。对于 PR 验证版本,我不包括 master。但这很糟糕,因为这意味着如果我手动为主分支排队 PR 构建,它不会触发我的构建。

编辑 3

让它运行几个小时。它在所有构建之后触发,除了 PR 构建,即使我在那里有排除分支过滤器:

在此处输入图像描述

编辑 4

当受监控的构建失败时,构建触发器不起作用。虽然这可能有意义,但不应将其硬编码到功能中。例如,我需要在任何情况下触发我的构建,即使受监控的构建失败。该功能的名称是构建完成触发器,而不是构建成功触发器。此功能的这种限制令人失望。

标签: azure-devopsazure-devops-rest-api

解决方案


关于你的第一个问题 所有的构建,包括这个,都必须在同一个 TFS 项目中。在有关构建完成触发器的官方文档中,添加构建完成触发器以在触发构建成功完成后运行构建。您可以选择同一项目中的任何其他构建。所以这个功能是这样设计的。

关于构建完成触发器,当上游组件(例如库)发生更改时,必须重新构建和重新验证下游依赖项。但是 PR 验证是受保护分支的预构建,上游没有变化,这就是构建完成触发器不起作用的原因。

您可以在不创建垃圾分支的情况下将 Include 更改为 Exclude,然后构建完成触发器将按预期工作。

作为我的测试,我的仓库中有三个分支。(master,branch1,branch2)即使我将confidition设置如下,构建完成触发器也无法按预期工作。 在此处输入图像描述

这是因为三个分支都没有变化,不满足条件,所以构建完成触发器不起作用。

但是,当您将类型从包含更改为排除时,无论您选择哪个分支,构建完成触发器都会按预期工作。

所以我建议你把Include改成Exclude,关于分支规范,你可以随意选择一个分支。作为我的测试,我选择了 master 分支。如您所见,管道按预期触发。 在此处输入图像描述

在此处输入图像描述

更新

以上测试结果基于 Azure DevOps。而在 Azure DevOps 中,构建完成功能可以如上所述执行。

但是,在 Azure DevOps Server 2019 中,无论如何设置,PR 验证后都不会触发此功能。所以我认为这是 Azure DevOps Server 2019 的一个功能缺陷。我建议您在开发者社区提交此错误以进一步调查。

关于你的Editor 4,官方文档中有这个特性的介绍,可以参考https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs =经典#build-completion-triggers

如果您仍然觉得此功能困扰您的使用,您也可以在开发者社区提交建议票。

还有另一种解决方法。您可以在 PR 验证构建管道中添加 Powershell 任务。并设置powershell脚本如下。此脚本将对指定的管道进行排队。

Param(
    [string]$collectionurl = "http://{instance}/{collection}",
    [string]$project = "{projectname}",
    [string]$definitionid="{definitionid}",
    [string]$user = "{username}",
    [string]$token = "PAT token"
)

#Base64-encodes the Personal Access Token(PAT) appropriately
$base64AuthInfo= [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $token)))

#Get response of the build definition
$defurl = "$collectionurl/$project/_apis/build/builds/$definitionid?api-version=5.0"

$definition = Invoke-RestMethod -Uri $defurl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

$json = @($definition.definition) | ConvertTo-Json -Depth 99
$js = "{'definition':$json}"
$defurl = "$collectionurl/$project/_apis/build/builds?api-version=5.0"

#Queue a build
$updatedef = Invoke-RestMethod -Uri $defurl -Method Post -Body $js -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

推荐阅读