我们有一个内部Azure Azure DevOps Server 2019,无法从外部访问。
据我现在所看到的,我的选择是:
使用内置功能在其他构建之后触发构建:
此方法存在问题:
使用构建完整的服务挂钩
此列表中没有Azure DevOps!所以,我想这是Web Hook。现在,我不想为此维护自己的Web服务,那么将如何托管该挂钩?我们无法使用Azure函数,因为无法从外部访问Azure DevOps服务器。我可以在将服务挂钩连接到Azure Service Bus的地方做一些令人费解的事情,然后定期调度的Azure DevOps从中构建轮询。当它在队列中找到相关项目时,它将执行真正的“构建”逻辑。但这很la脚吗?
使用计划的版本来轮询其他版本
在这里,我将拥有一个定期运行(每5分钟一次?)的生成,并使用Azure DevOps REST api检查应该运行的生成。这样的构建将需要一个永久性的存储来跟踪其最近所见。 (Does Azure DevOps provide persistent storage for its builds?)。而且也很of脚。
我肯定在这里缺少明显的东西。没那么复杂。
编辑1
“排除”分支过滤器需要一个分支:
但是在那里提供什么分支?如果没有没有人删除的特殊垃圾分支,我看不到如何解决它。
编辑2
事实证明可以在分支过滤器中输入*
:
因此,我正在使用它来监视非PR验证版本。对于PR验证版本,我不包括master。但这很糟糕,因为这意味着如果我为master分支手动将PR构建排队,则不会触发我的构建。
编辑3
只需运行几个小时即可。即使在PR构建之外,所有构建之后都会触发该事件,即使我在那里具有exclude分支过滤器也是如此:
编辑4
当受监视的构建失败时,构建触发器不起作用。尽管这可能是有道理的,但不应将其硬编码到功能中。例如,即使监视的构建失败,我也需要在任何情况下触发我的构建。该功能的名称是“构建完成触发器”,而不是“构建成功触发器”。此功能的限制令人失望。
答案 0 :(得分:0)
关于您的第一个问题所有构建(包括该构建)必须都在同一TFS项目中。在有关构建完成触发器的官方文档中,添加一个构建完成触发器以在触发构建成功完成后运行您的构建。您可以选择同一项目中的任何其他构建。因此,此功能的设计如下。
关于构建完成触发器,当上游组件(例如,库)发生更改时,必须重新构建并重新验证下游依赖项。但是PR验证是受保护分支的预构建,上游没有任何变化,这就是构建完成触发器不起作用的原因。
您可以在不创建垃圾分支的情况下将“包含”更改为“排除”,然后构建完成触发器将按预期工作。
作为测试,回购中有三个分支(master,branch1,branch2),即使我按如下所示设置了混合条件,构建完成触发器也无法按预期工作。
这是因为三个分支上没有任何更改,并且不满足条件,因此构建完成触发器不起作用。
但是,当您将类型从包括更改为排除时,无论您选择什么分支,构建完成触发器都将按预期工作。
因此,我建议您将“包含”更改为“排除”,关于分支规范,您可以随意选择一个分支。作为测试,我选择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=classic#build-completion-triggers。
如果您仍然觉得此功能困扰您,也可以在Developer Community中提交建议票。
还有另一种解决方法。您可以在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)}