azure-devops - 无论分支如何,只要一个或多个其他构建完成,Azure DevOps 中是否可以调用构建?
问题描述
我们有一个无法从外部访问的本地 Azure DevOps Server 2019。
据我现在所见,我的选择是:
使用内置功能在其他构建之后触发构建:
这种方法存在问题:
- 所有的构建,包括这个必须在同一个 TFS 项目中
- 我们被迫提供构建分支——如果我们想在 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
当受监控的构建失败时,构建触发器不起作用。虽然这可能有意义,但不应将其硬编码到功能中。例如,我需要在任何情况下触发我的构建,即使受监控的构建失败。该功能的名称是构建完成触发器,而不是构建成功触发器。此功能的这种限制令人失望。
解决方案
关于你的第一个问题 所有的构建,包括这个,都必须在同一个 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)}
推荐阅读
- android - Android Studio 错误文本在 RecyclerView 中设置为 TextView
- r - 如何在 R 中操作庞大的数据集?
- angular - 监听由不相关组件更改的模型 - Angular 7
- php - 如何使用php将字符串添加到随机生成的数字中?
- python - 运行 pipenv 命令后出现 AttributeError
- python - PyCharm 和 Jupyter Notebook - 输出在哪里?
- ios - iOS - 更改 iCloud 容器名称
- rust - Rust mut 借用关闭失败
- json - 未处理的拒绝 (SyntaxError):从 API 获取数据时
- android - 当应用程序不断崩溃并报告未知来源的IllegalStateException时该怎么办?